|
用高级定时器TIM1产生一组互补PWM,用通用定时器TIM3输入捕获,测量PWM的频率和占空比。% _. y+ M+ [3 U: c Q
1、互补PWM输出% G( b% t" G# u+ _
使用高级定时器1的CH1和CH1N通道,该定时器可以选用144M的高频率,对应选用输出引脚PA8和PA7,参考库函数使用手册的步骤,大概概括一下:0 t9 S; |7 H4 t. x
1.使能时钟和配置相应GPIO,几乎所有外设使用的第一步
% q& _/ g( x3 P' D2.配置定时器分频值,重装载值,计数模式等基本参数
: {2 R1 y! G. b$ R# s3.配置OC参数,也就是OCInitStructure结构体,注意CHxN的输出状态要使能,才能输出互补7 s# Z& z" I0 `8 Q
4.完成上面步骤就可以输出互补PWM了,如果需要死区等功能,再配置BDTR7 {9 }' w8 k' L& _ X
5.打开定时器,使能PWM输出
$ T' u1 N% R9 U% r( J% U7 I8 A4 [下面是使用144M频率产生100k PWM的主要部分代码:* f7 S( G% z+ ]5 R/ k6 E
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);3 ?$ M: R O s
RCC_TIMCLKConfig(RCC_TIM1CLK_PLLCLK); // 选择144M时钟
( P) [/ J2 @( A3 P% N TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
/ b" K4 J# X8 a9 ]/ u9 R! H TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
+ f- B3 R d% F3 }5 m3 v% A; ?4 a TIM_TimeBaseInitStructure.TIM_Period = 1440-1;//144M/100k=1440
/ ^' D+ g, n. p, c) e5 F TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
* E: @" D, ]! Z9 J6 N0 C TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;$ \4 c. U' _9 U8 G3 [4 j
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
$ V' f# o; f/ {1 t7 v TIM_OCStructInit(&TIM_OCInitStructure);
# ^; v: n; b0 K! M2 E! v TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
3 Z' `" z* q5 M8 T+ `1 h# t TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;: z2 w! E% }' B
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//开启互补通道
% A$ p1 \( N3 f7 r1 G# i TIM_OCInitStructure.TIM_Pulse =720;//脉宽,50%占空比,1440/28 Q( w/ I& H8 B: G
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;4 m+ M2 L8 ]- T7 S% _- w
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;1 m( F a+ |0 _* y1 o( r
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
' l2 H( ^0 g! T& N TIM_OC1Init(TIM1,&TIM_OCInitStructure);
# A4 i& k' |/ D2 D/ [6 d, N9 M. g! V/ i- Q TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
( C8 X0 V1 C3 Z F TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;9 A3 |9 |) n# T7 R3 {- J8 J
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
: k: x, B5 H5 I! y. H& B, p8 [ TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
1 P+ l; v0 W/ P TIM_BDTRInitStructure.TIM_DeadTime =1440*4/100;//5%死区,则实际占空比45%6 A; j- g3 d( F- p0 _
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
. l9 |* ?) F5 i, R8 \% a0 ] TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
/ Y* v' b, o" |9 y: o TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;& N' a! ^. h" o+ v+ z2 U
TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
6 q t# b; |- l5 y% R) z3 | TIM_Cmd(TIM1,ENABLE);% S& h5 V: p5 u& V' R
TIM_CtrlPWMOutputs(TIM1,ENABLE);" _+ Y- v i$ ]
E- r9 s( K- }0 t4 h: w复制代码
5 `, t9 M0 r5 Z9 j8 }用示波器可以查看输出波形。: p k, k0 q: f B1 e5 J
2、PWM输入捕获" E- x8 X5 t+ j: A6 k
用这个功能可以测量输入波形的频率或(和)占空比,使用的是定时器TIM3的Input capture mode,可以测量频率或者占空比,为了方便同时测量这两个量,使用该模式中的特殊情况PWM input mode |
|