简述:使用TIM2捕获pwm* U; O/ |1 ]4 l9 ?' D! B
IDE: KEILv5.27
2 j" }( [' e4 W$ d4 VFirmware Package:STM32Cube FW_H7 V1.8.0( D+ G! y1 h# g
芯片:STM32H750VBT6; C% }. u5 `( Y$ Q0 k) q
( [1 V# }7 k0 v3 ^0 x) {. Z8 T! l! z c7 b* R" |4 r8 _
. m6 k& |. H# ], y开启tim2输入捕获
+ k; V0 }: q, k" ?5 y) W5 Y5 N4 }: X3 j. o! S, o5 g
4 p+ E- b0 J' A8 [
配置PSC为200-1,这里主要是方便计算,计时器加一正好是1微妙。我配置的H750的主频为400M,APB1时钟为200M,并且我是用来测量50Hz的矩形波。所以PSC为200-1已经足够。ARR就取最大值即可。
& v7 O: R! Q3 |7 t1 `+ |; A6 ?- \+ Z. p+ H- h+ ^
5 N( N+ w; p; _! F: i: A
5 h- I# |# U6 A
通道一和二都配置成捕获上升沿。+ H) r: O' o2 l% H8 x! p# z
! k3 p' l0 V/ A0 X7 i+ S6 H- b+ {$ ^! _2 R
" M! Z3 ^- L% c% a+ r9 o
管脚配置成上拉或者下拉。在无信号输入的时候,保持稳定的电平。# n1 \- O. y. x% O: I$ N1 K5 X
6 [4 B2 C) B: g: e4 B! d2 u- HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
" O: Q$ ~" Y: U7 @( B* F/ F - HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);+ f0 g4 v7 {/ H9 I0 V; i5 O, O0 X
- //开启tim2两通道的输入捕获
复制代码- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
) ]0 ?% | x2 s4 C$ M2 M0 P: W( M3 u - {//hal库输入捕获回调函数、9 [3 v7 Z, i4 h( y) y# J5 `
- if(htim->Instance == TIM2); a) W/ D6 M; h* T; e5 w& d7 f
- {//判断是否为TIM2
+ H! F* l- _$ F7 ^ - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//判断是否为TIM2的通道一
& y" @- h0 E' {6 K* m; Z$ a - TIM2_CaptureChannel1_Callback();! H( q1 X+ M6 B
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)5 D8 f b$ }. i4 A/ Z
- TIM2_CaptureChannel2_Callback();, b; m% u1 d" t! g( U" v
- }
# g! k0 ?4 L. ]2 y, b- d# K% l - if(htim->Instance == TIM4). g3 Y5 D8 z- S/ U7 j
- {* \& z3 _" `; N% K+ ~6 \
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)% W6 J9 F% {% B
- TIM4_CaptureChannel1_Callback();
# ?" a9 R2 ?4 o6 z6 h( w5 n - if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2), R T: g9 V& u! R* f9 S* ]2 R p
- TIM4_CaptureChannel2_Callback();
: L" u3 c0 G7 C/ Y - }# s8 q8 E( m, u" F! N& M* z8 m% ~
- }$ u W" ^5 ]' P$ X* Y9 c* ]1 I% A
- 7 z; S; a7 a1 L+ Q! h- j$ t
- 3 @* o3 z2 m3 m' l5 R
, }# C/ K/ y$ A; n% W6 u; n- void TIM2_CaptureChannel1_Callback(void)
: _* N1 D( j% I( v, J; {& H$ ` - {
" ^: G2 g8 s1 y - switch(tim2_ch1.capture_edge)) y+ w% ~ H. d Q5 v ]7 X1 i% h
- {
, I( R' J" V. r0 M' z - case RASING:
4 G, ?) w" D& a/ O: `! H - __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);) r+ X# ^: L: @4 N ~0 y* P
- tim2_ch1.capture_edge = FALLING;
* B) k ]: l/ s$ N1 n7 f, d) Z+ x -
) \4 x3 ^3 _/ t5 d6 } - tim2_ch1.capture_period = __HAL_TIM_GetCounter(&htim2);
3 W; L# K* F) P9 e2 V& O' ` - __HAL_TIM_SET_COUNTER(&htim2,0);3 k0 U6 k/ l& X4 a6 o
- break;
. E. @. X9 [+ M+ o' U1 n - case FALLING:/ N' v- ~9 r) `# [. e/ C. N
- __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);. P/ C$ H2 [2 T! J) L+ d( b
- tim2_ch1.capture_edge = RASING;
8 _5 C2 g! I! j% B% P) M, @% J e - tim2_ch1.capture_half_period = __HAL_TIM_GetCounter(&htim2); . E9 T0 N% M& A8 i6 d2 w
- }
; n# d3 | Z% }: ~
8 `: q: T6 s+ E; y! _4 K8 N: q" ?- }
复制代码- #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \. k3 g0 C$ T3 p8 h. {
- do{ \
; F: D/ b1 K: u2 L. [9 B+ v - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \
. j9 P' [) a% B - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ Z% v4 \. \7 }" q8 p, d0 M
- }while(0)
复制代码 8 }& I8 A; M# P6 g' q2 ]
这一句话__HAL_TIM_SET_CAPTUREPOLARITY中就包含了清除原来通道的极性和设置型通道的极性。所以直接使用即可。
7 t2 g$ {! O& A: t$ p8 M( T* a5 J" v- f1 j; _7 j
- __HAL_TIM_GetCounter(&htim2)6 \# a9 t0 y- ]7 x+ n$ ]' w
- __HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_1)
复制代码 这两句话 第一句是用来获得计数器的值,一个是用来获得CCR1的值。CCR1是通道一的捕获/比较寄存器。CCR1包含了由上一次输入捕获事件传输的计数器值。所以在此中断里两句话的作用差不多。如果不在中断内调用,获得CCR1的值即可。由于我要在TIM4的中断中取获得TIM2的计数值,所以都使用了__HAL_TIM_GetCounter。& R' A( h2 D" K( |- w6 |! c
实验结果:50HZ方波捕获到的周期为20000us基本不变。
6 U: K/ a2 ^/ R- S2 v( M; k- h4 ?- P
+ N: ?* h+ A/ A/ R! [! A
4 a% A( S$ W5 P! E6 r: \- D! J |