OpenEdv-开源电子网

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

跪求,STM32F103ZE外部中断偶尔进不了。

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-10-25
在线时间
4 小时
发表于 2016-10-25 12:30:34 | 显示全部楼层 |阅读模式
大家好,我用的是STM32的定时器控制步进电机,用光藕的隔离电路加光电传感器作为电机的原点感应。现在的问题是有时运行几个小时,有时一二天都没有问题,问题是突然偶尔不知道是不是中断没有响应导致电机到原点没有停,结果冲出去了。现在不知道如何是好!有没有大神或遇到过类似问题的帮忙解决一下。
http://www.openedv.com/static/image/smiley/default/smile.gif大家好,我是一名电子工程师主要是单片机及配套软硬开发,请多多关照!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-10-25
在线时间
4 小时
 楼主| 发表于 2016-10-25 12:40:09 | 显示全部楼层
贴上相关的代码:

void Exit_PE4(void)//Öá1
{   

        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO , ENABLE );

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOE, &GPIO_InitStructure);       
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
        EXTI_InitStructure.EXTI_Line = EXTI_Line4;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;      
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;            
        EXTI_Init(&EXTI_InitStructure);

        EXTI_GenerateSWInterrupt(EXTI_Line4);         
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;      
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}



void EXTI4_IRQHandler(void)
{     
  if(EXTI_GetITStatus(EXTI_Line4) != RESET)
  {       
          srd1.run_state = STOP;//这个标志位可以在定时器中断中关掉电机的定时器         
                EXTI_ClearITPendingBit(EXTI_Line4);
  }           
}




  void moto_irq(speedRampData *srd)
{
        if(srd->moto_id==1)
        {
          TIM1->ARR=srd->step_delay;       
        }
        else if(srd->moto_id==2)
        {
          TIM2->ARR=srd->step_delay;       
        }
        else if(srd->moto_id==3)
        {
          TIM3->ARR=srd->step_delay;
        }
        else if(srd->moto_id==4)
        {
          TIM4->ARR=srd->step_delay;       
        }
        else if(srd->moto_id==5)
        {
          TIM5->ARR=srd->step_delay;       
        }
        else if(srd->moto_id==6)
        {
          TIM6->ARR=srd->step_delay;       
        }
        else if(srd->moto_id==7)
        {
          TIM7->ARR=srd->step_delay;       
        }
        else if(srd->moto_id==8)
        {
          TIM8->ARR=srd->step_delay;       
        }
          
  if(srd->run_state)
  {
                 sm_driver_StepCounter(srd->dir,srd->moto_id);
  }                  
  srd->i++;
  if(srd->i==2)
  {
         srd->i=0;          
         switch(srd->run_state)
          {
            case STOP:
              srd->step_count = 0;
              srd->rest = 0;
                    srd->flag_pulse_end=1;
                                if(srd->moto_id==1)
                                {
                                        TIM_Cmd(TIM1, DISABLE);                  
                                }
                                else if(srd->moto_id==2)
                                {
                                        TIM_Cmd(TIM2, DISABLE);               
                                }
                                else if(srd->moto_id==3)
                                {
                                        TIM_Cmd(TIM3, DISABLE);       
                                }
                                else if(srd->moto_id==4)
                                {
                                        TIM_Cmd(TIM4, DISABLE);       
                                }
                                else if(srd->moto_id==5)
                                {
                                        TIM_Cmd(TIM5, DISABLE);               
                                }
                                else if(srd->moto_id==6)
                                {
                                        TIM_Cmd(TIM6, DISABLE);               
                                }
                                else if(srd->moto_id==7)
                                {
                                        TIM_Cmd(TIM7, DISABLE);       
                                }
                                else if(srd->moto_id==8)
                                {
                                        TIM_Cmd(TIM8, DISABLE);               
                                }
              break;
       
            case ACCEL:
              srd->step_count++;
              srd->accel_count++;
              srd->new_step_delay = srd->step_delay - (((2 * (long)srd->step_delay) + srd->rest)/(4 * srd->accel_count + 1));
              srd->rest = ((2 * (long)srd->step_delay)+srd->rest)%(4 * srd->accel_count + 1);
              if(srd->step_count >= srd->decel_start)
                    {
                srd->accel_count = srd->decel_val;
                srd->run_state = DECEL;
              }
              else if(srd->new_step_delay <= srd->min_delay)
                    {
                srd->last_accel_delay = srd->new_step_delay;
                srd->new_step_delay = srd->min_delay;
                srd->rest = 0;
                srd->run_state = RUN;
              }
              break;
       
            case RUN:
              srd->step_count++;
              srd->new_step_delay = srd->min_delay;
              if(srd->step_count >= srd->decel_start)
                    {
                srd->accel_count = srd->decel_val;
                srd->new_step_delay = srd->last_accel_delay;
                srd->run_state = DECEL;
              }
              break;
       
            case DECEL:
              srd->step_count++;
              srd->accel_count++;
//              srd->new_step_delay = srd->step_delay - (long)(2 * srd->step_delay + srd->rest)/(4 * srd->accel_count + 1);
//              srd->rest = (long)(2 * srd->step_delay+srd->rest)%(4 * srd->accel_count + 1);
                                srd->new_step_delay = srd->step_delay - (((2 * (long)srd->step_delay) + srd->rest)/(4 * srd->accel_count + 1));
              srd->rest = ((2 * (long)srd->step_delay)+srd->rest)%(4 * srd->accel_count + 1);
              if(srd->accel_count >= 0)
                    {
                srd->run_state = STOP;
              }
              break;
           }
          srd->step_delay = srd->new_step_delay;          
  }

}

$7WF6_}5H]LCTU60AE$XC4V.png
http://www.openedv.com/static/image/smiley/default/smile.gif大家好,我是一名电子工程师主要是单片机及配套软硬开发,请多多关照!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-10-25
在线时间
4 小时
 楼主| 发表于 2016-10-25 12:52:32 | 显示全部楼层
没人理我,不知到底是否是软件问题,还是硬件问题,照理说软件只要响应了中断一定会关掉定时器呀。难道是硬件,可是硬件不就是个光电有信号就会产生下降沿吗?实在是
http://www.openedv.com/static/image/smiley/default/smile.gif大家好,我是一名电子工程师主要是单片机及配套软硬开发,请多多关照!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 06:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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