各位朋友,最近调互补PWM遇到的问题,首先是使用的STM32F030C8T6,然后是TIM1为主定时器,TIM3为从定时器,进行固定数量的PWM波产生,但是我发现,每次波形结束都会有个小的尖峰,问问有没有办法解决。

void Master_PWM_Init(uint32_t TimerPsc,uint32_t TimerArr){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/*
GPIOA Configuration:
- TIM1_CH1P pin (PA.08)
- TIM1_CH1N pin (PA.07)
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2); //TIM1_CH1P
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_2); //TIM1_CH1N
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = TimerArr-1;
TIM_TimeBaseStructure.TIM_Prescaler = TimerPsc-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_InternalClockConfig(TIM1);
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 = TimerArr/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;
//空闲状态下都变成低电平
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
//TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_OC1);
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
//TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);
TIM_ARRPreloadConfig(TIM1, ENABLE); //Enable:修改ARR值(周期值)会在当前周期就变了,Disable:修改ARR值(周期值)会在下一周期生效;
TIM_OC1PreloadConfig(TIM1, ENABLE); //Enable:下一次更新事件时被更新;Disable:立即生效
TIM_Cmd(TIM1, DISABLE);
TIM_CtrlPWMOutputs(TIM1, DISABLE);
}
void Slave_TIM3_Init(uint32_t PulseNum){
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = PulseNum-1;
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_InternalClockConfig(TIM3);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR0);
//TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Gated);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_External1);
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
TIM_Cmd(TIM3,DISABLE);
}
void Accurate_PWM_NumOutput(uint32_t TimerPsc,uint32_t TimerArr,uint32_t PulseNum){
Slave_TIM3_Init(PulseNum);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
Master_PWM_Init(TimerPsc,TimerArr);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
void TIM3_IRQHandler(void){
if(TIM_GetITStatus(TIM3,TIM_IT_Update)){
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM_Cmd(TIM3, DISABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
TIM_Cmd(TIM1, DISABLE);
TIM_CtrlPWMOutputs(TIM1, DISABLE);
}
}