STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度

时间:2024-03-26 07:11:48

STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度

ADC模式介绍:

  • 扫描模式: 多通道采集必须开启,这一项CUBE已经默认设置好了。这个模式就是自动扫描你开启的所有通道进行转换,直至转换完。但是这种连续性是可以被打断的,所以就引出了间断模式。
  • 连续模式: 在CUBE中选中ENABLE就是连续模式,DISABLE就是单次模式。这个模式顾名思义,如果是连续模式那么就是一直在扫描多通道进行采集;如果是单次模式,多通道扫描采集一次后就停止采集了不会从头再来。
  • 间断模式: 可以将多个通道进行分组,例如你开启了IN0~4通道,那么你可以配置IN0和IN1为一组,IN2和IN3为一直进行采集。

案例一:轮训方式多通道采集

我开启了通道0、1、2以及内部温度读取通道一共四个通道:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度
如果想使用轮训方式并且不使用DMA的多通道采集,那么就要配置为 【单次模式+间断模式】,并且将Number Of Discontinuous Conversions为1,也就是每个通道分成了一个组,配置如下图:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度

代码如下:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度
我将通道0分别接到3.3V和GND上,4通道采集运行效果如下:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度


案例二:DMA实现多通道采集

通过DMA实现多通道数据采集,要将连续模式和间断模式关闭;如果连续模式开启,那么通过DMA传输到的数组中,每个通道所采集到的值对应数组中的一个位置就是不固定的,例如你开启了IN0~IN3这四个通道,ADC_Value这是个大小为4的u16类型数组,你在第一次采集的时候IN0的数值通过DMA被放在ADC_Value[0],第二次采集的时候IN0采集到的数值就被放到了ADC_Value[1],这样的话就极不方便我们对每个通道的数据进行分析和提取。

配置如下如:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度
开启ADC中断:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度
开启DMA:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度

代码如下:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度

4个通道采集运行效果如下:
STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度


补充:内部温度传感器ADC通道

内部温度计算公式:

【Temperature = {(V25 - VSENSE) / Avg_Slope} + 25】

字段说明:

  • V25: 最小1.34V,最大1.52V,典型值1.43V
  • Avg_Slope: 最小4.0,最大4.6,典型值4.3mv/℃
  • VSENSE: ADC采集到的电压

ADC值转电压值计算公式:【电压 = ADC采集到的值 * 3.3 / 4096】

看上图我采集到的值为1703,先转换为电压值:1703*3.3/4096≈1.37

转换为温度:(1.43 - 1.37)/ 4.3 + 25 ≈ 25.01℃


ends…