OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2299|回复: 5

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

[复制链接]

15

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2014-1-2
在线时间
62 小时
发表于 2016-12-27 13:55:24 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 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]

最佳答案

查看完整内容[请看2#楼]

因为你是在中断里面关闭的,进入中断的时候,到你关闭这段时间,就是这个脉冲的宽度了。 要关闭你得提前,到PWM刚刚发生变化的时候,就关闭
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-27 13:55:25 | 显示全部楼层
因为你是在中断里面关闭的,进入中断的时候,到你关闭这段时间,就是这个脉冲的宽度了。
要关闭你得提前,到PWM刚刚发生变化的时候,就关闭
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2014-1-2
在线时间
62 小时
 楼主| 发表于 2016-12-27 15:29:27 | 显示全部楼层
求高手解答一下,是不是在关闭某个通道的输出后,会导致进入中断一次?
回复

使用道具 举报

15

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2014-1-2
在线时间
62 小时
 楼主| 发表于 2016-12-27 22:35:40 | 显示全部楼层
正点原子 发表于 2016-12-27 13:55
因为你是在中断里面关闭的,进入中断的时候,到你关闭这段时间,就是这个脉冲的宽度了。
要关闭你得提前, ...

嗯 好,我试一下 谢谢原子哥
回复

使用道具 举报

15

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2014-1-2
在线时间
62 小时
 楼主| 发表于 2016-12-27 22:39:31 | 显示全部楼层
正点原子 发表于 2016-12-27 13:55
因为你是在中断里面关闭的,进入中断的时候,到你关闭这段时间,就是这个脉冲的宽度了。
要关闭你得提前, ...

额 ,我问一下,因为我要用三个通道来控制三个电机,频率相同,输出的脉冲数可能不同,所以我在中断里去判断输出的脉冲数到了没有,到了就关闭该通道的输出。如果不放在中断里关,就没办法判断数目了啊…… 迷惑 求指教
回复

使用道具 举报

15

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2014-1-2
在线时间
62 小时
 楼主| 发表于 2016-12-29 13:25:59 | 显示全部楼层
解决了,开启定时器的 更新中断 输出比较中断,在输出比较中断中计数,在更新中断中判断,一旦达到要输出的脉冲数,在更新中断中关闭输出或定时器即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-28 01:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表