打印
[STM32F1]

STM32 定时器PWM输出总是多一个脉冲

[复制链接]
4818|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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模式,即初始电平是低电平,就看不到这个很小的脉冲,但由于使用上必须初始电平是高电平,所以这个问题必须
解决。不知道大家有没有遇到过这样的情况,实在是很奇怪,都快把我搞疯了

波形图1.PNG (399.52 KB )

输出两个脉冲

输出两个脉冲

波形图2.PNG (410.03 KB )

放大之后

放大之后
沙发
GilbertWu|  楼主 | 2015-6-5 11:10 | 只看该作者
感觉好像每次启动计时器就会有几个微秒的时间电平被拉低,然后再输出相应的PWM,不知是何故。初涉STM32,被搞疯了,总感觉还是乖乖的配置寄存器可靠一点

使用特权

评论回复
板凳
mmuuss586| | 2015-6-5 12:44 | 只看该作者
不知道,你打开和关闭PWM输出怎么写的;

看上面波形,像是你每次打开多了1个脉冲;

使用特权

评论回复
地板
wowow| | 2015-6-5 12:52 | 只看该作者
本帖最后由 wowow 于 2015-6-5 12:53 编辑

每次启动TIM时不要重复初始化,只需要初始化一次就行了。停止脉冲时一般用CR1的Enable或CCEP来控制(不同应用要求不一样,方式很多)。再次启动时只修改必要的参数,重新Enable或CCEP使能。

使用特权

评论回复
5
GilbertWu|  楼主 | 2015-6-5 13:03 | 只看该作者
mmuuss586 发表于 2015-6-5 12:44
不知道,你打开和关闭PWM输出怎么写的;

看上面波形,像是你每次打开多了1个脉冲; ...

直接开关定时器啊
TIM_Cmd(TIM2,ENABLE);  开启PWM
TIM_Cmd(TIM2,DISABLE); 关闭

使用特权

评论回复
6
GilbertWu|  楼主 | 2015-6-5 14:26 | 只看该作者
wowow 发表于 2015-6-5 12:52
每次启动TIM时不要重复初始化,只需要初始化一次就行了。停止脉冲时一般用CR1的Enable或CCEP来控制(不同应 ...

我是用库函数些的,每次开PWM,如果不重新配置TIM_TimeBaseInit()的话,得不到正确的PWM信号,单步调试发现,原先初始化好的寄存器,再配置时值会变化,尽管我没有配置这个参数

使用特权

评论回复
7
GilbertWu|  楼主 | 2015-6-5 17:19 | 只看该作者
我改为寄存器编写代码,就没有出现这问题了。可能是库函数对寄存器做了些其他的操作造成的,反正是解决了,对新手来说真是折磨呀。。。

使用特权

评论回复
8
古木风21| | 2016-7-6 19:33 | 只看该作者
楼主,我也遇到了同样的问题,能否帮忙指点迷津。。万谢。有尝试过对CNT赋值,但是都不理想。我初始化代码是:
                                TIM_DeInit(TIM5);
                                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

                               
                                TIM5->ARR = temp;                        //设定计数器自动重装值

                                TIM5->PSC =div_c;                        //预分频器设置
                                TIM5->CR1 |= 1<<4;           //向下计数模式

                                TIM5->CCMR2|=6<<4;            //CH3 PWM1模式       
                                TIM5->CCER |=1<<8;             //OC3 输出使能         
                                TIM5->CCR3 = temp / 2;  //设置了待装入捕获比较寄存器的脉冲值
                                TIM5->CCER |=1<<9;             //OC3 输出低电平
                               
                                TIM5->CCMR2|=1<<3;          //使能或者失能TIMx在CCR3上的预装载寄存器       

                                TIM5->CR1 |=0x0080;           //ARPE使能 自动重装载预装载允许位

                                GPIOA->CRL &= 0XFFFFF0FF;//PA7清0
                                GPIOA->CRL |= 0X00000B00;//复用功能输出(推挽50MHz输出)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

28

帖子

1

粉丝