HAL库教程12:ADC与DMA采集多路AD值 我会带着你远行 2022-02-19 08:36 1253阅读 1赞 ## AD的基础知识 ## AD很复杂,其实也不复杂,因为我们用的不多。 AD:模拟量转换数字量(模拟信号转换数字信号)。 ADC:模拟量转数字量的转换器。 为什么需要AD呢? 自然界宏观的物理量都是连续的。而机器识别的信号0与1是离散的。为了让机器能够采集、分析、储存这些连续的量,所以要把需要被模拟的量转换为数字量。 主要的参数:采样精度与转换速度。 采样精度,也叫作分辨率。如果0-100摄氏度用8位AD来储存的话,精度计算? 0000 0000 —— 0摄氏度 1111 1111 —— 100摄氏度 100/256 = 0.39摄氏度,0.39就是最小份的分辨率,也就是采样精度.没有办法表现出0.2度 100/65536 = 0.0015,16位的AD,精度就很高了。 转换速度 从启动到出结果用的时间,一般来说越快越好。与精度不可兼得。被单位时间采样数量影响。采样多,速度不会很快。 STM32F4使用的AD是逐次逼近型ADC,它产生一系列比较电压VR,但它是逐个产生比较电压,逐次与输入电压分别比较,以逐渐逼近的方式进行模数转换的。它比并联比较型ADC的转换速度慢,比双分积型ADC要快得多,属于中速ADC器件。 ## 多通道AD采集需要使用DMA ## 在STM32的手册中,我们发现,不论是单次采集还是多次采集,转换完成的数据都会放在同一个地方。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70] 由于DR寄存器不是一个数组,而是一个字节,所以只能保存最新的转换结果。例如,通道1和通道2都使用,通道1的转换结果放在DR寄存器。通道2转换完毕以后,就会覆盖通道1的结果。 程序里,当然可以通过一些处理,让通道1的结果在被覆盖之前就保存好。不过,运用STM32的DMA功能,可以更好地解决结果被覆盖的问题。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 1] ## DMA的介绍 ## ![在这里插入图片描述][20190416093957466.png] ![在这里插入图片描述][20190416094008213.png] 重点:**用于高速搬运数据,还无需CPU干预。** 因此在多通道采集模拟量是,我们可以建立一个数组,用于储存AD转换的数据。一旦ADC\_DR寄存器里有了新的数据,就把新数据放在数组里。一会儿ADC\_DR有了一个新的数据,就放在数组下一位。数组装满以后?根据需求来。我们设置的是循环模式,也就是再来一遍,覆盖之前的数据。 ## 使用CubeMX配置DMA+多通道ADC ## 我使用的板子,有两路NTC热敏电阻分别接在PC0与PC1上,我们把这两个引脚用作ADC1的通道10与11。 ![在这里插入图片描述][20190416094022263.png] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 2] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 3] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 4] ## 启用DMA ## 新建AD.c与AD.h文件,设置全局的接收数组与计数器。 //AD.c uint32_t AD_Buf[ADC_CHANNEL_CNT]; uint32_t DMA_CNT = 0; //AD.h #define ADC_CHANNEL_CNT 2 extern uint32_t AD_Buf[ADC_CHANNEL_CNT]; extern uint32_t DMA_CNT; 在主函数中可以借助HAL库提供的HAL\_ADC\_Start\_DMA()函数,开启ADC的DMA功能,指定接收数组为AD\_Buf,并指定接收的字符数为ADC\_CHANNEL\_CNT。 DMA通常用于处理大量数据,但是目前,每秒发送两个数据,数据量很小,没有体现出DMA的特点。虽然只打印了两个数据,但是DMA到底采集了多少数据?已知DMA在AD转换完成以后“搬运”数据,所以我们可以在ADC转化完成的中断函数里做计数。 //AD.c void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { if(hadc==(&hadc1)) { DMA_CNT++; } } //main.c main() while (1) { HAL_Delay(1000); for(int i=0;i<ADC_CHANNEL_CNT;i++) printf("CH%d value = %d \n",i,AD_Buf[i]&0xFFF); printf("DMA采集数据的次数是 %d",DMA_CNT); DMA_CNT=0; } 我看到的现象是,DMA\_CNT大约是15W,每次两个数据,也就是DMA1秒钟搬运了30W个字节。可以想象,如果不是AD转换速度限制,DMA还可以更快一点. 至于采集过来的AD值到底怎么用,那就是另一个问题了。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70]: /images/20220219/49d366e8a25e4d08a878bdd21e280782.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 1]: /images/20220219/34555b50e9a743ba8eb55cec70d18fb0.png [20190416093957466.png]: /images/20220219/51b28182a107480e8cb09ee40c724ca7.png [20190416094008213.png]: /images/20220219/c1d35f941cc44e15bec35558f0740e77.png [20190416094022263.png]: /images/20220219/ae7ea56588e94c4da0d73b4024b28e56.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 2]: /images/20220219/ac8de584ec0b4ad284ed0dd64341738d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 3]: /images/20220219/c42cde49a1a24361913256c1250a19ab.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly95YXRhby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 4]: /images/20220219/8a951b9ac6654189ab725d387d741375.png
相关 STM32-ADC学习-HAL库(基础篇) 什么是ADC: Analog-to-Digital :Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 绝地灬酷狼/ 2022年12月30日 03:40/ 0 赞/ 350 阅读
相关 STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度 STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度 ADC模式介绍: 扫描模式: 使用STM32CUBEMX配置了多通道后 深碍√TFBOYSˉ_/ 2022年11月29日 11:57/ 0 赞/ 317 阅读
相关 STM32CubeMX(4)——HAL库 DMA+空闲中断 1. 序 stm32cubemxIDE配置不再说明,网上配置基本都是正确的,以下主要说明几个重要修改代码的地方。这是个新建项目,只有串口空闲中断功能,已经运行成功,保证按 妖狐艹你老母/ 2022年11月04日 05:59/ 0 赞/ 478 阅读
相关 STM32 ADC多通道转换DMA模式与非DMA模式两种方法 [STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)][STM32 ADC_DMA_DMA_HAL] [STM32 ADC_DMA_DMA_HAL]: 待我称王封你为后i/ 2022年11月01日 10:58/ 0 赞/ 263 阅读
相关 MCU_STM32F4XX_HAL_ADC_Start_DMA只能触发一次的问题 说明:这可能是STM32F4XX芯片的一个BUG。有些时候,单片机的问题非常奇怪,单一功能使用的时候没有问题,但同样的代码,在大型工程中漏洞百出;作为用户,我们无法知道芯片内部 心已赠人/ 2022年10月10日 12:42/ 0 赞/ 272 阅读
相关 ADC电流采集 1.电流的采集与ADC采集电压方式一样,需要先用硬件将电流信号转换成电压信号,然用ADC采集电压 a.ADC初始化 b.将ADC采集到的电压信号换算成电流信号 深碍√TFBOYSˉ_/ 2022年10月03日 00:43/ 0 赞/ 183 阅读
相关 stm32 ADC模数转换 ADC多通道 ADC DMA ![1][] ![2][] 通过调节电位器,改变AD转换值和电压值 STM32F1 ADC 配置步骤 > 1.使能GPIO时钟和ADC时钟 > 2.配置引脚模式为模 缺乏、安全感/ 2022年06月10日 07:50/ 0 赞/ 362 阅读
相关 HAL库教程4:外部中断 外部中断机制 本章我们仍然是通过按键来控制LED,只不过实现方式由轮询变为了外部中断。为什么需要外部中断?为了给CPU减轻负担。 举个例子 比如你今天 素颜马尾好姑娘i/ 2022年04月23日 23:22/ 0 赞/ 616 阅读
相关 HAL库教程13:AD+DMA采集数据的滤波 借助DMA可以快速采集大量数据,如果数据采集过来却不使用就是浪费。在我的板子上,AD值代表温度,如果系统检测到温度过高,可能会采取一些强制的保护措施。而AD采样是容易受干扰 雨点打透心脏的1/2处/ 2022年02月19日 08:45/ 0 赞/ 613 阅读
相关 HAL库教程12:ADC与DMA采集多路AD值 AD的基础知识 AD很复杂,其实也不复杂,因为我们用的不多。 AD:模拟量转换数字量(模拟信号转换数字信号)。 ADC:模拟量转数字量的转换器。 我会带着你远行/ 2022年02月19日 08:36/ 1 赞/ 1254 阅读