
常有人问起STM32定时器的比较输出功能中的单脉冲模式话题,这里就趁此机会一起聊聊该话题。 / C5 a7 T! ?8 K4 ]; b+ a, y 其实,单脉冲输出模式是定时器比较输出应用中的一种特殊情况或者特殊应用,是一种特殊的PWM输出模式。既然这么说,要想了解单脉冲模式话题,我们就有必要先对比较输出功能,尤其是PWM输出模式有所了解。; Z5 g9 g1 X( b8 E # O% d8 F7 I8 K! y 比较输出【Compare Output】功能:定时器通过对预设的比较值与计数器的值做匹配比较之后,依据比较结果结合相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲输出、强制输出等。一般来讲,STM32的通用定时期和高级定时器都具有输入捕获、比较输出功能,不同的定时器可能通道数量上有差异。0 i9 Q( ~1 h* X0 x 这里提到的比较值就是指放在CCR寄存器中的值,计数器的值当然就是CNT寄存器的值。一般来讲,在计数过程中,CNT寄存器的值往往是连续动态变化并呈现周期性,其变化规律跟我们设置的计数器的计数模式有关,比如向上计数模式、向下计数模式或者中心对齐计数模式等。这里的比较结果无非三种情况: ' \& {0 X+ [, O8 t) ^ ![]() 那输出模式呢?基本的比较输出模式有3种:【这里是说的基本的,有些STM32系列的定时器输出模式已做了拓展】4 ~1 B4 c( K( }1 `- |5 P 1、强制输出模式;# \4 N& N, s' o* F3 S% Q% G7 f# W - E2 C9 ^3 Z3 e. p6 ?0 y 2、匹配输出模式# H9 s d. b9 M p7 _: ~ 3、PMW输出模式 ![]() 5 W0 R4 L: V: x/ E7 o% S" j' k 7 C$ m2 d/ _) } I6 v/ `2 q 结合上表我们不难看出:3 A1 G# X2 F" Z e3 V 8 K& A4 L+ y* [" `7 f& B 强制输出模式;无视比较结果,直接根据配置指令输出相应电平; . q. p7 M/ e9 ^ 匹配输出模式:只关注CCR=CNT值的时候,做相应电平的输出;0 }0 w: S+ o# i1 R + p+ }/ S3 x' N/ T$ @" l5 g PWM输出模式:根据CCR是小于CNT还是CCR不小于CNT的比较结果做不同的输出; . _! V1 T/ L4 p 5 E* T+ h/ |# _* S% h1 E [各种模式输出特性细节可以看看上面表格】) P: ^' D( {' S7 }/ a& ^: K$ _5 r # [: d& G: n i6 s+ Y 比较输出的大致流程以及几个术语【OCxREF 、OCx 、输出极性】+ s* T3 M; y" i ![]() 上面提到的输出信号,其中多次提到有效信号,无效信号,是指比较输出控制器输出的信号,我们称之为中间参考信号,即OcxREF信号。该OCxREF源于输出模式控制器,并硬件约定高电平为有效信号,低电平为无效信号。它经过极性选择后,再经输出控制电路输出到芯片管脚Ocx端。当极性选择位CCxP=0时,高电平作为Ocx的有效输出信号,当CCxP=1时,低电平作为Ocx的有效输出。 或者说,当极性选择位CCxP=0时,Ocx输出与OcxREF信号同相;当CCxP=1时,Ocx输出与OcxREF信号反相;1 A: y) S" x, j- a$ P% y6 C& P 下图是当CCxP=0时 Ocx 与 OcxRef信号的相位情况【二者同相】) c, u H& h( ~* S' ~1 |( t : t6 N- z- X1 c: k1 a" ^ 8 s% h) E2 `/ C Q! U ![]() ; y8 I7 v" R/ F+ x% e) H 下图是当CCxP=1时 Ocx 与 OcxRef信号的相位情况【二者反相】 7 u) w6 M/ A) u1 H9 ~; c ![]() 4 ~! u# T' q, V; _& T, G 也就是说,OCXref信号只是个中间参考信号,并非最终输出信号。最终输出端OCX的active state【有效状态】/inactive state【无效状态】所对应的电平取决于极性选择控制位CCxP/CCxNP。 / A5 p/ m& i4 a/ \5 @ 当然,如果是高级定时器的互补输出,最后的输出波形形状除了与极性选择有关外,输出波形还跟插入的死区有关。即对于互补输出时 Ocx =OCxREF + 极性 + 死区 PWM比较输出模式实现原理及相应波形 前面已经说了,单脉冲输出模式是一种特殊的PWM输出模式。这里我们重点看看PWM输出模式的实现原理及相应输出特性。) F: p8 Q7 O9 p: I' I* n s 6 M7 m% P4 E I% d0 K( y& J 从前面介绍中我们了解到PWM输出模式可以分两种,即PMW模式1与模式2,结合不同的计数模式可以实现多种输出组合。我们不妨以PWM模式1、计数器向上计数、极性选择高有效【CCxP=0】为例来看看比较输出过程中输出PWM波形的实现原理。 . @, j6 s5 p& | ; X4 Z% v# l3 g0 l3 ~7 Y/ z' o ![]() + k* O7 E% C: U* Q 上面图【6】由两部分组成,上面部分是计数器周期性计数的示意图。深红色斜线表示计数器从0开始计数,记到ARR后重装,再重新计数,这样循环。下面绿色方波是依据PWM模式1基于某个CCR值经过比较输出而得到PWM波形。 & w$ Y% b, G) J( S+ \0 T0 |" \$ c/ ^ . J, w T. b* | 根据上面介绍,我们知道在PWM输出模式1的前提下,当计数器的值小于CCR的值时输出有效电平,即高电平,当计数器值大于或等于CCR的值时输出无效电平,即低电平。由于计数器计数会发生周期性地溢出和重装,使得计数器的值可以周期性地循环计数,当CCR的值固定的时候,CNT与CCR的值二者的比较结果也往往呈现出周期性,此时也就输出规律性、周期性的PWM波形。& ^! C6 @. Q% m ) F" T8 E8 `2 x6 c 不难理解,当我们修改CCR的值,其它不动的时候,PWM输出波形会相应变化。* D+ Q( q) F8 @! g8 l: E5 n ![]() 图【7】的波形是在图【6】的基础上讲CCR值往上调大以后所得到的比较输出波形。2 @ V \9 @1 T* B# Z1 B 看到这里,我们不禁会想:既然PWM输出模式的输出结果取决于CCR与CNT的比较结果的周期性变化,那么,当我们把CCR的值设置为0或者比ARR的值还大的时候,此时CCR与CNT的比较结果将不再变化,因为这里CNT的值不可能比0还小或比ARR还大。此时,自然就不会有变化的PWM波形输出,而是输出固定的电平,具体什么电平取决于CCR与CNT的比较结果与当前所选择的PWM输出模式。, I) A3 w6 M6 T# \+ ]2 u & [0 ^$ J" {5 p+ u+ j, g7 ~# x 4 I H# y+ @6 m* ` 不妨用个具体的案例来理解。比如,在PWM模式1的前提下: 当CCR=0时,由于计数器CNT的值永远不会小于CCR,此时将始终输出无效电平。 W3 q/ n' i; ]4 D" E: z0 m; x : @3 E. M$ _/ j5 m% h( ^ 当CCR=ARR+n【N不小于1】时,因CNT的值总小于CCR的值,此时始终输出有效电平。4 x0 i5 @6 Y* L9 S" w9 z % C9 v Y! e4 A# ?3 L 1 m5 t1 J( ]. B' K& L 上面主要是基于PWM输出模式1、计数器向上计数模式来理解定时器比较输出中的PWM输出原理。至于PWM输出模式1、计数器向下计数模式或者PWM输出模式2等其它情形,我们可以结合STM32参考手册自行分析。( R) C5 J3 ~: j6 n' a & @% k3 x- p$ m( s8 i9 v 结合上面的分析,我们不难看出,定时器之所以能输出PWM波形,原因在于定时器的计数器的计数的动态连续性和周期性,具体到这里,从0开始计数到ARR,溢出重装,再从0开始从新计数,循环往复,导致计数器与CCR的比较结果也具有周期性,从而产生周期性的PWM输出。" o3 ]8 Z- U/ p* s/ w/ O! R " q! G( l: I+ ^1 q+ ~3 j7 \+ n 根据定时器时基单元相关介绍,我们知道计数器计数发生溢出后,可以触发更新事件。对于通用定时器,每次溢出都可以产生更新事件;对于高级定时器,每发生RCR+1次溢出就可以产生更新事件。+ L, X1 C* F4 r$ B+ G( } : h- ]9 Q+ }9 O" N2 j' E 如果说,在PWM输出模式下,当定时器发生溢出产生更新事件时,通过硬件机制令计数器停止计数,既然计数器被停止计数了,计数器【CNT】的值将不再变化,之后的CNT与CCR的比较结果将维持不变,自然也就没有后续变化的的PWM波形输出了。这时我们就可以实现单个或几个PWM脉冲的输出了。 基于上述原理或应用场景,便衍生出了单脉冲输出模式。所以,我们说单脉冲输出模式是一种特殊的PWM输出模式。! P1 X$ R7 F' i 6 `2 l. N- K! Z" Z+ T1 E9 \ 单脉冲输出模式的实现原理:计数器启动后,在更新事件来临之前的时间段内实现一定个数的脉冲输出,当发生更新事件时计数器停止计数,导致后续不再有变化的PWM波形输出。输出的脉冲个数可以一个或几个。如果是通用计数器就是1个,如果是高级定时器,脉冲个数与RCR数值和计数模式二者有关。 1 V5 ?- |7 q4 q. H( m ![]() . t0 A) t& v$ ` 图【8】是个单脉冲输出实现的示意图。定时器工作在从模式,在外部触发信号【TI2】的作用下开启计数器,输出一个脉冲后发生更新事件并停止计数。 % L2 O1 ^% _2 o* U 关于单脉冲输出模式应用的提醒: * \* D" j# a9 d i+ w 1、使用单脉冲输出模式时,计数器的使能启动可以通过软件使能启动,也可以将定时器配置在触发从模式经过信号触发启动. 2、单脉冲输出模式是PWM输出模式的特例,利用该模式并不一定只是输出单个脉冲。如果是通用定时器,每次使能计数器后只输出一个PWM脉冲,如果是高级定时器,每次使能计数器后可能输出多个PWM脉冲,具体多少除了与RCR寄存器的值有关外,还跟计数器的计数模式有关; 3、要用好定时器的单脉冲输出模式,需了解下面三方面的知识点:0 ~" M4 D! S) p/ A: ` 8 H4 t1 i. u" J, U- v- R( N. g A:了解基本的PMW输出模式的基本特性;1 i* S+ K. U. b7 v. [3 h1 h & l! |& S, X4 Z8 v! K d' g- Z B:了解定时器的更新事件; C:了解计数器的溢出与重装; 好,下面一起来看看几个基于单脉冲输出模式的实例以加深理解。! Z: e+ g1 t n' G# ~2 J ; @( N0 u X% B0 a- n# ^ ; N/ D, T2 L, _ 下面案例都是基于高级定时器的。因为高级定时器可以使用单脉冲输出模式输出1到N个脉冲,如果使用通用定时器每次触发后就只能产生1个脉冲,产生多个脉冲就不那么方便。 * K' x" v" ]! r6 q1 p9 M* V 案例一:使用高级定时器,单脉冲输出模式,借助RCR寄存器实现3个PWM脉冲输出6 Z6 A0 B2 ]. h, D 6 T) [6 u& n1 T5 I0 @ 条件:UP counting + PWM1, RCR=2; 极性:高有效[CCxP=0] 4 e) H3 x X& c4 D ![]() ) G% f0 O! \2 z m ! T9 j* J# B: Q& l" h, \( \ 程序运行,使能计数器后输出上述波形。6 c o% ^. {+ c' S) s! f) m& m 3 g4 C. O! S& h% W; s" O ; N8 U% ~2 i( A1 Z RCR=2,意味着发生RCR+1次溢出时产生更新事件,计数器停止计数,后续不再输出PWM波形。从上面来看输出基本是正确的,不过最后电平停在高电平,结尾这个地方怎么感觉不符合PWM1的输出特性呢?2 }! U. t3 g" c; _ 一起来看看,现在计数器是向上计数模式,它在第3个周期计到ARR时产生溢出,触发更新事件,计数器停止计数了,那计数器的值不是应该停留在ARR吗?如果计数器的值停在ARR,那此时CNT>CCR的值,按照PWM模式1的输出特性,输出应该停留在低电平,那怎么是高电平呢? 前面提到过,要用好定时器的单脉冲输出模式,还得了解计数器溢出与重装。& V+ n$ i, ~) c ( f4 u1 O! ^. [% V5 k- r 具体到这里,当计数器在第3个周期计到ARR时发生溢出,产生更新事件,计数器不再计数。但计数器溢出后重装还是照例执行,此时计数器被重装为0,因为计数器被停止,所以该0值保持不变。这样的话,后续的比较结果总是CNT<CCR值,按照PWM模式1的输出特性,输出自然应该是高电平并保持,这跟上面输出波形就吻合了。 ( ?# ?9 N. d0 J" u 好,那我们基于上面的条件,换成PWM输出模式2看看结果。 ) Q$ e; }- e( D+ k* m$ _! `$ Z+ D" M3 \6 O 案例二:使用高级定时器,单脉冲模式,借助RCR寄存器实现3个PWM脉冲输出* n, B# i) `* r' p6 U 8 {9 Q1 `5 t) O 条件:UP counting + PWM2, RCR=2; 极性高有效[CCxP=0]' U. { A2 @* z1 J" g ] 5 n. j. V, d! @) V5 Z- ^" _3 ~ 2 _( y( d4 P# Z. }- j ![]() 4 l0 c0 k" B+ }' O+ ` 这次跟上面的案例1只是PWM模式做了变更,使用PWM输出模式2。仍然是输出3个PWM脉冲,跟上面输出波形相比,第3个脉冲最后停留的电平不一样,这里是低电平。分析过程跟上面一样,当计数器发生第3次溢出时,计数器依然重装为0,此时CNT<CCR,但此时PWM输出模式变更为模式2了,根据PWM模式2的输出特性此时就应输出低电平。 至于其它不同的组合模式,这里就不一一分析了。我下面再放几副图进来,大家可以自行分析。 案例三:使用高级定时器,单脉冲模式,借助RCR寄存器实现3个PWM脉冲输出。2 w+ M" D8 t U& q! a 4 Y9 C& c! u9 T- U& C7 H 条件:Down counting + PWM1,RCR=2; 极性选择高有效 [CCxP=0]$ i U- I8 F7 J0 h$ @6 _ X - v* ^0 E: V4 i, X8 ~" P0 h 6 O& n$ d* [8 a* M4 }6 o: w, S4 Z4 w ![]() $ a+ j$ r5 D5 o5 v 案例四、使用高级定时器,单脉冲模式,借助RCR寄存器实现3个PWM脉冲输出。 条件:Down counting + PWM2,RCR=2; 极性选择高有效[CCxP=0]* f5 Q7 g; x+ N1 _8 D+ {+ \+ n1 B * e/ f2 Q7 t( G$ J- \3 z 8 `2 [& X! G7 |/ T0 z0 v4 d7 t ![]() 案例五、使用高级定时器,单脉冲模式,借助RCR寄存器实现PWM脉冲输出& H2 l3 b: |9 s& C. L * \9 D! D. M1 a/ S 条件:Center counting / pwm1/ RCR=6 极性选择:高有效[CCxP=0]" G+ _1 l j1 S; E# A 3 f0 L4 a: M' p( L! U ![]() 在使用定时器单脉冲输出模式做指定个数PWM波形输出时,我们要根据实际需求来选择合适的pwm输出模式、计数模式以及RCR寄存器的值。比方上面案例1与案例2的输出波形不能说谁对谁错,关键看你需要的是哪种输出结果。另外,一种输出结果可以有多种实现方案,比方上面案例2与案例3虽是不同的方案,但产生了相同的效果,此时我们可以根据具体的应用场景来选择合适的方案。9 b4 L/ w8 [: g. C3 a/ p7 u! q; U % B2 d0 }$ k: C1 P* h# ^8 Y |