简述:使用TIM2捕获pwm8 a" {7 q: z9 E8 H
IDE: KEILv5.27) F: V1 ^5 W* S2 Z
Firmware Package:STM32Cube FW_H7 V1.8.0# W: u0 R# K: O; W$ K
芯片:STM32H750VBT68 H' G7 {& E' x7 ?
9 n9 U, I4 i& ~
) r+ x: j* V" f( w/ Z) v8 q$ {8 b+ \/ I" n8 p: K
开启tim2输入捕获2 A7 J9 p, [/ ~
+ X# y4 U/ [! x$ \& F
6 s2 Y$ @1 L( ]& Q; s& s配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
& }& Z2 n5 t; X* N) O
) j2 }' B( `- f. W
- y, }6 Z. D. Y' r/ O" e8 M+ W& Z+ L. j( a2 Z7 A( u9 \
通道一和二都配置成捕获上升沿。
/ b( N0 S- ] M; T0 L. e) T
9 J- h( B2 Y# ^% V5 q' b
0 j" [( X% C6 J
1 ]7 M' O$ l$ v* f y管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。: O. S( y2 Q2 O6 t
( J X% F, z0 Q- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); ( r b5 R: C+ i$ s) V* `6 _
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);- U; D, H( ~ l; ?# f b* F8 T
- //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim): b* {" ^ V+ d' q3 @, E, O# v8 A8 q
- {//hal库输入捕获回调函数、# F0 p) X2 @8 Q; j
- if(htim->Instance == TIM2)' q- Q0 h: f$ U, e: ~2 C3 s
- {//判断是否为TIM2& e) M, K; e- p% `
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
, M7 }' F5 V% `5 X0 k - TIM2_CaptureChannel1_Callback();5 k6 `1 o" V6 G8 N0 F. c) j$ m" U+ z
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2). N- ]6 d: H" A3 Q, Y' g
- TIM2_CaptureChannel2_Callback();2 m0 R* R3 @5 W9 v- @8 G. ~: B1 e; |' H
- }
1 R6 {; Q5 e" } - if(htim->Instance == TIM4)
C7 ]7 h& j* M% j3 g+ M6 M - {
4 w4 ]( A2 P( U7 E0 ~2 y6 f& } - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
7 k$ N, \$ k* r, f) _1 H - TIM4_CaptureChannel1_Callback();6 u& P4 L; f3 f& B9 R; E
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
2 }( i8 ?4 |! v) K0 i2 O' m - TIM4_CaptureChannel2_Callback();" b" c" Z& j+ K* i% ~/ z" f
- }
: L5 X& d4 ?) b5 }: {& H, I - }
4 @- I# n, e. g. g
6 M6 ^$ j; v' V! J; I
# f1 S! _3 h$ g- . O% P2 { k3 n# N7 e7 K e4 o
- void TIM2_CaptureChannel1_Callback(void)
I. Y( ~/ v( l# w - {, ?% y, j5 [- d! o+ G% @9 H
- switch(tim2_ch1.capture_edge)
( u& x" z2 ~4 G5 l& I! l) q1 p - {
, S- K/ {! t: C3 S. u' ]" ? - case RASING:; T, r7 H- C% }: `1 V7 n# g! d
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
]5 C3 y' U$ Z- ] - tim2_ch1.capture_edge = FALLING; 7 v% B1 N! Q5 _( H1 j
- / ~ {9 k. T0 o; V% ~$ Z9 z
- tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);7 O$ C9 j6 g% T$ Q* B% v
- __HAL_TIM_SET_COUNTER(&htim2,0);
+ Q+ L z/ h6 q - break;
; \" F' E3 r) P: O% [7 _ - case FALLING:
; R; e/ Y/ } K6 j5 k - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
! ^- r) z& X3 S/ @3 b - tim2_ch1.capture_edge = RASING;
0 B$ C# V0 W; |5 g1 t - tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2); ! \# {7 @" R' o2 N
- }7 G2 v7 U# E. { c" k. B
h" V, T/ Y- K5 i$ T/ Q% k- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \, L4 k1 p- V- b% [8 V% C* j
- do{ \
) U. f c& j' U7 q - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \6 H% j2 h! p7 e3 L& L' D
- TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \: j9 E6 U' A* U" l) f# v- ^1 E
- }while(0)
复制代码 {3 U9 |4 \4 r% j& n/ @) I
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
1 q( P9 E1 M" {, J+ z& L: X& I5 u ~* \& q q+ C
- __HAL_TIM_GetCounter(&htim2)1 o/ Y [8 z" M: I |" Y
- __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
9 M. D6 d: Q* X实验结果:50HZ方波捕获到的周期为20000us基本不变。+ L4 v/ ?4 X7 U+ n) F' E
* ]; }% [. Q! B: y: J
) |0 `0 H0 l: K* Z! f, l* {. \
% X* T7 C! E1 m6 L |