STM32 CUBEMX 定时器触发ADC+DMA多路采集时间问题
在使用CUBEMX配置定时器触发ADC采样,并用DMA将数据传输到固定地址。
在使用这个配置时,会出现一个问题,就是DMA中断会一直触发,并不会按照定时器设定的时间触发。
先配置ADC1的多个通道。
再配置不同通道的转换时间,以及触发方式。
模式中失能CONTINUE CONVERSION MODE
配置定时器时,选择
配置定时器参数,不分频,自动重装载,并更新事件即可,不用打开中断。
DMA中选择ADC1通道,连续转换,模式如果不连续转换而是软件转换,可能会涉及到转存的数据对不齐的问题,也是continue conversion mode 的问题,失能就可以软件dma采集adc数据就能对齐。
接下来就是生成代码,打开项目。
HAL_ADCEx_Calibration_Start(&hadc1);//ADC校准
HAL_TIM_Base_Start(&htim3);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1_get, 40);
在需要的地方开启定时器中断以及DMA传输模式,因为选择的是循环模式,那么只用开启一次dma就可以。
又因为开启的是四个通道,这里转存的是40个数据,那么会有一个疑问就是:是转存完触发dma中断还是转存一次触发一下中断?
答案是:转存完触发dma中断,设置转存10次数据,一次数据5秒,那么需要50秒才能触发dma中断,这样就减少了dma打断,方便程序运行。
如果你需要禁止dma中断可以使用以下函数:
__HAL_DMA_DISABLE_IT(&hdma_adc1, DMA_IT_TE);//传输错误中断
__HAL_DMA_DISABLE_IT(&hdma_adc1, DMA_IT_HT);//传输一半中断
DMA_IT_TC 为传输完成中断。
一般情况下,cubemx直接配置dma中断为关闭状态,需要自己手动设置。
在项目运行中可看到:
转运的ADC 值为5s一次,并且非常缓慢,因此需要设置定时器参数来达到自己想要的运行时间。
转运10次为了消抖,同时给程序留以时间运行,不一直dma中断。
先消抖,后将数值转化为自己需要的区间值。
总结:
ADC配置中的CONTINUE CONVERSION MODE一般情况下需要开启,但是特殊情况下关闭比较好。
在使用dma采集adc时,dma中断可作为设置标志位打断,这样可以便利别的程序运行。
作者:STM32单片机学习