STM32的PWM波产生的问题总结
2018-06-28 来源:eefocus
使用的是STM32F103RC
问题:PWM占空比的计算结果是对的但是输出出现错误,对于新西达的电机没法解锁,原因是没理解寄存器的作用。
#include 'tim2_pwm.h' #include 'stm32f10x_tim.h' void Init_GPIO(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE); //OC1_PBA0 OC2_PBA1 OC3_PBA2 OC4_PBA3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void Init_TIMER2(void) { TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_BaseInitStructure.TIM_Period = 3000-1;//自动冲装载寄存器 TIM_BaseInitStructure.TIM_Prescaler = 72-1;//输出比较寄存器 TIM_BaseInitStructure.TIM_ClockDivision = 0; TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); } void Init_PWM(void) { TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //OC1 TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); //OC2 TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable); //OC3 TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable); //OC4 TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC4Init(TIM2, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable); TIM_CtrlPWMOutputs(TIM2,ENABLE); } /////////////////////////////////////// //////////////////////////////////////// void pwm(void) { Init_TIMER2(); Init_GPIO(); Init_PWM(); } empty
在代码片中的第20行的TIM_Period寄存器为自动重装载寄存器TIM_ARR的值,当计数器的值等于此值时定时器重新开始计数
在代码片中的第21行的TIM_Prescaler寄存器为预分频寄存器TIMx_PSC的值,是对于输入定时器的时钟进行分频
这两行的设置结果是PWM的输出频率为Fout=72000000/72/3000Hz;即输出的周期为3000us即3ms;
对于库函数:
TIM_SetCompare1(TIM2,999);
该函数中的999指的是高点平持续的计数数,其与TIM_Period寄存器的比值即为占空比。
则上述设置的高电平的持续时间为:1000*1us=1ms,满足新西达电机的解锁条件。
相关文章