使用STM32定时器周期性地触发ADC的介绍
前言
对于STM32芯片的ADC的转换启动,一般分为软件启动或外部触发事件启动。其中外部触发事件启动,可以是定时器触发事件或EXTI引脚信号。在很多应用场合,比如电机、电源、变频器等应用中,ADC的采样点可能会有很严格的时间要求,如果采样点选择错误,可能会给整个控制系统造成严重不良后果。这里针对STM32的定时器周期性地触发ADC采样的实现方式做个简要介绍。
这里以STM32F4的TIMER1 触发ADC注入通道的转换为例【当然,规则通道也可以使用定时器触发】。我们可以利用定时器更新事件或比较输出信号作为ADC的触发使能信号。根据STM32F4参考手册查表得知,可以使用TIM1的TRGO事件或通道CH4的捕捉事件来触发注入通道的ADC转换。
1、使用TIM1 TRGO来触发ADC
// 选择Tim1更新事件作为TRGO
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
//设定T1_TRGO作为ADC触发源
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;
特别提醒:经常有人忘记配置上面红色语句,那就相当于使用了默认的TRGO信号。但对于一个定时器来讲,可以作为TRGO的信号很多,有时默认的并非你要的信号。
2、利用TIM1 CH4的比较事件来触发ADC
这里就是选择OC4REF信号作为TRGO输出来触发ADC.
// 选择OC4REF作为TRGO;
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC4Ref);
//设定T1_TRGO作为ADC触发源
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;
相比上面第一种方法,ADC采样时间点更为灵活可调,不仅仅局限于定时器的更新事件。
图一:间隔触发ADC采样点
有时候,我们可能需要多个周期才需进行一次AD触发采样及相关计算。如果时间是基于更新时刻又是定时周期的倍数,较为方便的办法就是使用定时器里的重复计数器,使用更新事件作为TRGO。软件设置就是在上面第一种方法的基础上增加一句对重复计数器TIMx_RCR的设置。图一的蓝色箭头即为此种情况的触发点设定。基本配置如下:
//配置重复计数器为2次
TIM_TimeBaseStructure.TIM_RepetitionCounter = 1;
// 选择Tim1更新事件作为TRGO
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
//设定T1_TRGO作为ADC触发源
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;
如果要实现跨周期非更新时间点采样和计算,即上图中绿色箭头所指的情形。我们可以考虑使用多次采样配合中断进行计数的方式或者引入其它定时器进行分频后来灵活处理。
========================
往期话题链接:
2、一个关于使用STM32F4芯片CCM RAM时的异常分析