在调试中发现关闭TIM1产生的PWM信号时,通过关闭定时器指令TIM_Cmd(TIM1, DISABLE); 会有不确定的高电平输出。
使用 TIM_CtrlPWMOutputs(TIM1, DISABLE);关闭引脚的PWM输出功能可以正常的关闭PWM输出。
TIM1的通道1的PA8连接一个三极管的基级,然后程序按照上面的步骤进行配置,会出现下面的情况,高电平转为低电平会有一个缓慢的下降沿,影响PWM的波形。
为了解决这个问题,可以按照下面的方法进行配置,在开关PWM时对GPIO进行重新配置。
void PWM_ON()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1); //GPIOA8复用为定时器1
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
//GPIOB0 复用功能,上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOA8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM1->CNT=0;//防止PWM信号的第一个脉冲宽度不确定的现象。
TIM_Cmd(TIM1, ENABLE); //使能TIM1
TIM_CtrlPWMOutputs(TIM1, ENABLE); //20201020
}
void PWM_OFF()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
//GPIOB0 复用功能,上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOA8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
TIM_CtrlPWMOutputs(TIM1, DISABLE); //20201020
TIM_Cmd(TIM1, DISABLE); //使能TIM1
}
TIM1->CNT=0;//防止PWM信号的第一个脉冲宽度不确定的现象。该现象如下图所示