PWM2模式输出,有不正常的脉冲出现

2019-10-15 21:09发布

本帖最后由 llqzx 于 2016-12-27 13:55 编辑

1.png
如图,使用定时器的两个通道来输出频率相同,数目不同的脉冲,会在输出最后出现一个宽度为2us或者1us的不正常脉冲。
2.png

代码如下:
[mw_shl_code=c,true]void LSMV5()
{
        TIM3->CNT = 0;
        TIM3->CCER |=  1<<0;//OC1 输出使能
        TIM3->CCER |=  1<<4;//OC2 输出使能
        TIM3->CCER |=  1<<8;//OC3 输出使能
        TIM3->CR1 |= 0x01; //使能定时器3
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
        if(TIM3->SR & 0X0002)//捕捉比较1中断
        {
                LeftMotorXPulseCount++;
                if(LeftMotorXPulseCount >=20)
                {
                        TIM3->CCER &= 0xFFFE;//输出比较1输出禁止  
                        LeftMotorXPulseCount = 0;
                }
                TIM3->SR&=~(1<<1);//清除中断标志位
        }
        if(TIM3->SR & 0X0004)//捕捉比较2中断
        {
                LeftMotorYPulseCount++;
                if(LeftMotorYPulseCount >=10)
                {
                        TIM3->CCER &= 0xFFEF;//输出比较2预装载关闭
                        LeftMotorYPulseCount = 0;
                }
                TIM3->SR&=~(1<<2);//清除中断标志位
        }        
        if(TIM3->SR & 0X0008)//捕捉比较3中断
        {
                LeftMotorZPulseCount++;
                if(LeftMotorZPulseCount >=100)
                {
                        TIM3->CCER &= 0xFEFF;//输出比较3预装载关闭
                        LeftMotorZPulseCount = 0;
                }
                TIM3->SR&=~(1<<3);//清除中断标志位
        }               
}

//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
        RCC->APB1ENR |= 1<<1;//使能TIM3时钟
        RCC->APB2ENR |= 0x0d;//使能PORTA  PORTB AFIO时钟
        
        GPIOA->CRL &=0x00FFFFFF;
        GPIOA->CRL |=0xBB000000;//复用输出
        GPIOB->CRL &=0xFFFFFFF0;
        GPIOB->CRL |=0x0000000B;//复用输出
        GPIOA->ODR|=0<<6;      //PA.6输出低
        GPIOA->ODR|=0<<7;      //PA.7输出低
        GPIOB->ODR|=0<<0;      //PB.0输出低
        
        TIM3->ARR = arr;
        TIM3->PSC = psc;
        
        TIM3->CCMR1 |= 7<<4;//CH1 PWM2模式
        TIM3->CCMR1 |= 1<<3;//CH1预装载使能
//        TIM3->CCER |=  1<<0;//OC1 输出使能
        TIM3->DIER |= 1<<1; //捕捉比较1中断
        
        TIM3->CCMR1 |= 7<<12;//CH2 PWM2模式
        TIM3->CCMR1 |= 1<<11;//CH2预装载使能
//        TIM3->CCER |=  1<<4;//OC2 输出使能
        TIM3->DIER |= 1<<2; //捕捉比较2中断
        
        TIM3->CCMR2 |= 7<<4;//CH3 PWM2模式  
        TIM3->CCMR2 |= 1<<3;//CH3预装载使能
//        TIM3->CCER |=  1<<8;//OC3 输出使能
        TIM3->DIER |= 1<<3; //捕捉比较3中断

        MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2        
        TIM3->CCR1 = arr / 2;           
        TIM3->CCR2 = arr / 2;      
        TIM3->CCR3 = arr / 2;
        
        TIM3->CR1 |= 1<<7;//ARPE使能
//        TIM3->CR1 |= 0x01; //使能定时器3  

}[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
正点原子
1楼-- · 2019-10-16 01:14
因为你是在中断里面关闭的,进入中断的时候,到你关闭这段时间,就是这个脉冲的宽度了。
要关闭你得提前,到PWM刚刚发生变化的时候,就关闭
llqzx
2楼-- · 2019-10-16 04:46
求高手解答一下,是不是在关闭某个通道的输出后,会导致进入中断一次?
llqzx
3楼-- · 2019-10-16 07:56
 精彩回答 2  元偷偷看……
llqzx
4楼-- · 2019-10-16 12:18
正点原子 发表于 2016-12-27 13:55
因为你是在中断里面关闭的,进入中断的时候,到你关闭这段时间,就是这个脉冲的宽度了。
要关闭你得提前, ...

额 ,我问一下,因为我要用三个通道来控制三个电机,频率相同,输出的脉冲数可能不同,所以我在中断里去判断输出的脉冲数到了没有,到了就关闭该通道的输出。如果不放在中断里关,就没办法判断数目了啊…… 迷惑 求指教
llqzx
5楼-- · 2019-10-16 16:17
解决了,开启定时器的 更新中断 输出比较中断,在输出比较中断中计数,在更新中断中判断,一旦达到要输出的脉冲数,在更新中断中关闭输出或定时器即可。

一周热门 更多>