你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 pwm输出同时开启溢出中断

[复制链接]
uamazing 提问时间:2018-8-7 17:01 /
在做步进电机的控制时,需要用到pwm脉冲计数,我想的是pwm输出的同时开启溢出中断,在服务函数里计算脉冲数。现在遇到的问题是,定时器中断和pwm输出 这两个代码分开的时候,两个都能正常运行,但是合在一起的时候就触发不了中断了。用的寄存器
收藏 评论11 发布时间:2018-8-7 17:01

举报

11个回答
uamazing 回答时间:2018-8-7 22:48:28
终于还是把程序调试完了,之前步进电机驱动的ena端线松了,导致实验现象与程序不符,又由于没有J-link,只能通过在程序中加LED灯来调试,就出现上面源程序的中断函数里有小灯和延时函数。花费了大量的时间来调试(这个故事告诉我们 ,拥有一个J-link是多么的美好
。简单总结一下,网上大多使用的是高级定时器来数脉冲,但是这次用到的板子上没有引出高级定时器,我就想通过通用定时器的溢出中断来计数脉冲,就目前来看,电机能按预期工作,尽管程序比较简单,但是对我这个菜鸟来说,能孤立完成已经很开心了

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

uamazing 回答时间:2018-8-7 17:06:55
void TIM3_PWM_Init(u16 arr,u16 psc)
{                                                          
        //´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖÃ
        RCC->APB1ENR|=1<<1;         //TIM3ʱÖÓʹÄÜ   
        RCC->APB2ENR|=1<<3;            //ʹÄÜPORTBʱÖÓ       
//        GPIOB->CRL&=0XFF0FFFFF;        //PB5Êä³ö
//        GPIOB->CRL|=0X00B00000;        //¸´Óù¦ÄÜÊä³ö           
  RCC->APB2ENR|=1<<2;            //ʹÄÜPORTAʱÖÓ       
  GPIOA->CRL&=0X0FFFFFFF;        //PA7Êä³ö
        GPIOA->CRL|=0XB0000000;        //¸´Óù¦ÄÜÊä³ö        
          
        RCC->APB2ENR|=1<<0;     //¿ªÆô¸¨ÖúʱÖÓ          
//        AFIO->MAPR&=0XFFFFF3FF; //Çå³ýMAPRµÄ[11:10]
//        AFIO->MAPR|=0<<10;      //²¿·ÖÖØÓ³Ïñ,TIM3_CH2->PA7

        TIM3->ARR=arr;                        //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ
        TIM3->PSC=psc;                        //Ô¤·ÖƵÆ÷²»·ÖƵ
       
        TIM3->CCMR1|=7<<12;          //CH2 PWM2ģʽ                 
        TIM3->CCMR1|=1<<11;         //CH2ԤװÔØʹÄÜ          
        TIM3->CCER|=3<<4;           //OC2 Êä³öʹÄÜ          ,Êä³ö¼«ÐÔΪµÍ
        TIM3->DIER|=1<<0;   //ÔÊÐí¸üÐÂÖжÏ
        TIM3->DIER|=1<<6;   //ÔÊÐí´¥·¢ÖжÏ
        TIM3->DIER|=1<<2;   //ÔÊÐí±È½Ï/²¶»ñ2ÖжÏ
        MY_NVIC_Init(1,3,TIM3_IRQn,2);//ÇÀÕ¼1£¬×ÓÓÅÏȼ¶3£¬×é2       
        //TIM3->CCER|=1<<4;           //OC2 Êä³öʹÄÜ        £¬ Êä³ö¼«ÐÔΪ¸ß
        TIM3->CR1=0x0080;           //ARPEʹÄÜ
        TIM3->CR1|=0x03;            //ʹÄܶ¨Ê±Æ÷3 £¬²¢Ö»ÓÐÒç³ö´¥·¢ÖжϠ                                                                                 
}           
uamazing 回答时间:2018-8-7 17:07:25
void TIM3_IRQHandler(void)
{
  LED1=1;
  delay_ms(500);       
        if(TIM3->SR>>2&0X0001)//Òç³öÖжÏ
        {
                        pluse=pluse+1;                                                                                               
        }                                  
        TIM3->SR&=~(1<<2);//Çå³ýÖжϱê־λ             
}
MrJiu 回答时间:2018-8-7 17:41:09
首先,中断里面用delay_ms(500);,牛逼。。。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

rydy 回答时间:2018-8-7 18:04:56
代码中最大的问题中断里延时,推荐一种高效方法,资源够用的情况下,可以考虑结合DMA精确脉冲控制,不用频繁进入中断。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

uamazing 回答时间:2018-8-7 22:50:36
void TIM3_PWM_Init(u16 arr,u16 psc)
{       

        //´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖÃ
        RCC->APB1ENR|=1<<1;         //TIM3ʱÖÓʹÄÜ   
        RCC->APB2ENR|=1<<3;            //ʹÄÜPORTBʱÖÓ       
//        GPIOB->CRL&=0XFF0FFFFF;        //PB5Êä³ö
//        GPIOB->CRL|=0X00B00000;        //¸´Óù¦ÄÜÊä³ö           
  RCC->APB2ENR|=1<<2;            //ʹÄÜPORTAʱÖÓ       
  GPIOA->CRL&=0X0FFFFFFF;        //PA7Êä³ö
        GPIOA->CRL|=0XB0000000;        //¸´Óù¦ÄÜÊä³ö        
          
        RCC->APB2ENR|=1<<0;     //¿ªÆô¸¨ÖúʱÖÓ          
//        AFIO->MAPR&=0XFFFFF3FF; //Çå³ýMAPRµÄ[11:10]
//        AFIO->MAPR|=0<<10;      //²¿·ÖÖØÓ³Ïñ,TIM3_CH2->PA7

        TIM3->ARR=arr;                        //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ
        TIM3->PSC=psc;                        //Ô¤·ÖƵÆ÷²»·ÖƵ
       
        TIM3->CCMR1|=7<<12;          //CH2 PWM2ģʽ                 
        TIM3->CCMR1|=1<<11;         //CH2ԤװÔØʹÄÜ          
        TIM3->CCER|=3<<4;           //OC2 Êä³öʹÄÜ          ,Êä³ö¼«ÐÔΪµÍ
        TIM3->DIER|=1<<0;   //ÔÊÐí¸üÐÂÖжÏ
        TIM3->DIER|=1<<6;   //ÔÊÐí´¥·¢ÖжÏ
        TIM3->DIER|=1<<2;   //ÔÊÐí±È½Ï/²¶»ñ2ÖжϠ      
        //TIM3->CCER|=1<<4;           //OC2 Êä³öʹÄÜ        £¬ Êä³ö¼«ÐÔΪ¸ß
        TIM3->CR1=0x0080;           //ARPEʹÄÜ
        TIM3->CR1|=0x0005;            //ʹÄܶ¨Ê±Æ÷3 £¬²¢Ö»ÓÐÒç³ö´¥·¢ÖжϠ      

  MY_NVIC_Init(1,3,TIM3_IRQn,2);//ÇÀÕ¼1£¬×ÓÓÅÏȼ¶3£¬×é2       
}           
uamazing 回答时间:2018-8-7 22:51:18
extern u16 pluse;
void TIM3_IRQHandler(void)
{  
        if(TIM3->SR&0X0001)//Òç³öÖжÏ
        {   
                 
                        pluse++;
//      if(pluse>6400)               
//                        ENA=1;
               
        }                                  
        TIM3->SR&=~(1<<0);//Çå³ýÖжϱê־λ                 
}
uamazing 回答时间:2018-8-7 22:52:22
rydy 发表于 2018-8-7 18:04
代码中最大的问题中断里延时,推荐一种高效方法,资源够用的情况下,可以考虑结合DMA精确脉冲控制,不用频 ...

嗯嗯,学到DMA的时候试试,谢谢
uamazing 回答时间:2018-8-7 22:53:17
MrJiu 发表于 2018-8-7 17:41
首先,中断里面用delay_ms(500);,牛逼。。。

我是菜鸟啦,查了下资料,现在知道了,谢谢啦
feixiang20 回答时间:2018-8-7 23:10:25
看看类似GPIO_PinAFConfig(GPIOB,GPIO_PinSource1, GPIO_AF_TIM3); 的代码相似的问题,或许是几个参数没设置好,pwm或输入捕获有问题,修改几个数值看看呢
void myDelay(int t)
{
    while(t)
    {
        if(t>500)
        {
            delay_ms(500);
            t-=500;
        }
        else
        {
            delay_ms(t);
            t=0;
        }
    }
}

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

Glenxu 回答时间:2020-1-1 18:53:48
请问高手,是在PWM的中断中做计数吗?
还是触发单独的中断来计数(PWM脉冲个数)?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版