简述:使用TIM2捕获pwm
1 H' y1 h, h7 S; n0 a) I; OIDE: KEILv5.271 c! B) w; s( ^
Firmware Package:STM32Cube FW_H7 V1.8.02 y4 w! e. O0 G3 C) g$ S
芯片:STM32H750VBT6- v7 a4 X. K/ c, B$ H* A _
6 ~6 m3 T( E1 R
2 `6 N3 {% `& o0 z- Y
. t# }4 O" u/ K- o1 m! J开启tim2输入捕获
! D4 V9 P1 H$ `3 O4 A* @
+ r- a+ Z) q# C, c/ I6 n' r0 V c7 e) G
; N: f0 a: u; e3 p配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
2 u7 I. e: V4 s( a
7 E, t) ~3 n- ~- o3 y9 G4 E' g0 e; L9 b
4 b- X+ `( v8 a9 ?0 K! Y- i6 b( |
通道一和二都配置成捕获上升沿。. y6 ]+ t; q# |) L6 d
0 `* L4 R' F5 O A2 F1 I9 i# o0 o7 Y. d, W, v4 G, Z
# b( e8 p5 I9 s% B( z5 @$ O8 D管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。
) }+ f5 H8 {5 L s! ~7 v0 n) L
" @0 B4 ^+ o# c- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); 5 ~$ f4 W' w2 R7 Y' U9 `4 u
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);& ]7 c* Q v5 B# \5 e' D5 w# v& j9 X
- //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
1 X4 P5 c8 H R, j - {//hal库输入捕获回调函数、3 Y) ]! H% \- M% Q" g/ V4 @$ F
- if(htim->Instance == TIM2)8 U! D4 F! N4 ]- Z. t4 p- d
- {//判断是否为TIM2
: F/ |& D8 [3 b; H6 [2 O - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
3 O5 m) M' ^. K7 z9 |3 Y - TIM2_CaptureChannel1_Callback(); q* Z& b M' n. G
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
( R: `' r, J. n- f9 a - TIM2_CaptureChannel2_Callback();1 |4 {" X3 _" v K/ S4 F
- }/ A9 M. z' r8 c; P/ k6 \
- if(htim->Instance == TIM4). g+ L) P. Q9 L. K6 |8 n- w
- {9 l$ Q- i2 g' q" [6 X0 k$ _
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
! t. ~8 A0 y/ o! i& h# F6 n3 z5 | - TIM4_CaptureChannel1_Callback(); `: L) H1 Q f
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)' \! V: O: y3 b+ `# j
- TIM4_CaptureChannel2_Callback();
. X: p# l$ y; R+ d - }) H7 \1 O* X9 E( H7 y* s# {1 b
- }
/ k4 z7 J' f7 @ - ; `) _) d4 V; E/ }5 q- E+ U
- 2 q) \( L7 A. n$ ]" U' F
5 K- ?6 Y1 X# f$ o" S5 j; _- void TIM2_CaptureChannel1_Callback(void)' l! l3 o2 }* j: d& v0 Q
- {
$ \$ @9 C& s; E0 p0 H - switch(tim2_ch1.capture_edge)
+ L6 x' u, }% j6 o1 n# N - {# }3 `; u" Y$ } e+ V/ H# I- c' Q
- case RASING:
/ W4 c# p8 G. ~ - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);# ?* ?- X& z }8 M. h, L: K" C
- tim2_ch1.capture_edge = FALLING;
' a5 v9 {) c" O* d0 { - " J/ C3 ? T& H/ n9 i
- tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);& m7 z. R( O5 `0 ]8 Y
- __HAL_TIM_SET_COUNTER(&htim2,0);
% S" C+ ^/ A* g- S - break;
. J: \) m% R2 a( \- u, V - case FALLING:
) P, x. f5 Q, b - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
. [' z3 ?$ O/ E% o* w: G% q# _ - tim2_ch1.capture_edge = RASING;
* S8 V X( f7 W g, f2 Q: T! a4 ?. m - tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2);
2 V% A& @# q4 @$ S' n - }/ T0 c& |- r% P: `
6 R& Q( p+ z3 x- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \
; ~8 o! a; m( O3 {# F+ \ - do{ \+ [/ U! F6 q$ c2 s
- TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \
5 D: X3 \+ ~$ ~9 Z - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
/ f, E' R j- g% M+ j6 l5 z w - }while(0)
复制代码 ( @* S) V5 m3 u9 `
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。4 F2 i4 B2 K. E+ w. ^% p
, `0 u+ f& n4 j- R- |7 d3 r0 A9 N6 [- __HAL_TIM_GetCounter(&htim2)
. a3 I, ~ {, Y* A - __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
) g- L2 j7 g5 F实验结果:50HZ方波捕获到的周期为20000us基本不变。
& w$ }0 i; w/ E& C0 C* q: Q: Q: \% A3 V4 U4 _5 l, X. z" C* [( j! F
! ?1 {, ^5 R' x- u, a2 F( h" _) c A2 C
|