简述:使用TIM2捕获pwm
) B. p' ?' _* p% U' zIDE: KEILv5.278 B% c+ F* _" w. G
Firmware Package:STM32Cube FW_H7 V1.8.0
8 y* E% R+ |2 ?芯片:STM32H750VBT6
! g7 v! ~ Y( W U
, _6 B: |/ ^% I6 T8 V K# f: N; }6 C% I6 F- A( |& z7 }) [, R$ `
- W5 d4 V; \& s( S开启tim2输入捕获
: [9 b" F( E+ i. H: k1 e) g7 }4 D; L D& S" g
* [' g* P$ S y* ^1 W: {5 c0 t. g0 x
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。% Q; b( d: n: E( d5 V$ |
6 G0 J* Z7 D7 r) f2 V
0 i' J& D6 r7 [: u6 k# }2 ]# v+ h9 V! E* u7 w6 p+ u8 ^
通道一和二都配置成捕获上升沿。2 ~8 f4 q8 v5 U0 f
5 \! f, O: U6 P- O6 g3 N9 T k, Q) e* y0 M& }. k1 T& n! i/ G- j/ L
: t. ~! R* u6 k
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。
$ L" p+ T$ N4 U/ ^6 i& m- L' K _) j* N* |
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
( d: _0 F# B# x9 ` w1 H, ^ - HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
( A: A; ~1 Q `1 j. w! ~ - //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
9 S( j% i2 `; e3 n* E - {//hal库输入捕获回调函数、. I" H5 z' D' Z7 M+ E* u/ e
- if(htim->Instance == TIM2)
6 i# L5 Q' K. s - {//判断是否为TIM2
6 S* u& d: L. M8 f" P& t! x: w# g - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一* P8 Q0 x; o7 }3 c* l; Y; i6 R
- TIM2_CaptureChannel1_Callback();
# r" b; X0 Z+ m5 h - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2), r) p5 j: B' u1 |; H+ ^
- TIM2_CaptureChannel2_Callback();
* S+ P% r4 t6 z ]( H$ U* Z - }) `* Y! q: S0 r4 s! J$ ~/ Q; W
- if(htim->Instance == TIM4)' ~) x) a6 F) |; ]7 ^
- {/ g9 Y0 u" O! f% P
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
, x4 D: _) ?/ E. s+ K - TIM4_CaptureChannel1_Callback();+ J. ]% \, K9 L' _8 T/ t
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) N+ h3 r' I) J0 f: u& ]
- TIM4_CaptureChannel2_Callback();1 M; Y+ o, P; o) K9 J( u) ?2 j
- }& _7 Y& A9 o! \0 o8 ^% b0 w5 `8 f7 _
- }
& C+ B% s, k0 s# ?, j - 3 U& N C' f- L$ e) @
/ b1 D+ i: m V' E0 U" o- ( b- c o* m; y/ U
- void TIM2_CaptureChannel1_Callback(void)8 }' r- q+ F! {$ D& l& ]
- {8 B" J. s. P. Y5 t
- switch(tim2_ch1.capture_edge)
5 L" l. w" ]" }- Y4 z$ I2 N - {
: j& W+ v. q/ B1 c2 U& [7 R - case RASING:
* [/ n- n$ a& _! |& X4 Z1 n - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);. t' `, t$ N1 \; |1 K
- tim2_ch1.capture_edge = FALLING;
0 N- `5 D5 e$ A$ y- G& f -
3 C. y* c5 I1 I: ~# ]" \ - tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
! [+ Q% P) P1 n8 @' G - __HAL_TIM_SET_COUNTER(&htim2,0);' e( [) b E4 K2 G$ @8 j0 v3 D) S+ I7 V
- break;
/ n0 b$ f% N8 G& Z% v5 D - case FALLING:
( I' p7 Z" h# Q3 \8 V/ ]3 \. \ - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
* _. Q. g2 {. V5 ]# W0 h - tim2_ch1.capture_edge = RASING;
# F0 ?) n, M0 c9 k& d9 `- m - tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2);
1 }. ~6 ~6 a, e/ [& Q - }
5 h0 a% g' v: Z% B' u* U - 5 f; \1 W# D" [6 b9 K0 Q4 B
- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \
; C J1 `) R& n# g; ^$ V0 D3 F1 X - do{ \, q* z; f% ^ H" Y7 I* T
- TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \) g4 D5 ]+ L! x, w
- TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
7 I. x+ s) E# i1 {9 h k! U- k, n7 p - }while(0)
复制代码 8 Y- k% Z9 n4 Q: Z0 _3 P
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。2 ]" M% e. c8 ]9 N z: I
8 X9 K" J* t9 d" ?5 B: ]; z
- __HAL_TIM_GetCounter(&htim2)5 b- d5 [% _7 M* Q" K
- __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。5 M7 Z q, x: c2 |, N
实验结果:50HZ方波捕获到的周期为20000us基本不变。% o; u* L' ?6 r; `- e9 J: n1 Y
2 q" G4 y6 y7 \6 L/ U$ Z; G
$ c# b! s; S, N+ I
& h) G4 m+ Z- c6 `5 e9 M" x* H
|