STM32CUBEMX配置教程(十一)STM32的ADC轮询模式扫描多个通道

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读取内部温度传感器里面的解决方法)
STM32CUBEMX配置教程(十一)STM32的ADC轮询模式扫描多个通道_第1张图片
此时还需手动调整通道数为3,因为我们最初开启了三个通道,如下所示:
STM32CUBEMX配置教程(十一)STM32的ADC轮询模式扫描多个通道_第2张图片
下一步需要手动修改Rank,修改三个rank对应三个通道,也就是Channel3、Channel4、Channel5,如下所示:
STM32CUBEMX配置教程(十一)STM32的ADC轮询模式扫描多个通道_第3张图片
注意,当打开多个通道时,此处的扫描模式会自动使能:
STM32CUBEMX配置教程(十一)STM32的ADC轮询模式扫描多个通道_第4张图片
此外,当使用轮询模式时,必须打开间断转换模式,否则转换数据可能会出错!!!至于连续扫描模式在此无需开启。
STM32CUBEMX配置教程(十一)STM32的ADC轮询模式扫描多个通道_第5张图片
到此配置完成,生成工程。

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的数值。
STM32CUBEMX配置教程(十一)STM32的ADC轮询模式扫描多个通道_第6张图片
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);                               //开启ADC
	
    HAL_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

你可能感兴趣的:(stm32)