简述:使用TIM2捕获pwm
% {$ O; b9 w. m' qIDE: KEILv5.27
1 |% a ^; M6 L) ?' ?% GFirmware Package:STM32Cube FW_H7 V1.8.0
0 E R+ ^, W. Y3 G" E7 [0 O芯片:STM32H750VBT63 i4 r* `# J' o' c: | G6 u: ]
- T1 H: G* | h. N; e4 \7 d+ Z1 W; M1 c7 ^4 ]
5 W- O( P4 y) ^7 ]' T3 F! L4 Q开启tim2输入捕获
% I7 y* V! d! a9 J& J$ f" E
% |$ |3 i2 \# v
9 f/ c A4 h8 d5 U7 u配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
2 Y& j' P ?* e' X2 X2 L* \6 f2 u7 g" g- `4 P0 W \
( S. W6 g7 s* H# N8 l8 s9 B9 [: A& o
通道一和二都配置成捕获上升沿。6 J! e1 h! N2 O6 R- i9 |: o8 I
+ |4 \1 n& B) _& K( P' t: D
) v3 S! ~! u1 D! ]) i( n
# ~+ D* h8 S9 W管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。( g4 _$ R, L9 F. c# n- {
6 L) {: _3 e7 G; y6 \2 L! N% \- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); , |" g A( r* i! u, G7 ?! h% k* y
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);7 R3 q) I% G4 w$ S9 q- E5 W( x4 W& W
- //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) R9 | u- @) M, w4 `/ m" V' W4 F9 v
- {//hal库输入捕获回调函数、
/ |* K: Y4 m2 X - if(htim->Instance == TIM2)
+ c( K# C _0 p: i - {//判断是否为TIM2 k6 {3 S( ]. j
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一( S1 e' \' G( x* u
- TIM2_CaptureChannel1_Callback();1 d0 v: l# L) D0 x e* X/ e5 A9 D
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)2 C. }. i3 @" D; H" q
- TIM2_CaptureChannel2_Callback();1 G9 {+ A+ C$ P" K1 V9 n1 L/ E
- }5 o! B4 @: f7 d. ^1 t- f$ j8 H. U5 I
- if(htim->Instance == TIM4)% l* }+ E$ M/ k+ a$ h3 W
- {6 I ^" [9 v1 D' B
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
1 @ H% [7 ]# Z. N+ v8 x" d; G- f, ] - TIM4_CaptureChannel1_Callback();8 S1 l- v+ k3 ?5 a+ x
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)1 O0 R0 v# N7 K/ v1 \: x
- TIM4_CaptureChannel2_Callback();8 y7 z z$ f7 A2 C! }
- }0 T! T$ v7 x& _/ a: h
- }/ _1 O5 U3 B! }4 P2 p% m$ O1 D
- ( V. ^ t+ y7 c" M
- W2 j, G3 h6 b$ W: F' n7 M
- . `( c1 P% v) Q" b1 c
- void TIM2_CaptureChannel1_Callback(void)
5 R! Z. ~/ `; W! T - {
& y" _. t0 x6 u3 B+ ]* P* s6 T, l - switch(tim2_ch1.capture_edge)
: B' I" W5 {! y! X3 F) e* S - {; ]' y: F/ A2 @& ]: e1 h# f+ N
- case RASING:
1 H2 p# g* ]& r- M- D# Z - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);( ` B& M1 _- N4 x$ t9 M' }
- tim2_ch1.capture_edge = FALLING; ( s# G& L4 R6 X- H* F3 l+ B
- ) y- b/ n1 |* G& O
- tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
: c) i, W6 v6 U& ]' `% h0 | - __HAL_TIM_SET_COUNTER(&htim2,0);. G9 E( e: h- y3 g
- break;
& M" T/ x, f$ y - case FALLING:: P4 y/ @9 G8 E: |3 ^ b& N! u! n. E
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
% Y7 @- \5 Y9 U& v. k" f7 g5 M% K - tim2_ch1.capture_edge = RASING;
% m' V- N4 j/ } - tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2); " _. n5 U" y) Y) n. @" L0 k
- }3 S/ W# R) D# c* [- H
- T1 y$ M! c( b7 k! G3 k- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \2 N9 [1 A/ e8 b* d
- do{ \
0 G( S, G1 Q, o - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \' l, S- l+ I, k$ {( q( C1 c
- TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
+ p# j% N3 @ o$ a9 B/ w4 x* v! G - }while(0)
复制代码 # R4 z4 @/ R; N9 R
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。! l% a0 x" g1 W6 P
/ m3 v) a: L% P! y3 M7 }5 W
- __HAL_TIM_GetCounter(&htim2)
- ~9 S. J' c8 Q7 g - __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。
8 C& ~ D# A# _6 L' ^3 u6 c+ _% d实验结果:50HZ方波捕获到的周期为20000us基本不变。( t' P0 z) A: v# Q+ W! H# f
/ q& W; U+ L# ?( o) ~1 |: x5 y/ w5 v$ X, k: t
* h8 Y4 o0 s/ F- o- V$ H. {% W
|