简述:使用TIM2捕获pwm3 r; h& G, w- o. [( i& T2 `
IDE: KEILv5.27
; \+ y& _& |( x d6 v* UFirmware Package:STM32Cube FW_H7 V1.8.0; R4 K( x. J% D( S- X
芯片:STM32H750VBT6
5 _ P$ e, f* g$ Z
) X! B! s; t8 c) y$ W1 J, ^( S# ~" u* b( H4 c! }) l4 i ?
L6 }0 t: S' m: S# v" o9 ^
开启tim2输入捕获
& K( X9 ]6 n6 Q4 f# N9 F9 _; S' x) g6 w0 J) ~9 _
9 u$ j5 K: h' _配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。4 }* Y' H8 R" J# k; W& q( E9 v/ @
( g' @9 }0 @' D- e
9 O: o6 r0 R4 p% L' A* S) Y9 }+ b9 B
通道一和二都配置成捕获上升沿。! `/ t" w* K8 o) C# Y I# o5 F
( b$ g% o4 j8 Z& Z: z& q" s
3 G' _! ^5 X8 W! z+ ]6 C! \9 X" q4 A
$ j# r4 G2 j: T
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。- U+ \; v. G: u& q" P# R1 P9 M1 |
3 a3 J4 X8 w' e3 _" C7 c
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); ! ?, }* y4 J$ G8 [
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);& x% Q4 O) x0 O% e& R
- //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)' S: r/ [' T4 {% V% P
- {//hal库输入捕获回调函数、
! j- N; N7 e$ K% c: p5 @) _ - if(htim->Instance == TIM2)
: W* v% L) I( O* {; p' W1 { - {//判断是否为TIM29 ~7 \6 M `& T g" ~
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一- u/ @6 u0 Z4 J) ?% e; N1 ?
- TIM2_CaptureChannel1_Callback();# o2 K1 C/ t0 s; q& x @. H& ~. ?( b
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
0 G6 g, ~' y' q4 i6 F( T3 \ - TIM2_CaptureChannel2_Callback();
7 ?, i; V: g: R- _6 g - }
, B8 t5 T% g! D - if(htim->Instance == TIM4)
1 R" _- B/ o r5 d" D - {8 b8 P9 @# o/ V: P& E- l3 t: I( Y
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
! z& U) Y. E* S4 {5 V - TIM4_CaptureChannel1_Callback();
& h% @8 J4 v3 }, S; P/ ?6 ]. O" M9 p; Y - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
- o; B% X& n P! i- f0 K - TIM4_CaptureChannel2_Callback();
3 Y; s7 {7 c9 Q% V3 \3 f; K) l$ E - }0 w( ~4 l: h' y3 a+ A
- }5 f' y C! B$ o1 R. U% L" A
- % H1 l2 X7 i4 L3 R9 T: M
- % Q# l" S& a9 P1 L- g
. Z) r* g+ p: W6 j% K* ?5 o( S- void TIM2_CaptureChannel1_Callback(void), ^8 ]! H: o! l$ W( }+ F5 Y4 f
- {
( ]3 Z8 \ S1 X2 H& e - switch(tim2_ch1.capture_edge)" r! s2 A; S+ w) j& N+ D$ q0 v
- {( K% ` u" f) h! `: p% u' V
- case RASING:& J3 k- K" t5 l! o* ]
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);/ d# A! J1 R; a+ n- U9 `
- tim2_ch1.capture_edge = FALLING;
7 q6 w5 r" F$ L; U* h6 R8 z -
. T! W' _0 N) \0 E) M - tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);3 s" W/ w/ ]# P
- __HAL_TIM_SET_COUNTER(&htim2,0); z( I0 N4 e4 s- I q3 G$ f+ ~+ {) o
- break;
) y: ]( K, r. g E - case FALLING:
+ O& p' r# i5 [; y: n - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
% a8 @$ }! V, ` Z1 \ - tim2_ch1.capture_edge = RASING;
; H/ s4 k, O6 {; Q1 y' L - tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2);
$ r7 m( H% {" d8 l9 I f/ G- U2 X - }
6 m# P, C& U2 X" ~6 r- e& O9 `
. t) X5 c" l& H" o* |4 G$ i- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \
% m) J% V7 Y/ d/ \) n5 z - do{ \) _6 L9 M) Y$ \5 y
- TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \
' P3 [) X# s7 e+ z$ ? - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
- B; E8 R1 e2 k7 `" H4 a - }while(0)
复制代码
0 w0 r9 y o' t5 Z这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
# B2 q2 m, q6 O6 d k6 G0 ^
1 V7 `- @% J* P8 s0 Q9 c4 _+ n- __HAL_TIM_GetCounter(&htim2)! R/ j9 {* T8 C) G$ Z, z
- __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。9 B8 a) O5 C. S7 r
实验结果:50HZ方波捕获到的周期为20000us基本不变。
4 ]6 z! L6 ?: Y+ W5 V
6 s, ?8 E7 {* M y7 J$ k; w' t0 ?; G
6 {& Q0 C' g1 k4 C
|