简述:使用TIM2捕获pwm4 P+ u K2 e& O6 C- @$ r
IDE: KEILv5.272 j; t' i/ L& n
Firmware Package:STM32Cube FW_H7 V1.8.0
6 o/ T% D1 c, P. a0 M芯片:STM32H750VBT62 k: |# X2 S4 E& z+ I" y) ~
! W" b$ R# m( R) l% O$ j; s
2 P$ U) ^9 E- T% c
" S% C) I& Z7 |; N: [8 D开启tim2输入捕获
# K- a6 g6 V9 i& u$ E1 R0 G
5 f% p2 i1 N5 S& `* D' n4 r1 `2 p( d8 O z9 d& e
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
( x" B5 ^: p% f, f( ^$ K9 b. H8 v7 G# ]9 J
+ h3 k4 O% G" _
; P7 ?# K4 F S1 s) J通道一和二都配置成捕获上升沿。
: O* N9 _7 S) p' `- I+ Y+ N$ } M( I, i+ @* }
& @$ c9 T. T* W' j* v8 p w. `8 T/ m3 O) l
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。
. `7 q9 d* i, W, N1 s( N5 L* X/ N% ?& g6 ?& A# p7 }" {8 w7 \
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
, v' b. t; X4 Q. q- U1 n6 H$ p5 e - HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
- W3 @& }1 O; |: e- }) L - //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
; v i* L3 t2 \6 e' y! p - {//hal库输入捕获回调函数、" M, g# }- n" ?! Z8 ^" g, Z5 I4 g; W3 C
- if(htim->Instance == TIM2)" t$ M6 v% D( _1 i' R, s$ e4 F
- {//判断是否为TIM2
" X5 E/ g% Q" m" T - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一$ U( M/ d7 u" \+ r+ N# T
- TIM2_CaptureChannel1_Callback();
9 D. P6 D6 x( A - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
9 s, W% w" I# n% [ - TIM2_CaptureChannel2_Callback();1 O) D8 B- t+ ^3 M6 x. X1 ~2 a
- }
( |8 t+ ~# w' S6 N/ ` - if(htim->Instance == TIM4)
; m) H8 w$ T9 ?4 O, b - {
% n0 W7 N/ |2 |( j; z, z - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)/ m' p: \' ~0 q% o, o' b& ]
- TIM4_CaptureChannel1_Callback();
f3 d6 n J% u* s3 v - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
- H/ U' T& L/ o4 b( G& ~ - TIM4_CaptureChannel2_Callback();# W% f* o0 r& q7 ]
- }
( G) E& I! P$ X" `' z8 d - }
* Q2 u7 G9 h3 d
9 M* N. X c/ F0 }& X+ e- . I" E. x7 m, H- B
- S: g# p% g, p* _5 R3 C! `3 f- void TIM2_CaptureChannel1_Callback(void)
. g& Q9 n# t1 k. H) S - {
5 n+ L/ g5 P. X m9 X, [ - switch(tim2_ch1.capture_edge) Z1 d) A$ H1 m2 \) J2 ^" b
- {4 }. a& h' Q+ b
- case RASING:8 v& B: ~9 r( K) H4 G% q: R2 |+ J2 A
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);9 A3 |) S8 U8 f$ p3 _6 ~1 H6 f
- tim2_ch1.capture_edge = FALLING;
( n" W( w5 D+ G) E5 _ -
, V& U: @7 y T3 C& V - tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
% r h& T* Q) ?* I, R - __HAL_TIM_SET_COUNTER(&htim2,0);
3 Y" U: B4 [0 Z, N3 I& k - break;4 N& J! d$ N' |/ ?; Z
- case FALLING:
/ Y/ _ n/ ~7 t# G: X# q - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);: ^0 R1 w) {% V8 k/ T
- tim2_ch1.capture_edge = RASING; * Z; [4 \, b! w
- tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2);
0 j: Q2 f: Q8 s1 o9 ?- M' V - }
( @1 X$ H* K2 Q1 n1 ?7 R! x. M
. {' k) n x; Y$ P& U- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \
$ {/ _' o# U2 ~$ G0 k, d - do{ \
3 I# g. u/ `6 [& @, K O - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \9 U2 f' X I) T, X/ ?( B
- TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \$ A7 v! P! L/ S; Q( f
- }while(0)
复制代码 : ~" L b) F9 R" W
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。/ p7 o8 O2 L) M0 h
4 w$ q' B# m, x+ P" [
- __HAL_TIM_GetCounter(&htim2)2 c. B2 U9 m$ @' L2 l
- __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。+ V% u8 |2 h& ^4 Z
实验结果:50HZ方波捕获到的周期为20000us基本不变。
2 }! H$ t7 ~; S0 \( |- G5 X
# J! n4 ?" K" \* [5 b: I! q2 n- v. D" z
3 K1 T9 X8 u {( R9 L1 K |