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

【经验分享】STM32F1 通用定时器示例详解--TIM15_ComplementarySignals

[复制链接]
STMCU小助手 发布时间:2022-2-24 20:41
前言
2 V2 p3 r6 m1 E% ^' Y基于学习的目的,详细讲解关于标准外设库中的定时器的 17 个示例项目函数文件。本次介绍 TIM15_ComplementarySignals的示例。8 m) Y& v/ b  y. k6 a- G
一、示例详解
0 J% k0 t4 y4 k3 ]! T基于硬件平台:STM32F100B-EVAL,MCU 的型号是 STM32F100VBT6。软件则是其标准外设库。
; F/ _6 e6 K/ W3 {9 d4 R. G, T0 L1、TIM15_ComplementarySignals 的寄存器配置
4 U0 x1 f( g( n! k5 V5 Q+ P! ?软件配置,运行程序可以发现,系统时钟设置为 24MHz,定时器使用到的是 TIM15 ;+ O9 W7 J7 ^0 s& {; y% n3 d

" c3 r4 D+ o9 u. ^% I; v  R% g RU]QRYPC[RE_BNLW@41{)`G.png
6 N8 ?7 G4 s+ p  v/ D" U/ e5 @& f& j% H# V0 Y( x, \
根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM15 的时钟源来自 APB2 的分频。0 E& {. L- W1 h) c

+ }- Y- o, A) N; B5 L( ~ MWDD2LV@P0]P~`I3R9ECM.png ) I& V/ W8 q4 P& G
2 q! H; a! m4 Z7 n8 o
6_49I2MYS`J32263Z2I2)LG.png % u) A  ^: U8 @0 w: J% A
" K1 s$ s' w0 ]0 l8 ~
AHB 时钟 (HCLK)在 RCC_CFGR 寄存器中的分频系数 HPRE 的值为 0,即 SYSCLK not divided,即/1,所以 HCLK 就是24MHz;8 i8 W6 [9 ]( d0 `+ E2 F9 m5 ~2 z
APB2 的 prescaler 的系数是 PPRE2:0x0,HCLK not divided,即/1,APB2CLK 为 24MHz;由于 APB2 的 prescaler 系数部分频,即/1,所以倍频器不起作用,即为上图中的 TIMxCLK = 24Mhz。/ M" E5 _3 ~/ w  T

5 e6 Q. h/ Z) x二、示例演练0 k$ ?& a) T4 b* y$ N  m9 J+ @

; I) G' X4 z- Q: [, h8 ]
5 B4 d5 l; p, y9 q8 P综合上述,本案例中,Timer 的时钟源选择的是 Internal clock,CK_PSC 的时钟频率其实就是时钟树图中的输出 TIMxCLK,然后 TIMxCLK 或 CK_PSC 经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。
9 C7 s( n2 O; G/ n另外,
5 t0 {0 E: u& V/ L+ h
2 S1 ~; t, I: G+ J9 o* h  P }A[TWFCINRSNH3%P6X@(K(Y.png
/ B1 g# Y3 ~6 W( |5 j$ z4 N1 ?) H1 r
设置 PrescalerValue 的值为 0,不分频,即 TIMxCLK = 24Mhz,即 TIM15 counter clock at 24 MHz。
2 C1 Q/ a$ m; m( |( Z, U0 Y时基部分的设置为向上计数,周期 ARR65535,CCR1_Val = 32767;不重复计数;TIM_ClockDivision = 0,不分频。
* `- Q8 A. K& h5 C# ?! h
: K  c  e% j+ [1 w  @& T [84{PXZA5_b@2~N)M(QQT.png ) b0 v6 U  o& H1 ~' f
3 L0 `8 s9 |% h, C% c
因为计到 ARR 值后还要再计一次,才重新计到 0,所以整个宽度是(TIM15_Period +1),即 ARR+1;所以带入上述值后,占空比为 50%。
: R, L' s- k! L- k( \9 s  H' ~
5 {6 ?5 j; c! B& x %~]22DLU}A_]C43TWKAM`{H.png 1 b* {$ u( {: c0 c# i" N* v* q

3 ]2 g! m2 I+ X; H5 t* c2 m在上面的函数执行完成后,TIM_INT 的计数时钟等已经设置好了。' z3 d' |* F, w) e
再简单的描述一下 Prescaler 和 ClockDivision 这两者区别:个人理解,prescalor 是预分频,用于输入捕获等采样时候的分频,是计数分频;而 ClockDivision 决定了时钟和滤波器采样时间之间的关系,只能取 1,2,4 这三个值。& S& W! e0 Y8 a* R' w
接着配置各个通道的设置:
" d+ X' `' e  I6 F- d9 w' I$ U1 r3 P. V# E9 j5 {; D
0F(VUKHKXSTZ3`3LRK(```B.png 5 M7 P8 I2 ]0 I, D% I8 {& |

! x$ {3 }+ d( H" N8 @(结合上面两个图片和极性的配置,可以得出 OCx 的电平的输出,这里不再多说。)
7 |& ~; r* z' b9 A6 s7 K. V1 l配置的模式为 TIM_OCMode_PWM2 (值为 OC1M = 111);输出使能;低电平有效;最后 TIM_Cmd(TIM2, ENABLE);,使能PWM 输出;没有打开中断;
6 W% I; Y" a& `& G# N7 |5 sTIM15 counter clock at 24 MHz,计数到 32767 变化,50%占空比,所以更新率为 24000000/32767 = 732.4Hz,PWM 周期为732.4/2 = 366Hz,用示波器观测符合描述。如下图:(下图中并未使能 TIM_Break_Enable,未插入死区时间,仅仅是观察互补信号的波形,从下图可以看出,两个波形的周期相同,占空比之和为 100%,符合互补性号的描述)。) S1 O6 F, I+ ?2 z  G9 X) P6 ^9 s
其中:
8 `3 A, G! I8 Q4 Y6 u+ l: ]% {3 r黄色信号代表的是 PA2,TIM15_CH1;
( G; {: }6 L* t蓝色信号代表的是 PB15,TIM15_CH1N;
3 y8 W% g0 N, Q3 Z6 q4 E# l6 Z1 A! d
449M0(BK7K`WTX32X[{}V)J.png
' p; f' d: |; A3 N4 z! n  G8 u* D& _" P( q) r! t1 L( y7 q$ J
接着讨论,下面两句话,对 PA2,PB15 的波形的差别的影响,0 n: T; M; E" E! L
" B1 `; A1 [6 |; H( E* t7 P: e: G
{SH$C$MJS}GH)E[E(RAI8AU.png : F% F- f) u& y4 @# c
0 I5 z! a( N4 b  D; R
此处,TIM_OCIdleState 的端口是 PA2,空闲时是 Set 即为高电平,' }7 o" z' {* U" j" Z( d  f9 }
TIM_OCNIdleState 的端口是 PB15,空闲时是 Reset 即为低电平,
+ D# ^8 v& M: c7 I) g3 x对于通道对应的端口位可以参考相关芯片的 datasheet 表格。
. ^! Q# ^' }4 m# ~7 [2 R2 N8 h0 F; V/ B. [
~$WWGLXOF{J$SX]TMUN}OZG.png
7 `4 s5 u" Y, a% D
( J7 n% N! `; e0 F& [0 I, R& ]执行下面的程序,% l% Z* T( T7 M' a2 P! A

* B: ^/ Z9 D/ u/ G% N R]W`Z9Y[7KU)8JF2`F3`FOG.png : W2 x8 v3 u8 D1 l: [) r1 T

) `* ~; I7 g6 X3 ]; |打到如上断点后,示波器的波形,黄色的是 PA2,高电平,蓝色的是 PB15,低电平;也符合描述,用于指明空闲时的状态。
( x! Q/ _/ ^  T* p8 O: T1 }3 [3 G: d& Q
NY}L_C_EZBTS7Y8`FA9FD%F.png
5 _) u! c# {, t! I6 g* t/ N# U; P. }9 W/ ~$ [) o$ q3 g6 K8 N. h. M
接着,讨论下面这一段函数对于波形的影响,其实就是对 TIM15_BDTR 寄存器的定义设置。% S5 m/ a7 Z- @! V6 j
2 s1 C7 S8 O4 a7 k2 a1 b: Q
2AM2(}OA8NF7BES7X)}4$UV.png
& Q( q0 k9 d' o* U9 ^7 @! O$ z  F6 r1 u6 F* G0 \+ f/ Y
其中,7 l. X% X' }' v. f9 v1 W
TIM_OSSRState_Enable 和 TIM_OSSIState_Enable 分别是运行模式下“关闭状态”选择 (Off-state selection for Run mode)和空闲模式下“关闭状态”选择 (Off-state selection for Idle mode)。具体结合下图表,可以得出相应的端口状态。
4 g1 B; K* E' ]- j# H' {! e
+ m2 Y) K8 f# Y: m CW%HF4%A[7EU74ILUTSB[}R.png 8 L1 Y1 [" M8 a" W% p# Z
  H" `% [; C/ p& A8 o% Y
TIM_AutomaticOutput_Enable,在该程序中,AOE = 1,而 MOE = 0,即 MOE 主输出使能 (Main output enable)在下一个更新事件被自动置’1’(如果刹车输入无效)。
) z$ D5 Z; V" U& g" F3 Z0 `
9 e3 I- o* {* l- p8 d- f8 _, v @S}JVRD3)ZF4`5BGF6U0.png
: P  W( ~' J) ^+ G% X2 N( D4 R; g  `" _1 Y3 C  R" ~* {
接着,查看刹车功能的设置,如下两句:6 t: N) i2 o1 K  m" G, p+ i
, h" c2 n1 C$ [4 i
GV]GHV[4HXT7M79`(T6PWR6.png # Q# [! N) z& s: M3 g

# s7 H; p" Y/ }2 p0 S使能刹车功能,且刹车输入高电平有效,即当:
3 {; ?  r# V6 _/ J* k+ s; K9 e1 ?TIM15_BKIN(PA9)引脚拉高时,刹车功能起作用,无信号输出 ;; G8 m% `! x& @6 R) T0 n1 {5 l
TIM15_BKIN(PA9)引脚拉低时,刹车功能不起作用,有信号输出 ;
4 d7 S* @7 v; L9 G. i% y所以在演练该示例时,需要将 PA9 跳线接到地以观察输出的互补信号。
3 O  W$ Q; E3 i最后,讨论死区时间的设置,TIM_DeadTime 的影响;其设置的公式如下:
+ O  b; I! W3 a* ^8 x/ ^) U. H" _/ H, l, L
X_AGRQVDSOF58QL[5O@4@XU.png   T) w- a6 M5 s& V# H6 A
& y' W  q0 }6 T9 B9 Y6 j' p1 D
在本示例中,TIM15 counter clock at 24 MHz,DTG 为 0x27,即 0010,0111,为 39,所以死区时间的计算公式是 :
) X" P4 r  l& T( Z0 m1 v
6 z" W9 G# q+ Q `[(QV`{COT5K975}M_OA%RV.png / {5 h" @# x& h+ i' O

" O9 F/ \4 m$ T/ J  w所以,Tdts = 1/24Mhz,带入上式,DT = 39/24000000 = 0.00000163s = 1.63us8 r8 Z" b- V5 i$ r( Y& i

; S2 K+ @+ \4 |3 q$ m; O ~DOOF3C}D}QWB6@THOXJ`{W.png ' {; ^( e# v2 k$ C1 f! l
4 }1 I$ W7 N# H
自己的计算与 Readme.txt 中的描述相符。
$ O) M  k: K/ ?( {( n2 d" G' u  _当 TIM_DeadTime = 0xFF;可以很明显的看出 DeadTime 在起作用,# f/ H! u' ?2 I4 n3 `
9 m0 G- b: y9 A* R- b: r; `# E' F% V8 u
8 T# ^! _" m2 ?  f$ t/ u
7 y0 x) s' h5 ]5 [2 ]8 j1 Z$ J
那么 DeadTime 是只对 CH1 或 CH1N 起作用,还是对 CH1 以及 CH1N 都可作用呢?
# e( q4 V$ j6 j5 w9 Q" `6 D对照上面的描述,这儿先简单概述下,, L' P0 a; i6 r- A, _+ m1 b
未使用 DeadTime 时(黄色 CH1,蓝色 CH1N):
6 c! x4 R& `6 E8 ~4 l! m2 a# X0 P% g% f! v; a6 S: x
T~T9[MA[EEEND1XN9J]QB.png - C: V$ N* b( ]2 L( P

6 }7 _( ]' q6 y: E1 j# V使用 DeadTime,且设为 0xFF 时(黄色 CH1,蓝色 CH1N):
. o0 Q2 ~  ]. a0 u) J6 m. {4 x4 p7 {9 B2 k# b; \9 T* n4 Z; G
K8Y%2$DKF2G@N}%H6H06Y1S.png
! c* b5 N& L! d8 }- m3 {1 k( N" o
直观的看是对两者 CH1 和 CH1N 都起作用,对占空比有影响,不影响周期。
, G4 |  n, h, S8 e2 r9 M下图讲解的很清楚:
6 ?* b! y8 q) R如果 OCx 和 OCxN 为高有效:8 t" t: Z. g4 V6 W
1/ OCx 输出信号与参考信号 OCxREF 相同,只是它的上升沿相对于参考信号的上升沿有一个延迟。
0 _4 o. J1 M9 W& q4 B0 \1 V2/ OCxN 输出信号与参考信号 OCxREF 相反,只是它的上升沿相对于参考信号的下降沿有一个延迟。参考这两句话,可以得出下面的图形。* D3 G% j- L: Y

. K) N- @. }& j6 t) r9 k, d9 Q, f# \: d* \& _! E1 K+ Z
~P_H49C3{N(E3(%$_@YK%KL.png ( T! a' Y3 M) ~3 w! N3 {

# L+ @2 h0 l" u$ C
赞 收藏 评论0 发布时间:2022-2-24 20:41

举报

0个回答

所属标签

相似技术帖

官网相关资源

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