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单片机学习

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 CUBEMX 定时器触发ADC+DMA多路采集时间问题

发表回复