【STM32学习】标准库实现STM32ADC采集1路、2路、多路
- 人工智能
- 2025-08-29 05:45:02

目录
ADC采集
ADC配置步骤
STM32F103C8T6的ADC
输入通道
编辑
1路ADC(A4 ADC 通道4)
1路ADC源码代码链接:
2路ADC(A4 ADC 通道4、A5 ADC 通道5)基于DMA实现
多路ADC实现采集
ADC采集 ADC配置步骤 使能GPIO时钟和ADC时钟,设置引脚为模拟输入设置ADC的分频因子初始化ADC参数,包括ADC工作模式,规则序列等使能ADC并校准触发AD转换,读取AD转换值 STM32F103C8T6的ADC
根据中文参考手册介绍,STM32F103C8T6单片机有2个12位ADC,共有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
输入通道内外部共18个,16个GPIO,1个内部温感,1个内部参考电压。
1路ADC(A4 ADC 通道4)ADC初始化代码:
void Init_adc(void) { /* 1. **开启RCC时钟**:包括ADC和GPIO的时钟。 2. **配置GPIO**:将GPIO配置为模拟输入模式。 3. **配置多路开关**:将左边的通道接入到规则组或注入组中。 4. **配置ADC转换器**:设置ADC的工作模式、数据对齐方式、外部触发方式等。 5. **启动ADC和DMA**:调用相关函数使能ADC和DMA,开始数据采集和传输。 */ GPIO_InitTypeDef GPIO_InitStruct; ADC_InitTypeDef ADC_InitStruct; ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE); // 开启RCC时钟 // 配置ADC时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 6分频,72/6 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; // |GPIO_Pin_5 GPIO_Init(GPIOA,&GPIO_InitStruct);//配置GPIO ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; // 持续模式 ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // 向右对齐模式 ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不使用外部触发模式 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; // 独立ADC模式 ADC_InitStruct.ADC_NbrOfChannel = 1; // 总共两个通道 ADC_InitStruct.ADC_ScanConvMode = DISABLE; // 使用扫描模式 ADC_Init(ADC1,&ADC_InitStruct); // 选择多路通道 ,配置在规则组菜单列表的第一个位置写入通道0,55.5个周期 ADC_RegularChannelConfig(ADC1,ADC_Channel_4,1,ADC_SampleTime_55Cycles5 ); // ADC_RegularChannelConfig(ADC1,ADC_Channel_5,2,ADC_SampleTime_55Cycles5 ); // 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数) // ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 // 校准 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1) == SET); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); }获取ADC采集值+值过滤
u16 Get_ADC_Value(void) { u32 temp_val = 0; u8 t = 0; u8 times = 50; // 设置指定ADC的规则组通道,一个序列,采样时间 // ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度 ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5); for(t=0;t<times;t++) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); // 等待转换结束 temp_val+=ADC_GetConversionValue(ADC1); delay_ms(5); } return temp_val/times; }主函数代码实现片段:
adValue = Get_ADC_Value(); ad = adValue; sprintf((char*)str,"AD1 = %d ",ad); Gui_DrawFont_GBK16(0,10,RED,GRAY0, str);// 送至液晶显示效果:
1路ADC源码代码链接:STM32学习标准库实现STM32ADC采集1路、2路、多路资源-CSDN文库
2路ADC(A4 ADC 通道4、A5 ADC 通道5)基于DMA实现初始化代码:
#define N 50 //每通道采50次 #define M 2 //为2个通道 vu16 AD_Value[N][M]; //用来存放ADC转换结果,也是DMA的目标地址 vu16 After_filter[M]; //用来存放求平均值之后的结果 int i; void Init_adc(void) { /* 1. **开启RCC时钟**:包括ADC和GPIO的时钟。 2. **配置GPIO**:将GPIO配置为模拟输入模式。 3. **配置多路开关**:将左边的通道接入到规则组或注入组中。 4. **配置ADC转换器**:设置ADC的工作模式、数据对齐方式、外部触发方式等。 5. **启动ADC和DMA**:调用相关函数使能ADC和DMA,开始数据采集和传输。 */ GPIO_InitTypeDef GPIO_InitStruct; ADC_InitTypeDef ADC_InitStruct; ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE); // 开启RCC时钟 // 配置ADC时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div8); // 6分频,72/6 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; GPIO_Init(GPIOA,&GPIO_InitStruct);//配置GPIO ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; // 持续模式 ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // 向右对齐模式 ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不使用外部触发模式 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; // 独立ADC模式 ADC_InitStruct.ADC_NbrOfChannel = M; // 总共两个通道 ADC_InitStruct.ADC_ScanConvMode = ENABLE; // 使用扫描模式 ADC_Init(ADC1,&ADC_InitStruct); // 选择多路通道 ,配置在规则组菜单列表的第一个位置写入通道0,55.5个周期 ADC_RegularChannelConfig(ADC1,ADC_Channel_4,1,ADC_SampleTime_55Cycles5 ); ADC_RegularChannelConfig(ADC1,ADC_Channel_5,2,ADC_SampleTime_55Cycles5 ); // 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数) ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 // 校准 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1) == SET); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel1); //将DMA的通道1寄存器重设为缺省值 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外设ADC基地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; //DMA内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //内存作为数据传输的目的地 DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输 DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道 ADC_SoftwareStartConvCmd(ADC1, ENABLE); DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA通道 }取值滤波
/// 数值滤波 void filter(void) { int sum = 0; u8 count; for(i=0;i<M;i++) { for( count=0;count<N;count++) { sum += AD_Value[count][i]; } After_filter[i]=sum/N; sum=0; } }主函数代码:
while(1) { filter(); sprintf((char*)str,"AD1 = %d ",After_filter[0]); Gui_DrawFont_GBK16(0,10,RED,GRAY0, str); sprintf((char*)str,"AD2 = %d ",After_filter[1]); Gui_DrawFont_GBK16(0,30,RED,GRAY0, str); }实现效果:
2路ADC源码代码链接:
STM32学习标准库实现STM32ADC采集1路、2路、多路资源-CSDN文库
多路ADC实现采集多路和2路ADC一致,只需要在2路的基础上修改即可。修改的点如下:
#define M 2 //为2个通道多少通道就写多少通道。
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; GPIO_Init(GPIOA,&GPIO_InitStruct);//配置GPIO修改所选的多通道引脚。
// 选择多路通道 ,配置在规则组菜单列表的第一个位置写入通道0,55.5个周期 ADC_RegularChannelConfig(ADC1,ADC_Channel_4,1,ADC_SampleTime_55Cycles5 ); ADC_RegularChannelConfig(ADC1,ADC_Channel_5,2,ADC_SampleTime_55Cycles5 );依次增加所添加的通道。
其它不需要修改,即可完成多于2通道采集。
【STM32学习】标准库实现STM32ADC采集1路、2路、多路由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【STM32学习】标准库实现STM32ADC采集1路、2路、多路”
上一篇
day19