1.什么是单脉冲模式
意思就是通过某种事件触发后,只是输出单个脉冲---单周期pwm信号。用于电机驱动,可控硅过零检测驱动,是比较理想的路径。
2.实现方式
本次讨论的外部触发信号,来输出单脉冲。上官图
废话不多说,上码:
void PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 10000-1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
/* auto-reload preload enable */
TIM_ARRPreloadConfig(TIM3,ENABLE);
///
/* 配置定时器的输出比较 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 5000-1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
/* 配置定时器输入比较 */
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
// TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
// TIM_SelectOnePulseMode(TIM3,TIM_OPMode_Single);//开启单脉冲模式 第二次调用SetCompare一直产生不了波形,初步怀疑这个函数产生了某个事件,没有清除,导致的。
// TIM_Cmd(TIM3, ENABLE); //使能TIM3
/* 设置单脉冲模式 */
TIM_SelectOnePulseMode(TIM3, TIM_OPMode_Single);
/* 设置从模式触发输入 */
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
/* 设置从模式为触发模式 */
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
}
其中,有朋友的代码中么有 TIM_ARRPreloadConfig(TIM3,ENABLE); 自动重载,导致输出脉宽是不对的,这里特别注意。
相互学习,不足之处恳请批正!
//
TIM_ARRPreloadConfig(TIM3,ENABLE);关于这个之前以为需要使能,但是深入研究发现,这个并不需要,因为模式使能为了触发模式。
那么导致作者输出脉冲不对的原因是什么?笔者用此方法是做一个可控硅过零触发的项目,经过深入研究发现,是定时器的频率设置导致的。理论上,市电频率为50HZ,双向可控硅触发,则触发的频率是50*2=100HZ(正负半周都需要触发),但是实际因为频率误差,以及过零触发的延迟(硬件电路限制),导致所能控制的可控硅的的时间小于市电的半周期0.01s,因此笔者将timer的频率设置比100hz更大,大于101hz,问题解决。