OpenEdv-开源电子网

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

32定时器输出PWM可以开溢出中断吗?

[复制链接]

14

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-8-5
在线时间
9 小时
发表于 2016-11-2 22:23:05 | 显示全部楼层 |阅读模式
1金钱
各位老师:
                 在下最近想通过32的两路定时器实现对步进电机的精确控制,也就是精确到脉冲数,初步的方案就是在PWM初始化中打开溢出中断,但是在实际做的过程中遇到如下问题:程序不能进入溢出中断,导致不能在中断中实现脉冲个数的统计,请问各位大神应该如何解决。
附代码如下:
//í¨1yTIM3oíTIM4à′êμÏ&#214WM2¨DÎμÄ2úéú£¬½ø¶øà′¿ØÖÆ2½½øμç»ú


//tim4  ¡a¡a¡a¡a¡a¡a¡a¡aD¡2½½øμç»ú
//PWMêä3ö3õê¼»ˉ
u32 TIM4CH1_Real_step_VAL = 0;//D¡2½½øμç»úòѾ-×ß1yμÄ2½êy
u32 TIM4CH1_Wanner_step_VAL = 6400;//D¡2½½øμç»úÆúíû×ßμĽǶèËù¶Ôó|μÄ2½êy
u32 TIM3CH1_Real_step_VAL = 0;//′ó2½½øμç»úòѾ-×ß1yμÄ2½êy
u32 TIM3CH1_Wanner_step_VAL = 6400;//′ó2½½øμç»úÆúíû×ßμĽǶèËù¶Ôó|μÄ2½êy


//arr£o×Ô¶ˉ֨װÖμ
//psc£oê±ÖóÔ¤·ÖÆμêy
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);// ¶¨ê±Æ÷2-7ÎaAPB1é趨
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);  //ê1ÄüGPIOíaéèê±Öóê1Äü
                                                                                    

   //éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü,êä3öTIM1 CH1μ&#196WMÂö3å2¨DÎ,PB6
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

       
        TIM_TimeBaseStructure.TIM_Period = arr; //899,éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ         80K
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //0,éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ  2»·ÖÆμ
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
       
       
//        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;      //ÿ′Îòç3ö¶¼2úéú¸üDÂê¼t£»£¨D¼ó£©
       
       
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ


        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö3å¿í¶èμ÷ÖÆÄ£ê½2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è½Ïêä3öê1Äü
        TIM_OCInitStructure.TIM_Pulse = 0; //éèÖÃ′y×°èë2¶»ñ±è½Ï¼Ä′æÆ÷μÄÂö3åÖμ
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
        TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //¸ù¾YTIM_OCInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèTIMx
       
        //ÖD¶Ï·Ö×é3õê¼»ˉ
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //ÏèÕ¼óÅÏè¼¶2¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //′óóÅÏè¼¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷

  TIM_CtrlPWMOutputs(TIM4,ENABLE);        //MOE Ö÷êä3öê1Äü       

        TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH1Ô¤×°ÔØê1Äü         
       
        TIM_ARRPreloadConfig(TIM4, ENABLE); //ê1ÄüTIMxÔúARRéÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
       
       
//        TIM_ClearFlag(TIM4,TIM_FLAG_Update);          //ÖD¶Ï±ê־λÇåá㣨D¼ó£©
       
       
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//ÔËDD¸üD£¨òç3ö£©ÖD¶Ï
       
        TIM_Cmd(TIM4, ENABLE);  //ê1ÄüTIM4

}



//tim3    --------′ó2½½øμç»ú
//PWMêä3ö3õê¼»ˉ
//arr£o×Ô¶ˉ֨װÖμ
//psc£oê±ÖóÔ¤·ÖÆμêy
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //ê1ÄüGPIOíaéèê±Öóê1Äü
                                                                                    

   //éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü,êä3öTIM1 CH1μ&#196WMÂö3å2¨DÎ,PA6
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

       
        TIM_TimeBaseStructure.TIM_Period = arr; //899,éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ         80K
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //0,éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ  2»·ÖÆμ
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
       
