关于PWM的输出波形问题
PWM波在使用过程中,会改变其频率,从而改变电机的转速,以实现需求功能。 现象: 在正常使用的过程中PWM波会出现丢失波形的情况。 解决: 原本使用这个函数对PWM进行修改频率。在使用过程中会把PWM波形丢失。
TIM8_Mode_Config(2250);
后改为
myCycle=2250; TIM_Cmd(ADVANCE_TIM, ENABLE);
通过修改PWM输出对应计时器的最大值,再重新使能定时器,即可做到对PWM波形的修改。
void TIM8_Mode_Config(u32 Cycle) //TIM8输出PWM波配置函数
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
// 开启TIMx_CLK,x[1,8]
RCC_APB2PeriphClockCmd(ADVANCE_TIM_CLK, ENABLE);
/* 累计 TIM_Period个后产生一个更新或者中断*/
//当定时器从0计数到1023,即为1024次,为一个定时周期
TIM_TimeBaseStructure.TIM_Period = 2-1;
// 高级控制定时器时钟源TIMxCLK = HCLK=180MHz
// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100000Hz
就是通过这里对计时器的最大值进行更改/
就是通过这里对计时器的最大值进行更改/
TIM_TimeBaseStructure.TIM_Prescaler = myCycle-1;
就是通过这里对计时器的最大值进行更改/
就是通过这里对计时器的最大值进行更改/
// 采样时钟分频
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
// 计数方式
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 重复计数器
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
// 初始化定时器TIMx, x[1,8]
TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
/*PWM模式配置*/
//配置为PWM模式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_Pulse = 1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
// TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
//使能通道1
TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);
/* 使能通道1重载 */
TIM_OC1PreloadConfig(ADVANCE_TIM, TIM_OCPreload_Enable);
// /* 自动输出使能,断路、死区时间和锁定配置 */
// TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
// TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
// TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
// TIM_BDTRInitStructure.TIM_DeadTime =0;
// TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
// TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
// TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
// TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);
//
// 使能定时器
TIM_Cmd(ADVANCE_TIM, ENABLE);
/* 主动输出使能 */
TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
}
