你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32高精度定时器定时单元间的同步问题

[复制链接]
STMCU小助手 发布时间:2021-8-19 13:18
1.png
6 U) ]/ k( w8 |- j6 m) {% m6 T% g- e8 q4 V" d" F
有人利用STM32G474芯片的高精度定时器实现两对互补输出,即用到TIMA和TIMB两个定时单元分别输出两对互补信号。
. I  E, G5 l2 [# e3 ?# b, D) t  C3 H$ G# F, c- a3 D
2.png . `- B1 v; x+ d6 j2 D
8 O. @  s: |4 p/ G) O
可是他发现两个定时器单元输出的同频PWM波形存在着明显的相位差,就像下面的截图一样。4 k' @1 I+ z3 O9 [2 _5 c: {7 S7 d/ s
. J$ c% [8 y9 p' U) {
3.png
1 b$ W( \- F3 @5 N: Q- g: Q" B1 V2 }+ e; t( }* p2 G% v
但是他希望二者的输出完全同步且无相位差,那有没有办法做到呢?
3 s4 N- A# J- m+ \5 ]" F8 h! e/ t: G5 Q
这是可以的。我们让HRTIM的定时单元基于某个触发事件来同步启动。对于HRTIM来说,可以利用外部触发输入信号或通用定时器TIM1的触发输出信号来同步HRTIM各定时单元的启动。这里就如何使用TIM1的触发输出作为HRTIM的同步信号让HRTIM的定时器单元同步启动做下简单介绍。# D& l; r* C' U( J" \" m2 \

# \9 [, J  ~$ s6 [7 JHRTIM的各个单元间的同步操作是通过HRTIM里的Master TIMER进行管理的,所以要实现HRTIM各单元间的同步就必须启用Master TIMER,显然,除了启用TIMA/TIMB外,还得使能Master TIMER。- P1 A9 S* y* Q" r$ s% n

2 \% ^* H7 c. n0 \关于同步配置可以参考下面截图:
4 ]5 ^2 `5 n: d5 U% T 4.png
; \5 J9 t3 N" K  A
) o- s4 B" [9 k 5.png % S- J* P! R) {: J6 C" }$ ?
这里对Master TIMER的配置主要是开启它,让它能工作,能管理同步事件即可。
: Q3 d% @8 M) D% A- c8 a4 F# i2 J
经过上面的配置,再对TIMA/TIMB做“同步事件启动定时器的配置”后,二者就能做到同步启动了,加上二者配置了相同的PER周期值,这样就可以输出如下图所示的同步同相信号了。
* @# ?2 t8 p7 O8 o' m 6.png
- x; {# r7 C6 w: c# i* l- Y. n7 c# `5 x+ K9 U1 Z
如果说除了TIMA/TIMB的输出保持同步同相外,还希望中途不时修改周期及占空比且不破坏同相,那又怎么办呢? 即如何在输出频率和占空比可调的情况下仍然保持着两个定时器的输出同步呢?
# _6 B  N8 y2 @% A/ J. n; z" L

3 d( {) k2 m( S# k. _3 m* g我们可以开启TIMA或TIMB的更新中断,在其中任意一个定时器的更新中断服务程序里同时修改两个定时器的计数周期值和比较值,并开启预装功能,让参数在下一个溢出更新事件到来时生效,这样就可以做到既能调整定时器的周期值和比较值,又能保证二者的输出同步。
' p! k! a  W) p) ^( {4 M
  j( l0 E2 F* {5 q
下面简单介绍下实现过程。
% T: B0 ~4 }& d6 @' M: I
4 j; M! z+ T" k6 N6 fMaster TIMER的配置没啥特别的,主要是让它工作起来,能让HRTIM的定时单元的同步起作用。TIMA和TIMB的配置这里基本一样,二者的配置差别主要体现在比较值不一样而已。! U3 W: w) k9 z  D# _* r
& l& Y, z5 H: f& Q" h: \; p" f
来看看TIMA的相关配置。重点留意下面截图中下划线标识的地方。主要配置内容包括设置PER、CMP1的参数,开启同步启动、使能预装功能、启用TIM更新中断,对TIMA-TA1/TA2的输出进行配置。7 M% ]. }+ J  [; @& U# I7 H) ~4 }5 o. G" c
7.png # j/ F$ ]; z: S, _# V
, u$ R; |+ Y% q% s$ z8 y/ Q
8.png 1 [8 Z0 f1 X5 [6 a% I
上面是TIMA的基本配置,因为TIMB的配置跟TIMA的相比,除了CMP值不同外,其它基本一样,这里就不重复贴图了。
) D( n( R- v' l  f" D/ d6 i- B2 a8 r9 K. y  |6 ]2 {
配置完成后,生成HAL类初始化代码。然后添加如下用户代码。: U: |' S) j# b: E6 `3 C
  1. <font face="微软雅黑" size="3">HAL_HRTIM_WaveformCountStart_IT(&hhrtim1,HRTIM_TIMERID_TIMER_A);//使能TIMA
    : M3 @2 n0 B" P/ Z! [2 N

  2. 6 h- s- A6 }/ ~+ |# {0 S7 X+ f
  3. HAL_HRTIM_WaveformOutputStart(&hhrtim1 , HRTIM_OUTPUT_TA1);* t& z* q0 c. E7 I/ @! E* k9 i. a9 a
  4. 8 {/ K$ l8 [! ^3 E" S: R( B8 w6 f
  5. HAL_HRTIM_WaveformOutputStart(&hhrtim1 , HRTIM_OUTPUT_TA2);
    " j& K5 Q0 K! P; F9 J" d

  6. 9 m* X) Q9 Q6 i' N! L- q2 ?
  7. HAL_HRTIM_WaveformCountStart_IT(&hhrtim1, HRTIM_TIMERID_TIMER_B); //使能TIMB
    0 p" {; ~! E% ]9 @% V
  8. 2 `  c+ P% e) J7 C( ?, L2 \  d
  9. HAL_HRTIM_WaveformOutputStart(&hhrtim1 , HRTIM_OUTPUT_TB1);( e3 G+ [. O8 O) \. m# O

  10. 6 V. k) H. @0 O" g8 |. T; d  S# `
  11. HAL_HRTIM_WaveformOutputStart(&hhrtim1 , HRTIM_OUTPUT_TB2);</font>
复制代码
HAL_TIM_Base_Start(&htim1);//让TIM1产生同步触发信号3 W3 T! a: K4 o0 ?- B( W
* T2 z; I8 y  U* b2 a$ I& G
上面的代码行,基本功能就是开启TIM1,它的TRGO输出信号作为HRTIM-TIMA/TIMB的同步启动信号。如果没有这行代码,此时的TIMA/TIMB是不会工作的。9 e* x) @# {* ?* k& w6 h3 E+ Q1 s
: p, C: Z$ X5 Q. x% Y/ \; n
我在TIMA的更新中断服务程序里修改TIMA/TIMB的PER/CMP的值,查看输出结果。4 n( J: A! |0 ^" a
  1. <font face="微软雅黑" size="3">extern uint16_t Interrupt_Count;
    8 q; {$ H! H" T: M) R' Z
  2. 8 J" T7 o. P+ h+ a
  3. #define HRTIMReg  (HRTIM1->sTimerxRegs)
    ! |5 f1 Z0 v1 K3 p3 t

  4. & C2 u! m9 T, |: B
  5. void HRTIM1_TIMA_IRQHandler(void)4 O- o, \5 v* K$ \4 H
  6. " A# v: g9 v% `! W; s9 _- x0 D
  7. {" N- ]! B2 t0 h8 W' k4 a
  8. + z3 P) }6 B3 Q) P5 p
  9.   /*USER CODE BEGIN HRTIM1_TIMA_IRQn 0 */' T- g1 W2 W: W  D

  10. ; G: [/ M$ v* ~5 X" e
  11.   /*USER CODE END HRTIM1_TIMA_IRQn 0 */
    ) |- h1 }  f) c1 N  [- e
  12. & G3 V) V& z$ g7 s0 o3 v/ ]
  13.   HAL_HRTIM_IRQHandler(&hhrtim1,HRTIM_TIMERINDEX_TIMER_A);! b& W6 b; n8 [3 F6 U; r5 Y
  14. ; C. U- }0 w0 Z- M; E) ~$ K9 s3 E
  15.   /*USER CODE BEGIN HRTIM1_TIMA_IRQn 1 */
    % t- `2 N& ~6 a' E/ [
  16.   x+ w1 a2 T% t2 x; w" }  B
  17.    Interrupt_3 o% ?" j+ G! d2 a4 j8 |; K2 W* a
  18.    if(Interrupt_Count < 20000)5 X. M% \, q7 c$ f

  19. - ^  x8 X/ Z" \
  20.     {
    ' _5 N1 [1 a$ J& g
  21.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].PERxR=  0xa000;
    7 L; v' y) g0 w) F1 e

  22. , p- x  y/ W1 G0 \: ~7 I$ d- y
  23.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].CMP1xR= 0x2000;
    ' z2 y- ]4 b+ w9 `

  24. - n# k+ L0 d8 {2 }! f0 s8 z; n2 u
  25.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].PERxR= 0xa000;
    # m% Z+ a& R2 o* J- y" j' u8 O

  26. 0 H  z7 N* W& M; ]2 Q! x
  27.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].CMP1xR= 0x3000;
    . ~" K( r+ j8 W

  28. 6 Y) R% l3 y1 T; X! Q
  29.     }
    ) v' T% J3 k; r% ^0 N2 `
  30. - [, P$ X' _6 ~4 ]5 @
  31.    else if(Interrupt_Count < 40000)9 ]( F+ Q4 [9 h' x0 _4 B

  32. # ]- Z0 J  [# j5 V1 L# @5 v
  33.     {
    7 [+ W* b% j) s- a, R9 F
  34.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].PERxR=  0x9000;; N6 P8 D1 I, F9 Z/ b0 f

  35. # `+ [1 i' H7 Z
  36.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].CMP1xR= 0x4000;! [) o5 m, x: ~" g

  37. ! j$ }# a7 W7 m- }
  38.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].PERxR= 0x9000;. ?* D) r# \7 \& y3 n8 E
  39. . ~9 C) M. {; v! m& v0 t
  40.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].CMP1xR= 0x5000;
    8 T. o* i0 v4 d+ a9 \: ~" F  p

  41. / U! Y7 T9 Y. K" h1 {( \7 E
  42.     }
    4 ^& |2 z2 n( ]# z& _& N5 g
  43. 7 M/ Z, {2 y- N* P* h
  44.     else: {, D, H" }% d( f

  45. # X* {6 J" o: ~: k8 v
  46.     {
    % M  t( D: I' S0 p  e6 Z
  47.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].PERxR=  0x7000;. k% K1 k5 c, }+ r6 D

  48.   h! K% |6 }& H/ q: r3 r5 r
  49.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].CMP1xR= 0x2000;
    7 O7 a/ N2 ?$ A& P

  50. / j2 k$ j2 U5 n, N" `
  51.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].PERxR= 0x7000;% s( u) ]- c5 L- R5 c' O
  52.   M$ i% I) b/ m" T5 g' A2 A
  53.     HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].CMP1xR= 0x5000;
    8 T* e1 p$ F* ~; E" O
  54.     }8 B& C- {: e$ {1 F8 W: i& g' [
  55. , U  D# K0 j4 l- z
  56.   }</font>
复制代码
经过测试,即使修改了两个定时器单元的计时周期和占空比,二者的同步一直都可以保持得很好。关于这个话题就交流到这里,分享以上内容供有需要的人士参考,祝君好运!/ X2 L  I  i: J7 F* H6 T

+ v. i' z. x2 ^  x, K8 u
* b) v! q0 \% P# N% a+ S# R+ W
赞 收藏 评论0 发布时间:2021-8-19 13:18

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版