单脉冲模式简介
摘录《stm32f1参考手册》中文版:
单脉冲模式(OPM)是前述众多模式的一个特例。这种模式允许计数器响应一个激励,并在一个程序可控的延时之后,产生一个脉宽可程序控制的脉冲。
意思就是说,可以将某个电平信号作为激励,当定时器收到激励信号,还可以延时一定时间输出PWM信号。根据配置可以输出单个PWM或多个。
使用场景
目前用过两个使用单脉冲的场景,一个是利用交流电过0点信号控制加热丝加热,另一个是利用交流电过0电信号控制泵的吸力;
配置代码
void timer_one_pulse_config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t PrescalerValue = 0;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Compute the prescaler value */
PrescalerValue = (uint16_t) (72000000 / 1000000) - 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 7000;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* TIM4 PWM2 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 7000;//为0则输出全是有效电平,不会反转
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//TIM_OCIdleState_Set;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
/* TIM4 configuration in Input Capture Mode */
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);
/* One Pulse Mode selection */
//TIM_OPMode_Repetitive不清定时器的CEN位,但只要触发一次,后面关了触发信号,PWM还是照样输出;
//TIM_OPMode_Single 输出完脉冲后就清除CEN位,即关闭定时器;但每次触发信号一来,硬件又会开启定时器;所以有触发信号就有脉冲输出
TIM_SelectOnePulseMode(TIM3, TIM_OPMode_Single);
/* Input Trigger selection */
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
/* Slave Mode selection: Trigger Mode */
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
//TIM_Cmd(TIM3, ENABLE);//单脉冲模式下,可以硬件开启定时器
}
/**
* @brief 设置定时器单脉冲输出脉冲的延时,和脉宽
* @param[delay] 延时输出脉宽的时间,us
* @param[pulse] 脉宽时间,us
*/
void set_time_one_pulse(uint16_t delay,uint16_t pulse)
{
if(delay == 0)
{
TIM_SetCompare4(TIM3,TIM3->ARR);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,DISABLE);
return;
}
else if((RCC->APB1ENR & RCC_APB1Periph_TIM3) == 0)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
}
TIM_SetCompare4(TIM3,delay);
TIM_SetAutoreload(TIM3,delay+pulse);
}