简述:使用TIM2捕获pwm6 X$ a. X1 Q' P* @9 I, Q
IDE: KEILv5.27
. T/ ~4 H7 `2 `" w3 RFirmware Package:STM32Cube FW_H7 V1.8.0/ S* z; r( {9 ~5 o; Z
芯片:STM32H750VBT6
4 C- w/ L# T7 I& n. m3 v$ b8 C0 k( i0 j6 J$ e% X
3 h o9 a2 [3 i" H4 z0 W3 E) n
g0 e& J9 k, Z- O开启tim2输入捕获" \% T" l1 R- ]
% k# |, `' F+ x6 o e K N# o7 d, i0 O5 I4 b6 \( s4 q
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。4 _; D9 G I" F4 a) s) g
) H2 L: z4 M6 U* S
$ f! i. z. t f( G
@1 ~6 s( y8 }3 n通道一和二都配置成捕获上升沿。( E" N4 z( A3 j3 @
, {6 K' z @ }4 D" i
& K7 ?) K' ]) P4 a" {6 r8 _% N! O" b9 d& a
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。8 [9 e: c! ?7 c: |" }+ y0 D
" B0 h' ]4 F1 {% h9 {3 r
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
: ]6 }7 `8 T& n - HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
" e2 c% F' H# |/ f7 R& w - //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
( B# I% x3 S! Z5 y; G: v - {//hal库输入捕获回调函数、( j& ^9 E! w9 a N
- if(htim->Instance == TIM2)' ^ k9 _& k" h" q5 C
- {//判断是否为TIM2
; F+ h- n. h+ J% y - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
' Z& o: m6 H0 l( H. `# V" @/ C - TIM2_CaptureChannel1_Callback();
& ?6 R4 _+ t) F - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
5 M l! Q$ r# `! I: y C: U4 \ - TIM2_CaptureChannel2_Callback();
$ x8 L% P$ t: B4 s8 V; S( L& Q - }
T% ~4 p; i3 F' [- c - if(htim->Instance == TIM4)
' M) J5 H4 i: Y" ]0 S& `) I - {& Y7 A; {4 h0 \' i
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
9 p4 Y8 @1 p$ S+ L/ P# }( b; A - TIM4_CaptureChannel1_Callback();
' ~9 v2 Q1 S) H8 O4 I8 {$ Q. B - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)3 Z; ]; {( R0 c. {8 V) h
- TIM4_CaptureChannel2_Callback();# X6 u2 D! l/ L- ^6 q" @6 v
- }
2 g9 y4 a( T7 u6 |) b* d' x - }
# f& \/ i% p; Z9 w - ! G. f2 T8 \4 l, ~
- a7 w, \- b0 r2 O7 p5 d5 x
- / ?: t' R7 @, ~
- void TIM2_CaptureChannel1_Callback(void)
3 @! W* R: I* b/ |7 ] - {3 J* O& M }0 n) w
- switch(tim2_ch1.capture_edge)$ v8 `( I I2 b. l3 s
- {
) @2 l7 y$ P! A( L- C - case RASING:8 y- a! B5 V; ~9 O+ T
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
2 O. U* K( C# P W - tim2_ch1.capture_edge = FALLING; 8 F* R; C5 d+ j) }; Q
-
- C2 s- \' v" O6 l0 }9 e, N - tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);3 F3 t, O8 \. `' v4 G
- __HAL_TIM_SET_COUNTER(&htim2,0);
7 ~) A# M: E9 R8 D - break;0 M# ^% X0 D. b4 C5 C! I5 ]/ C& @
- case FALLING:9 [. G8 M' O: w% u1 ]8 @8 P
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
! f5 x$ b( r2 S( B5 T" X: m - tim2_ch1.capture_edge = RASING; # q/ _( Y+ u% T2 X, d* P4 T( R
- tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2);
+ _2 o& y& V& q, \) [ - }( j: e: `$ j& Q0 u7 a' L& ]
- ) ~) k) @ a( F; D4 y: A+ `
- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \
* o, n; o- @" l+ _. S - do{ \- V: K: u) ~8 O% t1 [0 k5 k
- TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \
( R% h7 C% R" e" e& n3 o3 p4 z - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
" o! H1 P" i0 b3 ~% ^* K, J - }while(0)
复制代码 ; k) J4 G/ ]" @0 X, Q ~5 G8 w
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
0 r8 V8 X" x7 x; F& s8 F* |9 y$ c
5 z7 I4 p3 q' z( I- __HAL_TIM_GetCounter(&htim2) n% F/ G0 [) j" `2 {$ F
- __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。 C) p0 _* [2 P! i* [7 S
实验结果:50HZ方波捕获到的周期为20000us基本不变。% y* \3 W. H# [
( @2 z( w. d$ E( L) m+ h# {
! M1 H0 l1 @6 S5 u' N. f+ y- S' T2 E, E' E' [' r; F6 P9 \
|