本帖最后由 GilbertWu 于 2015-6-5 11:04 编辑
用stm32通用定时器,向上计数,PWM1模式,有效电平为高,即初始电平为高,然后在溢出中断函数中控制输出的脉冲数。可是实际应用中居然每次都多发一个脉冲,更为奇怪的是中断函数中居然计算不出这个脉冲(即没有进入中断),我是通过
另外的方式发现每次都多一个脉冲的。后来用示波器抓波形才发现的。下面是定时器配置的代码:
void CCW_Pulse_Output(uint16_t period)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = period;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Prescaler = 2;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_OCInitStructure.TIM_Pulse = (period+1)/2;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM2_ITConfigure();
TIM_Cmd(TIM2,ENABLE);
}
我每次输出两个脉冲,结果抓到的波形是这样的:
发现每次启动计数器后,会有一个很小的脉冲,放大之后看到只有几个微秒。导致每次都多一个脉冲,这个电平变化我在单步调试的时候是看不到的。
更为奇怪的是我如果设置为PWM2模式,即初始电平是低电平,就看不到这个很小的脉冲,但由于使用上必须初始电平是高电平,所以这个问题必须
解决。不知道大家有没有遇到过这样的情况,实在是很奇怪,都快把我搞疯了
|