
这个是STM32的PWM输出模式,STM32的TIM1模块是增强型的定时器模块,天生就是为电机控制而生,可以产生3组6路PWM,同时每组2路PWM为互补,并可以带有死区,可以用来驱动H桥。 下面的代码,是利用TIM1模块的1、2通道产生一共4路PWM的代码例子,类似代码也可以参考ST的固件库中相应example C语言: TIM1模块产生PWM,带死区 //Step1.开启TIM和相应端口时钟6 i* p, n- S- @7 a! o //启动GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \ RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\ ENABLE); //启动AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);: r$ I2 B. M% [* K: _) y! g //启动TIM11 k2 n& F7 x& ?- m+ Q RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);; E% x0 R1 g1 Z" v //Step2. GPIO做相应设置,为AF输出" J+ W, K. ?8 l //PA.8/9口设置为TIM1的OC1输出口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;9 k, u. t8 s7 R& f GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;( p1 D2 @/ V" t- b& b. L GPIO_Init(GPIOA, &GPIO_InitStructure); 2 C" s0 n' \, ? Q% i! I) T, U //PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);# K- t- C( G; | ! Z7 @: I( q3 N% G# R2 L //Step3. TIM模块初始化0 K) p7 ~8 @( _# T) B void TIM_Configuration(void)1 {) ~$ O- \/ ]/ v0 o/ e {) i" {& c( D4 t# B TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure;3 \! K. H5 I$ Y; m TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //TIM1基本计数器设置(设置PWM频率) //频率=TIM1_CLK/(ARR+1)" Z$ L) I# ]$ \4 f6 J3 X TIM_BaseInitStructure.TIM_Period = 1000-1;( y( |; r% ~! }4 m% Y TIM_BaseInitStructure.TIM_Prescaler = 72-1; TIM_BaseInitStructure.TIM_ClockDivision = 0;2 ]2 a9 [6 H" E! z' T TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_BaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure); //启用ARR的影子寄存器(直到产生更新事件才更改设置) TIM_ARRPreloadConfig(TIM1, ENABLE);5 r4 T4 k( u6 z, O1 e 5 l5 F) q! I3 M; i E+ N! ~$ o# } 2 K! [" w0 @1 c) k& S //TIM1_OC1模块设置(设置1通道占空比) TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;* B7 @( k6 f) ]) y, g0 m$ t/ ] T TIM_OCInitStructure.TIM_Pulse = 120; TIM_OC1Init(TIM1, &TIM_OCInitStructure);5 V3 [ U& \4 S$ R //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)6 z7 o+ H0 X- d+ N TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //TIM2_OC2模块设置(设置2通道占空比); ]9 M/ `9 H5 z" V9 B7 m. |3 a TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;2 d* |- \* B3 K; P TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;! E" b0 @7 j. P2 y5 S& c* w TIM_OCInitStructure.TIM_Pulse = 680;. {1 h% |; i5 ` TIM_OC2Init(TIM1, &TIM_OCInitStructure); //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)0 K# y) J9 x0 F TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);5 S, C/ X& g8 e * Z8 R1 d3 x' x8 ? //死区设置" C8 n! j/ \" r# b+ A TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;) T3 \$ V! k" q: Q3 o+ X' k1 F8 q TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //这里调整死区大小0-0xff- C2 e. r# }& e TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;' y( B* Y* Z& E" n: | TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);4 e) z+ U. V" r //TIM1开启 TIM_Cmd(TIM1, ENABLE);& x8 G- r/ e) f& L //TIM1_OC通道输出PWM(一定要加)/ ^8 v9 G r) U* |' b! j TIM_CtrlPWMOutputs(TIM1, ENABLE); ! k% h/ w$ T ?8 Z! [ } & t+ d2 ]0 D& j& E, P( C 其实,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