
这个是STM32的PWM输出模式,STM32的TIM1模块是增强型的定时器模块,天生就是为电机控制而生,可以产生3组6路PWM,同时每组2路PWM为互补,并可以带有死区,可以用来驱动H桥。$ J! h) A; {$ @) N. F 下面的代码,是利用TIM1模块的1、2通道产生一共4路PWM的代码例子,类似代码也可以参考ST的固件库中相应example C语言: TIM1模块产生PWM,带死区/ i+ _0 G6 F& q0 ^* P! E //Step1.开启TIM和相应端口时钟 //启动GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \" |. [) a6 h: N6 |2 Z$ W( k RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\ ENABLE);; T& F: p! T( z Y7 v5 ~7 \ //启动AFIO8 I" V: _' h5 t9 n( A RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //启动TIM17 g {) n9 @8 p2 _ n- d RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);3 L& M7 ?9 \: k- o7 O& M 9 ]% i- B& @ B0 d& k# M: M //Step2. GPIO做相应设置,为AF输出 //PA.8/9口设置为TIM1的OC1输出口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;. U& _+ y5 H* }" M! V/ v5 D* [ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; U# s: @" }" q4 r$ [ r3 B GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: S8 h. Y, t& B/ }# m0 F+ q GPIO_Init(GPIOA, &GPIO_InitStructure);8 T( z& G$ z+ ~! r * m5 w- a9 w N5 }" c& S4 T //PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;6 U. i( b; L! c' z* V5 a* Y( u GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/ Z4 c7 s8 p$ m% D6 i GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);: S; R/ f7 H7 F1 }" P* G! B 6 l' {/ A) @" l' G1 j9 r5 ~ //Step3. TIM模块初始化 void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;9 D1 T/ I) X$ @. V; Q; g' o9 p TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //TIM1基本计数器设置(设置PWM频率) //频率=TIM1_CLK/(ARR+1) TIM_BaseInitStructure.TIM_Period = 1000-1;$ ?* E. F% y; S9 A: f( ?7 Z2 Y TIM_BaseInitStructure.TIM_Prescaler = 72-1; TIM_BaseInitStructure.TIM_ClockDivision = 0; TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; e& P" r% u6 m" b' x TIM_BaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure); //启用ARR的影子寄存器(直到产生更新事件才更改设置) TIM_ARRPreloadConfig(TIM1, ENABLE);: |+ K5 Y0 E( ~" \; ^. B9 x8 J, _ 8 k3 G7 _: E# i9 a6 N* |: I ! {: @5 _3 c# {& K: e0 {, @ //TIM1_OC1模块设置(设置1通道占空比)6 S# Q4 q& A5 [1 b) w TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;1 @0 S. W! F$ m4 z. t TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;6 K8 g5 X8 W1 L5 e/ f* G TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;9 N6 S+ J1 O, F6 ^' a0 M6 q) K! i TIM_OCInitStructure.TIM_Pulse = 120; TIM_OC1Init(TIM1, &TIM_OCInitStructure);- k9 H: u5 n9 A, M0 P //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置) TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);; @9 j& b+ N6 f7 a6 c3 p. H) e $ h/ s1 ]# p( M8 b% D9 ^5 H //TIM2_OC2模块设置(设置2通道占空比)5 u6 i$ Q! Z2 |# v6 h S3 F$ V* A TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 680; TIM_OC2Init(TIM1, &TIM_OCInitStructure); //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置) TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //死区设置 TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;' q% O+ l, g$ Z6 r. p' ~5 l4 ] TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;6 j2 p2 a8 l: b- q% e3 W TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;. z; C" X! ?' h1 g TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //这里调整死区大小0-0xff8 l Z2 p& J' ]% k5 P TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;/ ]' Y/ S" I2 @* C# m TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;8 U& [8 l1 W- v) B$ {, B) U TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); ( G5 u1 m5 o& m //TIM1开启% }9 q: C% J) P& c) ?4 H' r TIM_Cmd(TIM1, ENABLE); //TIM1_OC通道输出PWM(一定要加) TIM_CtrlPWMOutputs(TIM1, ENABLE); } % P- P2 [; @: M2 _$ r 其实,PWM模块还可以有很多花样可以玩,比方在异常时(如CPU时钟有问题),可以紧急关闭输出,以免发生电路烧毁等严重事故。 |
RE:STM32笔记(二)TIM模块产生PWM
RE:STM32笔记(二)TIM模块产生PWM
RE:STM32笔记(二)TIM模块产生PWM
RE:STM32笔记(二)TIM模块产生PWM
那 我 不早是 发明家了 。。。。
RE:STM32笔记(二)TIM模块产生PWM
回复:STM32笔记(二)TIM模块产生PWM