//        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;      //ÿ′Îòç3ö¶¼2úéú¸üDÂê¼t£»£¨D¼ó£©
       
       
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ


        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö3å¿í¶èμ÷ÖÆÄ£ê½2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è½Ïêä3öê1Äü
        TIM_OCInitStructure.TIM_Pulse = 0; //éèÖÃ′y×°èë2¶»ñ±è½Ï¼Ä′æÆ÷μÄÂö3åÖμ
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //¸ù¾YTIM_OCInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèTIMx
       
        //ÖD¶Ï·Ö×é3õê¼»ˉ
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //ÏèÕ¼óÅÏè¼¶2¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //′óóÅÏè¼¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
       

  TIM_CtrlPWMOutputs(TIM3,ENABLE);        //MOE Ö÷êä3öê1Äü       

        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH1Ô¤×°ÔØê1Äü         
       
        TIM_ARRPreloadConfig(TIM3, ENABLE); //ê1ÄüTIMxÔúARRéÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
       
//        TIM_ClearFlag(TIM4,TIM_FLAG_Update);          //ÖD¶Ï±ê־λÇåá㣨D¼ó£©
       
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//ÔËDD¸üD£¨òç3ö£©ÖD¶Ï
       
        TIM_Cmd(TIM3, ENABLE);  //ê1ÄüTIM3
       

}


//¶¨ê±Æ÷4òç3öÖD¶Ï·tÎñ3ìDò         
void TIM4_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//¶¨ê±Æ÷4·¢éúòç3öÖD¶Ï£¬ò2¾íêÇ2úéúáËò»¸öíêÕûμÄÂö3å2¨DΣ¬
                                       
                        {       
                                TIM4CH1_Real_step_VAL++;//×ß1yμÄÂö3åêy¼óò»
                                TIM_ClearITPendingBit(TIM4, TIM_IT_Update);//Çå3yÖD¶Ï±ê־λ
                                printf("%d\n",TIM4CH1_Real_step_VAL);
                                printf("123\r\n");
                                if(TIM4CH1_Wanner_step_VAL == TIM4CH1_Real_step_VAL)//TIM4CH1_Wanner_step_VAL
                                //′Ë′|μÄTIM4CH1_Wanner_step_VALÎa2½½øμç»úÆúíû2½êy£¬óDía½ç¸ø3öμÄÆúíû½Ç¶è¼ÆËã3ö
                                {
                                        TIM_Cmd(TIM4,DISABLE);
                                        TIM4CH1_Real_step_VAL = 0;
                                }
                        }                                                               
}
//¶¨ê±Æ÷3òç3öÖD¶Ï·tÎñ3ìDò
void TIM3_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//2¶»ñ1·¢éú2¶»ñê¼t
                                       
                        {       
                                TIM3CH1_Real_step_VAL++;                //×ß1yμÄÂö3åêy¼óò»
                                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//Çå3yÖD¶Ï±ê־λ
//                                printf("%d\n",TIM3CH1_Real_step_VAL);
//                                printf("123\r\n");
                                if(TIM3CH1_Wanner_step_VAL == TIM3CH1_Real_step_VAL)
                                //′Ë′|μÄTIM3CH1_Wanner_step_VALÎa′ó2½½øμç»úÆúíû2½êy£¬óDía½ç¸ø3öμÄÆúíû½Ç¶è¼ÆËã3ö
                                {
                                        TIM_Cmd(TIM3,DISABLE);
                                        TIM4CH1_Real_step_VAL = 0;
                                }
                        }                                                               
}

直接粘贴的,汉字变成乱码了。。。。。。

最佳答案

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

可以参考一下我们提供的步进电机驱动器例程,正反转控制以及脉冲计数。 http://www.openedv.com/forum.php?mod=viewthread&tid=76190&highlight=2md4850
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-2 22:23:06 | 显示全部楼层
可以参考一下我们提供的步进电机驱动器例程,正反转控制以及脉冲计数。
http://www.openedv.com/forum.php?mod=viewthread&tid=76190&highlight=2md4850
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 16:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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