简述:使用TIM2捕获pwm; g9 j: Z$ Z% M( C5 L
IDE: KEILv5.27: l8 q+ v3 n) D& s+ W
Firmware Package:STM32Cube FW_H7 V1.8.0
8 X2 [3 C" d- t; I" d9 S7 _9 |芯片:STM32H750VBT6
7 p; \# a, u8 e; F# [. l' A5 a3 g) x$ O0 i2 w- |! ?3 i
( W" e% M; Q( g. K2 Q" c
7 y3 S* _ t+ H, z; P+ F9 ^! f
开启tim2输入捕获3 w) a) n3 V$ N) q5 s
R! ^% u. @. p8 X7 c
$ o. Y! V- o" n: B/ p3 d配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
0 A5 ]3 Y& i2 ?3 t( N O% \: L( y
- O# F0 A* N! T& c1 ~2 v
9 r( M* { F* F) q: j0 N6 {4 @7 q' m) d7 X, p; \, O6 V" E/ u8 E! t2 |, V
通道一和二都配置成捕获上升沿。3 M& [& c7 d3 A
2 |7 R. j: p! [ N9 r
. i% o, H" m$ ]! Z- Y- O6 u8 w. W6 l. [3 {5 p6 P2 i
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。1 K, ?5 M- Y5 s6 [( ^$ x0 p1 l
) `2 ^ [8 l, ]
- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
3 U# k+ h4 C1 d m4 C2 J - HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);2 Y- }. T# j" [; g
- //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
, m) u( v# o& L" k5 R - {//hal库输入捕获回调函数、4 D9 E' J- _% s' K& e
- if(htim->Instance == TIM2)
8 h& R6 J6 r) b9 }$ A - {//判断是否为TIM2
5 \8 `0 @+ m0 L+ M7 ]2 z - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一+ D. e, h4 a% c9 e5 D/ c
- TIM2_CaptureChannel1_Callback();
+ v8 N5 B! R$ N - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)$ j: c, D! Q3 q9 K
- TIM2_CaptureChannel2_Callback();
$ Q' |5 U, c1 c - }- C" P7 W% P" a7 j" @+ V0 M! @
- if(htim->Instance == TIM4)
! A8 \3 W, f3 B - {
4 s. R* j/ p5 \5 s6 f - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)2 ^& a& T& v0 H8 ^& z# T
- TIM4_CaptureChannel1_Callback();
. Z* y# }. t1 G - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)8 U0 i* O s$ n- h7 s
- TIM4_CaptureChannel2_Callback();& w3 q$ j ^( n) }9 w! o
- }
) }2 A) ]4 D- V: w$ ?9 K$ x0 Q - }& w( K* ?$ r8 a
* l+ l2 l) R- }# Y& J0 [- 5 e" Q" V6 U- C6 d( j5 s
# I( \8 ~* P( A9 B( ^- void TIM2_CaptureChannel1_Callback(void)8 S( ~$ [8 f9 G4 H
- {
; r; T+ J2 W S! [, M3 ~9 C - switch(tim2_ch1.capture_edge)
2 J# }; T* Y( g - {
/ ?2 R) r* [. W - case RASING:
( J+ [7 k$ g6 q# ^. B - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
' W) R% C! w1 d8 _5 ~7 B3 D$ ] - tim2_ch1.capture_edge = FALLING; / n$ J3 H6 M) {/ ^1 u% A1 `6 J% c
- 8 l1 U; ^" m1 e# s6 g2 Q- t4 L
- tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);5 p1 Q i9 U& v
- __HAL_TIM_SET_COUNTER(&htim2,0);. v/ v8 h. U. H' ]6 S' O0 q( R
- break;
% R& i ^) q$ e9 u0 K8 l - case FALLING:
; F9 O* q. [7 e; H$ _3 B, E - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);6 Y0 c* g5 n+ K. X$ K/ o
- tim2_ch1.capture_edge = RASING;
- _' {+ Z" O9 o5 z - tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2); 7 R2 _& U: }2 y% I/ y
- }) J2 [# }+ w5 Y5 ~+ B
- 9 F: W- J( J; P& C
- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \
. i% T! H t$ T; C, N - do{ \5 [9 C7 c$ H& @1 M6 m" l
- TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ e* a8 o8 T' ?) ^0 M' G4 J i
- TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \
+ W z/ \5 A4 F - }while(0)
复制代码
, w7 l8 J" a0 R& k8 v: ^这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
' D$ p6 V9 |" G7 n7 _6 ^$ w+ ^% B# t6 `. G9 V
- __HAL_TIM_GetCounter(&htim2)
; i- ?' w4 k& @, q+ R: U - __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。* y4 e$ L* c0 t& s- M+ B
实验结果:50HZ方波捕获到的周期为20000us基本不变。
, Q- C3 w( o3 h. a1 c4 w
! `: l; z p+ \2 U. y" E6 Q$ X! W" y* s- r' s* c" p$ u
7 j5 k" |' `- w8 c |