初级会员

- 积分
- 163
- 金钱
- 163
- 注册时间
- 2015-8-5
- 在线时间
- 9 小时
|
1金钱
各位老师:
在下最近想通过32的两路定时器实现对步进电机的精确控制,也就是精确到脉冲数,初步的方案就是在PWM初始化中打开溢出中断,但是在实际做的过程中遇到如下问题:程序不能进入溢出中断,导致不能在中断中实现脉冲个数的统计,请问各位大神应该如何解决。
附代码如下:
//í¨1yTIM3oíTIM4à′êμÏÖ WM2¨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μÄ WMÂö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μÄ WMÂö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
|