在 dspic33ep 上完成 ISR 后,控制覆盖条件主

问题描述

我正在尝试使用顺时针和逆时针方向旋转直流电机 两个按钮(实际上有三个,另一个是按钮3进入手动模式)和 电机轴上还附有标志,由电感传感器检测。
这是我的步骤,

  1. 所以首先,我会根据 4 个拨码开关值生成一些延迟
  2. 延迟后,电机开始顺时针旋转,直到检测到标志 (此步骤和以上步骤均发生在 main 函数中)
  3. 一旦找到标志,就会产生一个中断(INT2)并停止和启动电机 逆时针方向持续 5 秒并停止(此步骤发生在 ISR 中)。
  4. 现在控制来自 ISR 到 main() 并在 while(1) 中等待进入手动模式
  5. 所以当 button3 被按下 3 秒时,我们通过调用它进入手动模式 函数 Manual_mode()。
  6. 在手动模式功能下,我们将按住 CW 或 ccw 方向旋转电机 分别是 button1 或 button2。
  7. @H_404_22@

    问题:一切正常,但是当控制从 ISR 返回到无限循环时 我进入手动模式,电机自动启动(在 CW 方向),然后按下按钮 1 或按钮 2。

    板:dsPIC33EP512GM604 使用带有 xC16 编译器的 MPLABx。

    主要功能

        void main(void) 
        {
            
            SYstem_Initialize();
            LED_initialize();
            switch_initialize();
            configureINT();
            
                        //start_motor:
                        
                  if(DIP1_SW == 0 && DIP2_SW == 0 && DIP3_SW == 0 && DIP4_SW == 0)  
                     {
                    
                        D8_LED = 1;
                          
                           __delay_ms(2000);
                        TP6 = 1;  
                        TP5 = 0; 
                        __delay_ms(2000);
                         L2 = 0;
                         L6 = 1; 
                      
                     }
                
                       
                else if (DIP1_SW == 1 && DIP2_SW == 0 && DIP3_SW == 0 && DIP4_SW == 0)
                {
                         __delay_ms(15000);
                        
                         D8_LED = 1;
                          
                           __delay_ms(2000);
                        TP6 = 1;  
                        TP5 = 0; 
                        __delay_ms(2000);
                         L2 = 0;
                         L6 = 1;
                       
                }
                       
                else    
                {
                     __delay_ms(225000);
                        
                         D8_LED = 1;
                          
                           __delay_ms(2000);
                        TP6 = 1;  
                        TP5 = 0; 
                        __delay_ms(2000);
                         L2 = 0;
                         L6 = 1;
             
                }
                         
            while(1)
            {               
              if (MOTVALID_pressed == isMOTVALIDpressed_3sec()) // if MOTVALID pressed for 3SEC,than 
                                                                   enter Manual Mode. 
                {
                    Manual_mode();
                       
                }     
                 
            }
            
        }
    
    
    
    void Manual_mode ()
    {
                D7_LED = 1;
                __delay_ms(500);
                D7_LED = 0;
                __delay_ms(500);
                D7_LED = 1;
                __delay_ms(500);
                D7_LED = 0;
                __delay_ms(500);
                
              while(1)
               {
                  if (!MOTCW) // Turn the motor while button is pressed
                   {
                      D8_LED = 1;
                       __delay_ms(2000);
                      TP6 = 1;  
                      TP5 = 0; 
                       __delay_ms(2000);
                       L2 = 0;
                       L6 = 1;
                       break;
                   }
                
                     else if (!MOTccw)
                        {
               
                            D8_LED = 1;
                           __delay_ms(2000);
                           TP6 = 0;  
                           TP5 = 0; 
                           __delay_ms(2000);
                           L2 = 1;
                           L6 = 0;
                           break;
                        } 
                
                            else 
                          { 
                           D8_LED = 0;
                           D7_LED = 1;
                   
                           TP5 = 1;
                           TP6 = 0;
                           L2 = 0;
                           L6 = 0;
                           break;
                          }
                }
            
    }
    

    ISR 功能

    void __attribute__ ((interrupt,no_auto_psv)) _INT2Interrupt(void) 
    {
        if (IFS1bits.INT2IF == 1)
        {          
                   INTCON2bits.GIE = 0;
                   D8_LED = 0;
                   D7_LED = 0;
                   
                    TP5 = 1;
                    TP6 = 0;
                     L2 = 0;
                     L6 = 0;
                     
                     D7_LED = 1;
                     
                     __delay_ms(1000);  // 1 SEC DELAY FOR STOPPING MOTOR 
                     
                      D7_LED = 0;
                      D8_LED = 1;
                      
                    __delay_ms(2000); // TURN THE MOTOR IN REVERSE DIRECTION FOR 5SEC
                    TP6 = 0;  
                    TP5 = 0; 
                    __delay_ms(2000);
                     L2 = 1;
                     L6 = 0;
                     
                     __delay_ms(5000);
                     
                     D7_LED = 1;
                     D8_LED = 0;
                     
                     TP5 = 1;
                     TP6 = 0;
                     L2 = 0;
                     L6 = 0;
                  
        }
    
     IFS1bits.INT2IF = 0;
    }
    

    我想我错过了一些东西。谢谢。

    解决方法

    暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

    如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

    小编邮箱:dio#foxmail.com (将#修改为@)