首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >STM32F103系列多通道采集ADC

STM32F103系列多通道采集ADC

作者头像
用户11186929
发布于 2024-07-01 04:28:02
发布于 2024-07-01 04:28:02
31902
代码可运行
举报
文章被收录于专栏:技术干货技术干货
运行总次数:2
代码可运行

adc.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "adc.h"

uint16_t ADC_Converted_Value[ADC_NOFCHANNEL]={0,0,0,0,0,0,0,0,0,0};

static void AdcGpioInit(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(ADC_GPIO_CLK0 | ADC_GPIO_CLK1,ENABLE);
    
    //PA0~PA7
    GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PIN0 | ADC_GPIO_PIN1 | ADC_GPIO_PIN2 | 
                                  ADC_GPIO_PIN3 | ADC_GPIO_PIN4 | ADC_GPIO_PIN5 |
                                  ADC_GPIO_PIN7 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(ADC_GPIO_PORT0,&GPIO_InitStructure);
    
    //PB0 PB1
    GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PIN8 | ADC_GPIO_PIN9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(ADC_GPIO_PORT1,&GPIO_InitStructure);
}


static void AacModeConfig(void)
{
    DMA_InitTypeDef        DMA_InitStructure;
    ADC_InitTypeDef        ADC_InitStructure;
    
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
    RCC_APB2PeriphClockCmd(ADC_CLK,ENABLE);
    //复位
    DMA_DeInit(ADC_DMA_CHANNEL);
    //配置dma
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));                //ADC数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Converted_Value;            //内部SRAM的变量
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                //数据源来自外设
    DMA_InitStructure.DMA_BufferSize = ADC_NOFCHANNEL;                                //缓冲区为10
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                //地址不递增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;                        //存储器地址固定
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;        //外设数据大小为两个字节
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                //存储数据大小为两个字节
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                    //循环传输模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                //DMA传输通道优先级最高
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                    //禁止存储器到存储器模式
    
    //初始化DMA
    DMA_Init(ADC_DMA_CHANNEL,&DMA_InitStructure);
    DMA_Cmd(ADC_DMA_CHANNEL,ENABLE);
    
    //ADC独立通道模式
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                    //扫描模式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                                //连续转换模式
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;                //软件触发开启
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                            //转换结果右对齐
    ADC_InitStructure.ADC_NbrOfChannel = ADC_NOFCHANNEL;                            //转换通道十个
    
    //初始化ADC
    ADC_Init(ADC1,&ADC_InitStructure);    
    //配置ADC时钟为 PCLK2的6分频  72/6=12MHz  ADC最大时间尽量不超过14M
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);        
    //配置ADC通道转换顺序为1,第一个转换,采样时间为239.5个时钟周期采集周期长一点越精确
    //ADC_RegularChannelConfig(ADC1,ADC_CHANNEL0,0,ADC_SampleTime_239Cycles5);//PA0
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL1,1,ADC_SampleTime_239Cycles5);//PA1
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL2,2,ADC_SampleTime_239Cycles5);//PA2
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL3,3,ADC_SampleTime_239Cycles5);//PA3
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL4,4,ADC_SampleTime_239Cycles5);//PA4
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL5,5,ADC_SampleTime_239Cycles5);//PA5
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL6,6,ADC_SampleTime_239Cycles5);//PA6
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL7,7,ADC_SampleTime_239Cycles5);//PA7
    
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL8,8,ADC_SampleTime_239Cycles5);//PB0
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL9,9,ADC_SampleTime_239Cycles5);//PB1
    
    ADC_DMACmd(ADC1,ENABLE);
    ADC_Cmd(ADC1,ENABLE);
    //校准寄存器
    ADC_ResetCalibration(ADC1);
    //等待校准寄存器初始化完成
    while(ADC_GetResetCalibrationStatus(ADC1));
    //开始校准
    ADC_StartCalibration(ADC1);
    
    while(ADC_GetCalibrationStatus(ADC1));
    //软件触发ADC转换
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    
}

void AdcInit(void)
{
    AdcGpioInit();
    AacModeConfig();
}

adc.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef _ADC_H_
#define _ADC_H_

