|
用高级定时器TIM1产生一组互补PWM,用通用定时器TIM3输入捕获,测量PWM的频率和占空比。
7 O* }1 a8 X/ l6 T8 C; D- J1、互补PWM输出
. {8 Q5 o& m6 ?$ R2 {. a) I使用高级定时器1的CH1和CH1N通道,该定时器可以选用144M的高频率,对应选用输出引脚PA8和PA7,参考库函数使用手册的步骤,大概概括一下:
1 ^1 Y# V6 N ?$ X# X1.使能时钟和配置相应GPIO,几乎所有外设使用的第一步
. d& `0 N6 @2 B! w2.配置定时器分频值,重装载值,计数模式等基本参数% H9 z# E7 J k# R
3.配置OC参数,也就是OCInitStructure结构体,注意CHxN的输出状态要使能,才能输出互补/ D! X; w1 P+ X" N1 r
4.完成上面步骤就可以输出互补PWM了,如果需要死区等功能,再配置BDTR( p4 w2 B# Z! t4 Z
5.打开定时器,使能PWM输出& U( r9 b* D) F; X: w
下面是使用144M频率产生100k PWM的主要部分代码:
6 e# Z- j. K5 I6 I. z( m% G2 X' }RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
' ?+ E& T4 W2 j# O; L+ q1 L2 o0 D RCC_TIMCLKConfig(RCC_TIM1CLK_PLLCLK); // 选择144M时钟. E2 U# G8 g. M$ U& w C+ o6 c
TIM_TimeBaseInitStructure.TIM_Prescaler = 0;. S# B3 K2 ] |' [9 I( ?' M
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;& _4 `% z; S& M2 R; _& }
TIM_TimeBaseInitStructure.TIM_Period = 1440-1;//144M/100k=1440
O Z4 X6 J! J& Y5 z1 }& E% a TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
: f' B( ?( m- d' C8 _ TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;
$ k* P3 {2 [5 k. d$ q h TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);' A: K0 n; } S" D# W( i! v3 A/ U
TIM_OCStructInit(&TIM_OCInitStructure);- C) O4 D' b" p8 x
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
7 Y1 s/ ~1 l! `$ W \2 _5 V TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;& q, {& D& R" \6 K1 h4 N
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//开启互补通道/ P1 d% @* ]# K5 G2 `4 V6 w
TIM_OCInitStructure.TIM_Pulse =720;//脉宽,50%占空比,1440/2
! t) e# C* T4 O, `; u: O" [ TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
- y. c5 N% X0 @: z4 B TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- c) a9 D, h& M% d TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;% y5 U% |5 C4 U* g( M8 G
TIM_OC1Init(TIM1,&TIM_OCInitStructure);8 @3 l/ d4 P& V" D' L
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
3 P2 {' a- {3 d2 E9 F5 L TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;' V% q; D+ ~" G; T; g6 l8 n9 K3 T
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
" W* r* `; @& U3 a- W TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;) P+ Z9 V, s+ ~6 Y, A
TIM_BDTRInitStructure.TIM_DeadTime =1440*4/100;//5%死区,则实际占空比45%/ Z/ [0 C6 }8 m w6 L. M, A5 M2 D
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
* c/ j4 _1 D) p! r' k# I. q TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;6 R& C8 F4 }$ O
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
( o2 T* }! r S7 C7 }' N+ u6 e1 [ P TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
8 V* E5 [& r* l$ Q TIM_Cmd(TIM1,ENABLE);
4 W. u, M( g8 Q/ r8 b1 ?, }8 o TIM_CtrlPWMOutputs(TIM1,ENABLE);0 c9 q. n! W- W1 b% o1 E7 y
' X: L4 L8 t4 b. Z- U- K复制代码
# q4 z% S4 k7 }( ?用示波器可以查看输出波形。+ m2 G {2 h" _( ^! ?# F9 X4 U/ }
2、PWM输入捕获
9 i% b9 V k9 h9 W. B$ \; j用这个功能可以测量输入波形的频率或(和)占空比,使用的是定时器TIM3的Input capture mode,可以测量频率或者占空比,为了方便同时测量这两个量,使用该模式中的特殊情况PWM input mode |
|