前言
0 a, c' x. X$ A; ?0 O, ESTM32F334 内部集成了高精度 Timer,最高主频 4.6GHz,灵活的控制用于产生数字电源等产品的 PWM 控制信号,内部丰富的联动机制可以产生各种实际需求波形,本文针对多相相移信号的产生给开发者一定启示,抛砖引玉,开发者可以根据不同需求产生应用所需的波形。/ d; v/ C& |% Q% _1 a
: R# I! M8 J5 W/ V+ P( _STM32F334 内部 HRTIMER 结构
" j. o# N2 K4 J" R下图为 HRTIMER 的框图,可以看到该高精度 Timer 拥有五路独立的计数器,可以产生独立的五路带死区互补输出的 PWM波形,同时 Master Timer 这个没有输出端口的独立 Timer 可以作为五路其他 Timer 的清零同步信号。1 p2 U" S, L- R# l& o
, g5 U6 |2 G/ X- k) {0 o# |
! {* E3 x9 g" W6 X+ W \
0 j( R$ C/ [! s' ?8 `
: z9 z$ ]3 y2 @1 |需要产生的波形$ m- P( }* W0 V9 R
假定需要输出四路带死区互补输出 PWM 波形,频率相同,但各路波形存在相移:# C! D+ l( R* P! u; G- }
PWM1,PWM2,PWM3,PWM4, 需要控制这四路波形的相位,' c9 }2 s5 W! U7 {9 {; ~( x$ _( g
PWM1 为 0 度,PWM2 为 30 度相移,PWM3 为 85 度相移,PWM4 为 100 度相移占空比假定都是 50%的占空比
3 X; B: v, ~; N, a" b- W. y. X- U z% K* R1 @
" }' k# |. N* I; d* |4 a8 \1 j产生上述波形的机制
2 w/ N9 W; _3 {6 X; B$ ASTM32F334 的波形产生采用了比较输出模式,也就是说可以单独设定波形的 Set,Reset 位置,当需要将各路波形统一起来,需要同一个触发源,在不同相位点去触发 Timer 计数器复位,这样当设定好比较模式时,波形将自动输出,准确快速,并且可靠;# Z6 s: a4 e s6 o' y. [7 j
( U* o' w9 j u2 f A, P; E8 z7 Y# E5 F G0 K) m) c2 c
配置步骤) f! k0 T+ n, I1 r) O7 u! v7 ]
配置管脚以及时钟
* |1 R8 R" ]4 H) z f
2 v/ B2 f! B" a" u
/ P: B% ~ Z5 @
' v9 Q5 v m P! S$ o% p
+ [$ f9 g6 H x1 G1 Z
% O- |8 H, }4 c$ K0 K+ P, L; h
配置 Master Timer# A9 v8 k8 ~+ d5 u. W5 J* Y: S
假定使用 128MHz*8 = 1024MHz 作为基本时钟源,Master Timer 设定为 50KHz,则 Master Timer 的 ARR 寄存器数据为1024MHz/50KHz = 20480,即 360 度对应 20480;
& a5 V2 Z% ^7 k- _$ nMaster Timer 的 Update 事件作为 TimerA 的计数 reset 信号,此时设定相移为 0 度
: z) w7 J* J9 V$ {4 C) Z. T3 ]Master Timer 的 Compara Value 1 作为 TimerB 的计数 reset 信号,如果设定相移为 30 度,则 Compara Value 1 =ARR*30/360 = 1706. d2 p/ b2 {# ?! O
Master Timer 的 Compara Value 2 作为 TimerC 的计数 reset 信号,如果设定相移为 60 度,则 Compara Value 1 =ARR*85/360 = 3413
) ]7 d# J0 p4 o# U5 v1 e. wMaster Timer 的 Compara Value 1 作为 TimerD 的计数 reset 信号,如果设定相移为 90 度,则 Compara Value 1 =ARR*100/360 = 51204 f; J$ T6 ~) L" l. V; ^0 h
- pTimeBaseCfg.Period = 20480;- i3 ?. d1 e# z F0 x
- pTimeBaseCfg.RepetitionCounter = 0x00;& p/ ~" p$ X: B+ v
- pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL8;$ O h& O& f$ [' l3 {6 w$ u
- pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;9 j/ c: E3 E: U( C3 B
- HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, &pTimeBaseCfg);
( e- p& r5 v# E9 m' Q - pCompareCfg.CompareValue = 1706;
( A# A5 G3 E' V% m' f - HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_1,&pCompareCfg);
A4 @0 {% `& Y5 z - pCompareCfg.CompareValue = 3413;
( o, x" q' w- k! r& o - HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_2,&pCompareCfg);5 P+ b s$ l7 j& _" f0 u+ L
- pCompareCfg.CompareValue = 5120;: C' x: \1 S9 A( c+ T& p9 W: L; @
- HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_3,&pCompareCfg);
复制代码 ^9 D/ y. Z; ~/ j v" s$ @5 {# R
配置各个独立 Timer M5 j. n* q: u. i7 l8 R
Timer 的计数 Reset 信号分配如上面所示,因为这里设定的占空比为 50% ,那么只需要使用到独立 Tiemr 的 ComparaValue1 作为该 Timer 的 Set 信号,而 Timer 的 update 事件作为该 Timer 的 Reset 信号即可,当然这里还要说明,如果如果设定不同占空比信号输出,也可以直接配置该 Timer 的 Compara Value2 作为该 Timer 的 Reset 信号即可;
2 r# k& T! ]* e n, \本例因为是 50%的占空比,那么直接设定 Compara Value1x(x=A,B,C,D) = 20480/2 = 10240;死区时间固定的上升下降都为数字 100,该数据可根据实际调整;
' G8 y6 T# ?; b$ V5 @- pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
+ J8 R1 M/ P4 J: D- z - pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMCMP1;
/ U# R4 w5 y. k J* Y% h0 {; Q - pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMPER;2 B% u$ f) T. f) c/ b
- pOutputCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;% d$ A, G8 D) A" d! r! O
- pOutputCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
* S4 F" [5 V% p: ^' ~- ] - pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
* s" t4 V$ a. j# U9 [9 M - pOutputCfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
- e+ [" t( |2 G' v- R2 z9 T - pOutputCfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;8 c7 d s1 s4 p- c: H5 i! R
- HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1,
2 M6 k( V4 G6 [1 ~' g - &pOutputCfg);
3 x/ b' g9 H/ d6 ] - HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB1,
5 @: | A/ W3 {; K; w* w+ x) |2 e - &pOutputCfg);
* y" D; r0 c- H, |7 l - HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC1,2 m2 w* v# |5 T% I( M7 D
- &pOutputCfg);2 `7 |( n/ k4 \. E+ ` n
- HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1,4 S+ d, K& }; E2 [5 x$ z' V
- &pOutputCfg);
复制代码 ) F% O8 j" `! Y! v* }
实际测试波形:
- a3 y/ b' O3 C# P4 {为方便观察,只取每相的通道 1 的波形进行观察。如下,可看到清晰的移相信号:
8 ?. c9 E! I6 c
) T$ g+ Y4 |5 {+ B" ]
0 O5 k4 _) @" M, `, D0 \0 s8 X
) G5 I8 T0 p( {2 S) L. y5 Z) P) K
6 U$ [3 I; w" X |
非常感谢楼主分享,学习满满的知识点,不过文中有点小问题,前面文字说的是85、100度相位角,后面例子中的也是85、100,但注释中确实60、 90度,应该是笔误吧!