#include "stm32f10x.h"

#define ADC_NOFCHANNEL                10
#define ADC_CLK                        RCC_APB2Periph_ADC1

#define ADC_GPIO_CLK0                RCC_APB2Periph_GPIOA
#define ADC_GPIO_PORT0                GPIOA

#define ADC_GPIO_CLK1                RCC_APB2Periph_GPIOB
#define ADC_GPIO_PORT1                GPIOB


#define ADC_DMA_CHANNEL                DMA1_Channel1
//PA0
//#define ADC_GPIO_PIN0                GPIO_Pin_0
//#define ADC_CHANNEL0                ADC_Channel_0
//PA1
#define ADC_GPIO_PIN1                GPIO_Pin_1
#define ADC_CHANNEL1                ADC_Channel_1
//PA2
#define ADC_GPIO_PIN2                GPIO_Pin_2
#define ADC_CHANNEL2                ADC_Channel_2
//PA3
#define ADC_GPIO_PIN3                GPIO_Pin_3
#define ADC_CHANNEL3                ADC_Channel_3
//PA4
#define ADC_GPIO_PIN4                GPIO_Pin_4
#define ADC_CHANNEL4                ADC_Channel_4
//PA5
#define ADC_GPIO_PIN5                GPIO_Pin_5
#define ADC_CHANNEL5                ADC_Channel_5
//PA6
#define ADC_GPIO_PIN6                GPIO_Pin_6
#define ADC_CHANNEL6                ADC_Channel_6
//PA7
#define ADC_GPIO_PIN7                GPIO_Pin_7
#define ADC_CHANNEL7                ADC_Channel_7
//PB0
#define ADC_GPIO_PIN8                GPIO_Pin_0
#define ADC_CHANNEL8                ADC_Channel_8
//PB1
#define ADC_GPIO_PIN9                GPIO_Pin_1
#define ADC_CHANNEL9                ADC_Channel_9

void AdcInit(void);

#endif

