首页 > 其他分享 >STM32CubeMX | STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度

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

时间:2023-02-01 21:35:18浏览次数:53  
标签:DMA HAL 多通道 采集 ADC 通道


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

ADC模式介绍:

  • 扫描模式: 使用STM32CUBEMX配置了多通道后,这一项默认开启且无法设置成关闭。这个模式就是自动扫描你开启的所有通道进行转换,直至转换完,例如你开启了CH0、CH1、CH2、CH3这四个通道,启动转换后ADC会自动将这4个通道全部转换完,但是这种连续性是可以被打断的,所以就引出了间断模式。
  • 连续模式: 在CUBE中选中ENABLE就是连续模式,DISABLE就是单次模式。这个模式顾名思义,还是以CH0、CH1、CH2、CH3这四个通道为例,如果开启了连续模式那么就是一直在扫描多通道进行采集,也就是采集完这4个通道后又重新开始采集,不会停止;如果关闭了连续模式,多通道扫描4个通道各采集一次后就停止采集了不会从头再来。
  • 间断模式: 可以将多个通道进行自动分组,例如你开启了CH0~3这4个通道,假如你设置了间断次数为4,就相当于将4个通道分成了4组,每组1个通道,那么要想采集完这4个通道就需要手动触发4次ADC采集;如果设置了间断次数为2,那么采集完4个通道就需要手动触发2次ADC采集。

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

方式一:自用ADC的间断和扫描模式

我开启了通道0、1、2以及内部温度读取通道一共四个通道:

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


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


如果想使用轮训方式并且不使用DMA的多通道采集,那么就要配置为 【单次模式+间断模式】,并且将Number Of Discontinuous Conversions为1,也就是每个通道分成了一个组,配置如下图:

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

由于我这里设置间断数为1,也就是将4个通道分成了4组,那么我每次采集的时候都需要手动去触发ADC采集,也就是调用一次HAL_ADC_Start函数,完整代码如下:

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


我将通道0分别接到3.3V和GND上,4通道采集运行效果如下:

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

方式二:完全轮训

完全使用轮训的方式不能使用扫描模式,但是使用STM32CUBEMX配置多通道扫描模式不无法被关闭的,所以我们先用STM32CUBEMX配置成一个通道:

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

然后读取ADC采集数值的函数是这样:

uint16_t ADC_Read(uint32_t Channel)
{
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = Channel; /* 通道 */
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5; /* 采样时间 */
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
return (uint16_t)HAL_ADC_GetValue(&hadc1);
}

/*
uint16_t ADC_Value[5];

ADC_Value[0] = ADC_Read(ADC_CHANNEL_1); // 采集并读取通道1
ADC_Value[1] = ADC_Read(ADC_CHANNEL_4);
ADC_Value[2] = ADC_Read(ADC_CHANNEL_5);
ADC_Value[3] = ADC_Read(ADC_CHANNEL_6);
ADC_Value[4] = ADC_Read(ADC_CHANNEL_7);
*/

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

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

配置如下如:

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


开启ADC中断:

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


开启DMA:

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

代码如下:

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

4个通道采集运行效果如下:

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


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

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


上面图片是截取在STM32F103RC的datasheet中的,中文意思就是:温度传感器必须产生随温度线性变化的电压。转换范围在2v < VDDA < 3.6 V之间。温度传感器内部连接ADC1_IN16输入通道,用于将传感器输出电压转换为数字值。

内部温度计算公式:

【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℃

2021年8月24号修正:上面这个计算有误,应该是:(1.43 - 1.37)/ 0.0043 + 25 ≈ 38.95℃

感谢评论区 @Li_Gao 的提醒~!


ends…


标签:DMA,HAL,多通道,采集,ADC,通道
From: https://blog.51cto.com/u_15950551/6031866

相关文章

  • STM32CubeMX | STM32使用HAL库手动移植FreeRTOS10.4.1
    STM32CubeMX|STM32使用HAL库手动移植FreeRTOS10.4.1目录​​STM32CubeMX|STM32使用HAL库手动移植FreeRTOS10.4.1​​​​(一)裸机工程创建​​​​(二)移植FreeRTOS​​本工......
  • HAL库使用RTC设置时间显示日期不符的解决办法
      这里设置时间要注意是16进制!年月前面加上0x这里不能偷懒,每次设置的时候要先设置时间(HAL_RTC_SetTime)在设置日期(HAL_RTC_SetDate)否则可能会卡住访问也是一样的先......
  • fatal: Unable to persist credentials with the 'wincredman' credential store.
    当连接windows系统的ssh执行git操作时会出现无法使用令牌存储时可用以下命令用dpapi替代wincredmangitconfig--systemcredential.credentialStoredpapi 参考:Unab......
  • DMAIC工具
     DMAIC是六西格玛管理中流程改善的重要工具。六西格玛管理不仅是理念,同时也是一套业绩突破的方法。它将理念变为行动,将目标变为现实。DMAIC是指定义Define、测量Measure、......
  • 汇编语言 halt 命令
    汇编halt命令,是一条重复执行指定标号的循环命令。处理器暂停,直到出现中断或复位信号才继续 1/*汇编点亮一个LED灯*/23.text4.global_start56......
  • Datawhale组队学习——人工智能:一种现代方法(第四版)Task02学习笔记
    第二章智能体智能体智能体是在环境中感知和行动的事物。智能体=架构+程序一个智能体在任何给定的时刻的动作选择可能取决于内置知识和迄今为止观察到的整个感......
  • Halo博客搭建问题
    问题描述今天晚上在搭建Halo博客时,发现在服务器中是可以正常启动Jar包,并运行正常,但访问域名:8090却提示无法访问。解决办法这个问题其实之前就出现了3次(博主之前重装......
  • Datawhale组队学习——人工智能:一种现代方法(第四版)Task01学习笔记
    1.1什么是人工智能对于智能的理解:有些人将智能视为内部思维过程和推理的属性,有些人则关注智能的外部特征,也就是智能行为。emmmm,看书之前,我本以为看完之后了会收获很多......
  • STM32中HAL库和标准库的区别
    转载自:https://www.lmonkey.com/t/RwykY8bBX STM32标准库与HAL库比较ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL库、LL库三种。其中标......
  • stm32笔记[2]-HAL库驱动2.4寸屏幕
    硬件平台开发板:蓝桥CT117E-M4(DK117E-M4)主控:STM32G431RBT6内置CMSISDAP调试器(STM32F103C8T6)官方例程运行频率:80MHz原理图STM32G4主控STM32F103的CMSIS-DA......