简述:使用TIM2捕获pwm* p; J( B C# S0 z; n4 Z- W! U
IDE: KEILv5.27$ \4 C5 C' o/ Y6 r8 m4 z
Firmware Package:STM32Cube FW_H7 V1.8.03 t a1 r4 `. D) m! s8 Q
芯片:STM32H750VBT6+ d9 L8 w0 t0 c( U. B: j
& Q: F/ c5 l+ x" V; E( K
- o0 x9 p: E( F0 z- y2 o4 K2 a, v* Q( W( d9 C" e
开启tim2输入捕获+ j3 W& f6 r; E! @7 M& }
0 z* i- A. x$ Q9 n. j/ v
* t: ~ l) ]$ O, L配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
* }6 X. x5 Y) }+ r: K4 V7 l) D+ |- B4 ~5 P1 l' A1 V. M
! T9 A* ?! P0 O" ^. N5 w
6 u0 B3 |8 D+ c2 E7 V: w通道一和二都配置成捕获上升沿。
' g+ s% S$ J, A6 }1 V) h
. K/ l+ M6 g- P) ^# _
& n2 O. X! D; z3 R' x0 P3 P0 S* C; a' h; P& D
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。/ H3 E8 U7 G- ?1 F) O! g, M' O
# d9 R. ?- p! Q: X
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); 9 [" Q2 l+ `1 k5 c" G3 h
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);. e- R! E9 m( [
- //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
9 p. G% n; X7 f* r/ j+ [. C+ s - {//hal库输入捕获回调函数、 ^5 Z" o) V' D6 V6 }* w& h( z
- if(htim->Instance == TIM2)1 w- j" N1 F" H9 A& x9 ]0 U5 j
- {//判断是否为TIM2% Y# m% \) T9 l1 ]* G- M
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一) _1 b0 r8 N! {# o
- TIM2_CaptureChannel1_Callback();1 j7 k% O( E( X: r
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)+ ~4 p% ^; t* X! ]: H
- TIM2_CaptureChannel2_Callback();: U: ]2 I/ H" a! u* q @
- }
$ w8 a- Z" @ w8 Y( j& @% T& | - if(htim->Instance == TIM4): u0 n, H+ z% m
- {' P2 h5 t5 m' f
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)7 V2 c; f) O% Z4 G1 _
- TIM4_CaptureChannel1_Callback();
, h k" Y7 s' s8 {( ]4 l) Q - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)# i1 U$ M1 A; }! o
- TIM4_CaptureChannel2_Callback();$ K! S9 v1 Q2 V8 Z W
- }
6 c9 X9 p" N w ` - }
, r I S. S+ Y - $ C: f. m& T- w$ @% K
8 W/ S+ s0 K& ^( O
) W4 L8 h; _6 L9 T5 Q6 K! q- void TIM2_CaptureChannel1_Callback(void), U0 _# C0 N, x# g+ r6 W& x
- {
i+ F( F! }6 Q' R6 `1 v - switch(tim2_ch1.capture_edge)
9 m [: D1 L- o! B! t - {
% F+ B' J% m! c, H/ i% ~ J9 _ - case RASING:
# y2 y! k% E+ w9 _) M - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);: f" q3 c: ? Q/ S7 |7 {3 W9 m* o4 v3 V
- tim2_ch1.capture_edge = FALLING;
: E. |5 v5 O3 G- M7 ~2 x -
. l$ t+ m* x8 p `8 m- `; s - tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
/ _. A3 C0 K0 s# I( j+ B - __HAL_TIM_SET_COUNTER(&htim2,0);
* M7 x) u/ s6 ~( u" _- p - break;* ?. C. ] n3 _9 [
- case FALLING:% l/ z+ r9 y& D! |9 v* ~
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);* a3 p4 e& O. i7 I" B: ~% X
- tim2_ch1.capture_edge = RASING;
2 \7 B9 O+ u& C( Z - tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2); ) a+ f/ ?5 t* g8 ^7 L
- }
m2 o X$ w4 j0 y9 x4 `" D9 ^
# L8 t4 g4 l/ V) C/ F/ o) V- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \$ S" T ~$ P( n
- do{ \
; f- F, D% `- l+ E - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \
" G8 [0 E ?. O8 N - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
7 Q+ @, @# `: M- n# S2 q d - }while(0)
复制代码
9 O4 Z E4 c( f8 N7 `' A J这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。0 W$ w+ q Z& Y% h. R8 e
: W- q( a3 q7 h( K/ m- d8 }9 }! u
- __HAL_TIM_GetCounter(&htim2)0 w7 z X3 e( N: G* `; N
- __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。4 t. M3 ^% z* f5 _
实验结果:50HZ方波捕获到的周期为20000us基本不变。0 [$ w5 a5 u& H, B
( U6 n% J3 _( S4 x+ Y/ S8 z
3 F, f; x. g' k: k9 T
4 ?- _ f+ b7 Z6 L. x |