备注:PA0作为第一个采集的通道,目前遇到的情况是顺序采集到的PA0是缓冲区最后一个数据,所以暂时不使用PA0作为ADC采集io,可以使用其他通道进行采集

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使用到定时采集。定时采样有如下三种方法:
wenzid
2021/03/04
9.3K0
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
利用DMA实现采样数据的直接搬运存储
尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了。
用户6754675
2020/04/30
6330
STM32中AD采样的三种方法分析
在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式。三种方法按照处理复杂方法DMA模式处理模式效率最高,其次是中断处理模式,最差是查询模式,相信很多学者在学习AD采样程序时,很多例程采用DMA模式,在这里我针对三种程序进行分别分析。
用户6754675
2020/07/08
1.4K0
M-Arch(5)第四个示例:ADC&DMA
本文我们将总结下ADC和DMA的基本使用方法,并给出示例,从中我们可以看到GD和STM在设计上的差别。
滚神大人
2021/10/08
5970
stm32f103c8t6电压采集adc_ADC电压采样显示
刚开始学习STM32,用的是开发板是野火的指南者,这款板子网上资源很多。在学习ADC和LCD部分时,想利用手头仅有的LCD1602A进行显示电压,借助原有例程,经过不断调试后,就有如下代码(仅做交流学习)。
全栈程序员站长
2022/11/09
1.9K0
stm32_DMA采集一个AD数据_并通过DMA向串口发送
这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影。关于dma网上有许多的资料,关于dma采集ad网上也有很多。亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但
杨奉武
2018/04/18
1.1K0
stm32_DMA采集一个AD数据_并通过DMA向串口发送
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现。关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用,不会发现,复杂使用就很容易踩到了。
Simon223
2018/09/04
1.1K0
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
stm32f103波形发生器_示波器波形分析
摘要
全栈程序员站长
2022/11/04
1.8K2
基于STM32设计的数显热水器
当前介绍的项目是基于 STM32F103ZET6 系列 MCU 设计的数显热水器,通过显示屏来显示热水器的温度及其工作状态,通过 PT100 传感器来检测热水器的温度变化,并通过电加热片实现加热过程,以达到控制热水器温度的目的。
DS小龙哥
2023/08/09
3620
基于STM32设计的数显热水器
开发者成长激励计划-基于TencentOS Tiny 的物联网小车机械臂
随之物联网的发展,各类设备都能通过物联网进行控制,本次方案尝试了通过腾讯物联网平台实现设备控制设备的功能,使用了小型机械臂和小车进行测试,验证控制的物联网控制的实时性。机械臂由5个舵机实现5个自由度。小车由一个转向舵机和一个驱动电机组成。控制端采用WCH沁恒RISC-V TencentOS Tiny CH32V_EVB_AIoT RevB02开发套件负责读取电位器和姿态传感器数据并上传到云端,执行端由STM32L431RCT6控制器负责驱动电机和舵机。
海内天涯
2022/08/06
1.1K0
开发者成长激励计划-基于TencentOS Tiny 的物联网小车机械臂
基于STM32的蔬菜大棚温湿度智能控制系统设计
随着人们对健康和可持续生活方式的关注不断增加,蔬菜大棚成为了现代农业中的重要组成部分。蔬菜大棚提供了一个受控的环境,使得农民能够在任何季节种植蔬菜,并根据需要进行调节。为了实现最佳的蔬菜生长和产量,对温度和湿度等环境条件的精确控制至关重要。
DS小龙哥
2023/09/27
2K0
基于STM32的蔬菜大棚温湿度智能控制系统设计
STM32读取MQ2烟雾浓度数据判断烟雾是否超标
MQ2传感器是一种可探测多种气体的传感器,常用于监测烟雾、液化气、丙酮、乙醇、甲醛、天然气等有害气体。MQ2传感器基于半导体敏感元件,通过检测气体中有害物质的浓度变化来实现气体检测。
DS小龙哥
2023/07/08
9940
STM32读取MQ2烟雾浓度数据判断烟雾是否超标
FOC和SVPWM的C语言代码实现「建议收藏」
SVPWM的原理讲解在这儿:https://blog.csdn.net/qlexcel/article/details/74787619#comments
全栈程序员站长
2022/09/05
5.9K2
FOC和SVPWM的C语言代码实现「建议收藏」
蓝桥杯嵌入式之扩展板数码管、ADC按键讲解
蓝桥杯嵌入式扩展板有三个共阴数码管,用3个74LS595来控制。74LS595是串/并转换,在时钟信号的作用下,将串口输入的8个高低电平锁存到芯片中并并行输出。如同单片机中的LED点阵。其电路图为
用户5935416
2019/08/01
1.1K0
蓝桥杯嵌入式之扩展板数码管、ADC按键讲解
开发者成长激励计划-基于TencentOS Tiny 的加热不燃烧烟具温度检测设备
此次开发和编译坏境是沁恒微的MounRiver Studio软件,此软件用熟了感觉你keil好用太多了,并且还是免费的开发软件。具体如何好,只有真正使用来开发的各位工程师能明白,在此就不多说了。界面如下图所示:
Torry
2022/08/08
2910
开发者成长激励计划-基于TencentOS Tiny 的加热不燃烧烟具温度检测设备
基于单片机设计的家用自来水水质监测装置
本文介绍基于单片机设计的家用自来水水质监测装置。利用STM32F103ZET6作为主控芯片,结合水质传感器和ADC模块,实现对自来水水质的检测和监测功能。通过0.96寸OLED显示屏,将采集到的水质数据以直观的方式展示给用户。
DS小龙哥
2023/10/19
4190
基于单片机设计的家用自来水水质监测装置
STM32F103系列串口2中断回显
用户11186929
2024/07/01
2030
STM32F103系列串口3中断回显
用户11186929
2024/07/01
1610
STM32F103驱动GT911
// SCL——-PB10 // SDA——-PB11 // INT——–PB1 // RST——–PB2
全栈程序员站长
2022/09/07
1.9K1
STM32F103驱动GT911
STM32F103RCT6+串口DMA方式接收定长数据
知否知否应是绿肥红瘦
2025/02/19
3650
STM32F103RCT6+串口DMA方式接收定长数据
推荐阅读
相关推荐
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档