STM32CUBEMX配置教程(十一)STM32的ADC轮询模式扫描多个通道
基于STM32H743VI
使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我这个大萌新给广大小萌新提供一些学习帮助。
本次配置的工程链接在最下方,有需要自取。
0基础可以从第一个教程开始阅读
STM32CUBEMX配置教程(一)基础配置
STM32CUBEMX配置教程(二)时钟等内部参数配置
STM32CUBEMX配置教程(三)通用GPIO配置
STM32CUBEMX配置教程(四)定时器中断配置
STM32CUBEMX配置教程(五)高级定时器输出两路PWM波
STM32CUBEMX配置教程(六)高级定时器单通道输出互补PWM波(带死区和刹车)
STM32CUBEMX配置教程(七)定时器DMA产生占空比可调方波
STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化
STM32CUBEMX配置教程(九)STM32串口DMA收发数据
STM32CUBEMX配置教程(十)STM32的ADC读取内部温度传感器
1 新建工程
参考STM32CUBEMX配置教程(一)基础配置
2 修改时钟树
参考STM32CUBEMX配置教程(二)时钟等内部参数配置
3 ADC配置
此处以配置ADC1为例,此处在左侧选项中选中ADC,并在中间上方配置处打开ADC1的3、4、5三个ADC通道。(一般单个通道有三个选项,分别为关闭、单端模式、差分模式,此处设置单端输入即可)
注意:(如果配置时出现时钟报错参考STM32CUBEMX配置教程(十)STM32的ADC读取内部温度传感器里面的解决方法)
此时还需手动调整通道数为3,因为我们最初开启了三个通道,如下所示:
下一步需要手动修改Rank,修改三个rank对应三个通道,也就是Channel3、Channel4、Channel5,如下所示:
注意,当打开多个通道时,此处的扫描模式会自动使能:
此外,当使用轮询模式时,必须打开间断转换模式,否则转换数据可能会出错!!!至于连续扫描模式在此无需开启。
到此配置完成,生成工程。
4 代码修改与使用
1.多通道扫描方式(连续读取多个通道):
int main(void)
{SCB_EnableICache();SCB_EnableDCache();HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC校准unsigned char i;while (1){for(i=0;i<3;i++){HAL_ADC_Start(&hadc1); //启动ADC转换HAL_ADC_PollForConversion(&hadc1,10); //等待转换完成,10ms表示超时时间ADC_Value[i] = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据(16位数据)}HAL_Delay(500);}
}
此时三个通道中的数值会存入ADC_Value数组之中,其中数组的0-2个值对应ADC通道3-5的数值。
2.多通道打开,但是只读取单个通道:
上述读取方式比较麻烦,一次必须读取三个通道的数值,在此封装一个函数,可以只读取单个通道,这样的话读取时会比较灵活。
//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
unsigned short Get_Adc(ADC_HandleTypeDef *ADC_Handler,unsigned int ch)
{ADC_ChannelConfTypeDef sConfig = {0};sConfig.Channel = ADC_CHANNEL_3;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_810CYCLES_5;sConfig.SingleDiff = ADC_SINGLE_ENDED;sConfig.OffsetNumber = ADC_OFFSET_NONE;sConfig.Offset = 0;sConfig.OffsetSignedSaturation = DISABLE;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}HAL_ADC_Start(ADC_Handler); //开启ADCHAL_ADC_PollForConversion(ADC_Handler,10); //轮询转换return (unsigned short)
此时自然读取更加灵活:
int main(void)
{SCB_EnableICache();SCB_EnableDCache();HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC校准unsigned char i;while (1){ADC_Value[0]=Get_Adc(&hadc1,3);ADC_Value[1]=Get_Adc(&hadc1,4);ADC_Value[2]=Get_Adc(&hadc1,5);HAL_Delay(500);}
}
工程链接如下:
https://download.csdn.net/download/weixin_44584198/20814491