STM32G4中ADC触发分频的实现方式
STM32G4中ADC触发分频的实现方式
在现代数字电源设计中,ADC(模数转换器)与定时器是两个至关重要的外设。通常,算法会基于ADC的采样结果来计算并更新PWM输出,以实现环路控制。然而,在某些情况下,ADC的转换频率或环路计算频率可能跟不上PWM的频率,这就需要对ADC的触发进行分频,实现每N个PWM周期触发一次ADC转换。本文将详细介绍在STM32G474微控制器中,如何在高精度定时器和高级控制定时器中实现ADC触发分频。
1. 前言
当前的数字电源设计中,ADC与定时器是最重要的两个外设,算法基于ADC的采样结果来计算更新PWM输出,以实现环路控制。一般情况下使用定时器的复位/周期事件或是某一个比较事件来触发ADC转换,然后在ADC转换完成中断中执行环路算法,让ADC的转换频率、算法执行频率与PWM频率保持一致。但是某些情况下ADC的转换频率或是环路计算频率跟不上PWM的频率,需要对ADC的触发进行分频,实现每N个PWM周期触发一次ADC转换。本文基于STM32G474介绍在高精度定时器与高级控制定时器中如何实现ADC的触发分频。
2. 高精度定时器中ADC分频的实现
在G474的高精度定时器中有多达10路的ADC触发信道,每个触发通道有多达32种触发源可以选择,PWM发波可以与ADC触发非常灵活的关联。如下图所示为hrtim_adc_trg1~hrtim_adc_trg4与其对应可选触发源的框图。
高精度定时器中通过"ADC post-scaler"来实现ADC触发源的分频,配置ADCxPSC[4:0]即可。如下图所示为在定时器工作在up-counting计数模式下,设置某一个比较事件触发ADC转换,在ADCxPSC[4:0]配置不同的值时实现ADC触发分频输出的示意图。
当定时器工作在up-down counting计数模式下时,对于设定的比较值或是Roll-Over都存在两个点,所以首先还需通过设置ADROM来确定触发点,如下:
如下图所示为在定时器工作在up-down counting计数模式下,设置某一个比较事件触发ADC转换,在ADCxPSC[4:0]与ADROM[1:0]配置不同的值时实现ADC触发分频输出的示意图。
3. 高级控制定时器中ADC分频触发的实现
在高级控制定时器中,同样有很多事件可以用来自触发ADC转换,如更新事件、比较事件、定时器触发输出等。根据选择的触发事件,有不同的方案来实现ADC触发分频。
3.1. 定时器的UEV(更新事件) + RCR触发ADC转换
选择UEV方式触发ADC转换时,结合Repetition寄存器(RCR)即可实现ADC分频触发。若定时器工作在up counting或是down counting模式下,每个计数周期只有一个UEV事件,在定时器计数周期点产生;而当定时器工作在up-down counting模式下,每个计数周期有两个UEV事件,分别产生于周期点(crest)与0点(Valley)。下图为RCR为不同的值时,不同的计数模式下,UEV事件的产生方式。确定了UEV的产生方式后,ADC触发工作的方式也就确定了。需要注意的是在up-down counting模式下,要实现ADC分频且触发点固定,RCR要设置为大于等于3的奇数。
3.2. 定时器比较事件 + 触发沿设定触发ADC转换
若是ADC的触发源为比较事件,那么采用方案1就不适合实现ADC触发分频,因为比较事件每个计数周期都会发生,且与RCR无关。这种情况可以采用比较事件结合ADC触发源的沿选择来实现。
该方案只适合定时器工作在up或是down计数模式下实现ADC转换频率为PWM频率的1/2,下面以Timer 1 CC4事件触发ADC转换为例来说明该方案如何实现。设置如下:
- 设置ADC的触发源为Timer 1 CC4,上升沿有效。
- 设置Timer 1 CC4的工作方式比较事件发生时输出翻转。
实测结果如下,每两个定时器计数周期(PWM周期)触发一次ADC转换,ADC转换频率为PWM频率的1/2。
C1(黄色):高级控制定时器PWM输出
C2(蓝色):CC4波形,上升沿触发ADC转换
C3(红色):信号翻转表示ADC被触发并转换完成
4. 小结
这里介绍了在STM32G474中基于高精度定时器和高级控制定时器如何实现ADC触发分频的方法。
- 高精度定时器中使用ADC post-scaler功能,依靠设置ADCxPSC[4:0]与ADROM[1:0]实现。
- 高级控制定时器中,ADC的触发源结合RCR或者触发沿选择实现。