⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c.bak

📁 步进电机控制程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
         }
      if(u_Y_Step_Timer > u_Y_Step_Origin)
          {
          if(u_Y_Acc_Fre > 4)
             --u_Y_Step_Timer;
          else
            u_Y_Acc_Fre = 0;
          }
       u_Y_Count = u_Y_Step_Timer;	
       if(Volt.Y)
         {	
          Y_OFF();
          Volt.Y = 0;
          }
      else
         {
          Y_ON();
          Volt.Y = 1;
         }
       if(STMT_Order.b.Y_Direct)
         ++s_Y_All_Step;
       else
         --s_Y_All_Step; 
       --u_Y_Step_Count;
       ++u_Y_Acc_Fre;	
      }		
   } 
 else
   {
    u_Y_Step_Count = 0;	
    STMT_FBK.b.Y = 0;		
   }   		   	
 }*/
//================================================================================                                         
//Sub-routine Name:  void Timer_Pulse_Control(void)                                                            
//Description:
//             
//                                                                                          
//Input:                                                                                     
//Output:                                                                               
//Modified: 2004/03/10         OK                                                            
//=================================================================================  
void Timer_Pulse_Control(void)
{
static unsigned short u_X_Count = 0;
static unsigned short u_Y_Count = 0;
static unsigned short u_X_Step_Count = 0;
static unsigned short u_Y_Step_Count = 0;
static unsigned short u_X_Step = 0;
static unsigned short u_Y_Step = 0; 
static unsigned short u_X_Step_Timer = 299;   
static unsigned short u_Y_Step_Timer = 299;
static unsigned short u_X_Step_Origin = 99;
static unsigned short u_Y_Step_Origin = 99;
static unsigned short u_X_Pulse_Width = 0;
static unsigned short u_Y_Pulse_Width = 0;
static union{
    struct
	{
     unsigned X_Motor   	:3;		//0:stop 1:auto 2:manual 
	 unsigned X_Direct      :1;	   //0:negative 1:positive  
	 unsigned Y_Motor		:3;	   //0:stop 1:auto 2:manual 
	 unsigned Y_Direct      :1;    //0:negative 1:positive
	 unsigned Flag          :1;    //0:未接收 1:接收   
     }b;                                                 
    unsigned short Word;                               
       }STMT_Order;
if(Motor_Get_Order_Flag()&&(!(STMT_FBK.b.X ||STMT_FBK.b.Y)))
 { 
    u_X_Step = Motor_Get_X_Step();	
    u_Y_Step = Motor_Get_Y_Step();
    u_X_Step_Origin = Motor_Get_X_Step_Timer();
    u_Y_Step_Origin	= Motor_Get_Y_Step_Timer();
    u_X_Step_Timer = 299;	
    u_Y_Step_Timer = 299;	
    STMT_Order.Word = Motor_Get_STMT_Order();
    if(STMT_Order.b.X_Direct)
         X_POS();
       else
         X_NEG();
    if(STMT_Order.b.Y_Direct)
        Y_POS();
      else
        Y_NEG();
    if(u_X_Step == 0)
       STMT_Order.b.X_Motor = 0;	
    if(u_Y_Step == 0)
      STMT_Order.b.Y_Motor = 0;
      Motor_Set_Order_Flag(0);
 }
if((( STMT_Order.b.X_Motor == 1) && (n_THETA < -420))||(STMT_Order.b.X_Motor == 2)) 
     {
       u_X_Step_Count = u_X_Step - 1;
       u_X_Count = u_X_Step_Timer;
       X_ON();	
       if(STMT_Order.b.X_Direct)
      	++s_X_All_Step;
   	   else
      	--s_X_All_Step;	
       STMT_Order.b.X_Motor = 0;
       STMT_FBK.b.X = 1;
       u_X_Pulse_Width = 16;			
     }
 if(u_X_Pulse_Width > 0)
   --u_X_Pulse_Width;
 else
  {
   X_OFF();
  }
 if(u_X_Step_Count > 0)
   {
     if(u_X_Count > 0)
        {
         --u_X_Count; 	
        }	
     else
      { 
      	 u_X_Step_Timer = u_X_Step_Origin;
      	if(( 299 - u_X_Step_Origin) > (u_X_Step -u_X_Step_Count)*10)
      	  {
      	  	if((u_X_Step -u_X_Step_Count) < u_X_Step_Count)
      	  	  u_X_Step_Timer = 299 - (u_X_Step -u_X_Step_Count)*10;
      	  }
      	if(( 299 - u_X_Step_Origin) > (u_X_Step_Count)*10)
      	  {
      	  	if((u_X_Step -u_X_Step_Count) > u_X_Step_Count)
      	  		u_X_Step_Timer = 299 - (u_X_Step_Count)*10;
      	  }
       /*if(u_X_Step_Count == abs(u_X_Step -1))
         {
          u_X_Step_Timer = 99;	
         }
       if(u_X_Step_Count == abs(u_X_Step -2))
         {
          u_X_Step_Timer = u_X_Step_Origin;	
         }
       if(u_X_Step_Count == 1)
          u_X_Step_Timer = 199;
       if(u_X_Step_Count == 2)
          u_X_Step_Timer = 99;*/
       u_X_Count = u_X_Step_Timer;	
       X_ON();
       u_X_Pulse_Width = 16;
       --u_X_Step_Count;
       if(STMT_Order.b.X_Direct)
      	++s_X_All_Step;
   	   else
      	--s_X_All_Step;	
      }		
   } 
 else
   {
   	if(u_X_Pulse_Width == 0)
    STMT_FBK.b.X = 0;		
   }  
if((( STMT_Order.b.Y_Motor == 1)&& (n_THETA < -420))||(STMT_Order.b.Y_Motor == 2))  
    {
      u_Y_Step_Count = u_Y_Step -1;
      u_Y_Count = u_Y_Step_Timer;
       Y_ON();
        if(STMT_Order.b.Y_Direct)
      	++s_Y_All_Step;
      else
      	--s_Y_All_Step;	
      STMT_Order.b.Y_Motor = 0;
      STMT_FBK.b.Y= 1;
      u_Y_Pulse_Width = 16;			
     }
if(u_Y_Pulse_Width > 0)
   --u_Y_Pulse_Width;
 else
  {
   Y_OFF();
  }
 if(u_Y_Step_Count > 0)
   {
     if(u_Y_Count > 0)
       {
        --u_Y_Count; 	
       }	
     else
      {
        u_Y_Step_Timer = u_Y_Step_Origin;
      	if(( 299 - u_Y_Step_Origin) > (u_Y_Step -u_Y_Step_Count)*10)
      	  {
      	  	if((u_Y_Step -u_Y_Step_Count) < u_Y_Step_Count)
      	  	  u_Y_Step_Timer = 299 - (u_Y_Step -u_Y_Step_Count)*10;
      	  }
      	if(( 299 - u_Y_Step_Origin) > (u_Y_Step_Count)*10)
      	  {
      	  	if((u_Y_Step -u_Y_Step_Count) > u_Y_Step_Count)
      	  		u_Y_Step_Timer = 299 - (u_Y_Step_Count)*10;
      	  }
       /*if(u_Y_Step_Count == abs(u_Y_Step -1))
          u_Y_Step_Timer = 99;	
       if(u_Y_Step_Count == abs(u_Y_Step -2))
          u_Y_Step_Timer = u_Y_Step_Origin;	
       if(u_Y_Step_Count == 1)
          u_Y_Step_Timer = 199;	
       if(u_Y_Step_Count == 2)
          u_Y_Step_Timer = 99;*/
       u_Y_Count = u_Y_Step_Timer;	
       Y_ON();
       u_Y_Pulse_Width = 16;
       --u_Y_Step_Count;
       if(STMT_Order.b.Y_Direct)
      	++s_Y_All_Step;
      else
      	--s_Y_All_Step;	
      }		
   } 
 else
   {
   	if(u_Y_Pulse_Width == 0)
    STMT_FBK.b.Y = 0;		
   }   		   	
 }


//================================================================================                                         
//Sub-Routine Name:void Timer_Speed_Test(void)                                                            
//Description:
//                                                                            
//Input:                                                                                    
//Output:                                                                               
//Modified: 2004/03/10         OK                                                            
//=================================================================================
void Timer_Speed_Test(void) 
 {
   signed long n_Com_A = 0;
   unsigned short u_Cal_Flag = 0;
   static unsigned short u_25ms_Count;
   static unsigned short u_50ms_Count;
   static unsigned short u_10ms_Count;
   static signed int	n_50ms_Enc = 0;
   static signed int	n_25ms_Enc = 0;
   static signed int   n_10ms_Enc =0;
   static signed int   n_5ms_Enc = 0;
   static signed int   n_Old_rIncode = 0;
   static signed short n_RPM_BUF[8];
   n_5ms_Enc = n_THETA - n_Old_rIncode;
   if(n_5ms_Enc > 0)	
      {
      	if((n_5ms_Enc ) > 495)
      	  {
      	   n_5ms_Enc -=991;
      	   u_Over_Zero = 1;	
      	  }
      }
    else
      {
      	if((n_5ms_Enc) < -495 )
      	  {
      	   n_5ms_Enc +=991;
      	   u_Over_Zero = 1;		
      	  }
      }
   n_Old_rIncode = n_THETA;
   if(u_50ms_Count < 10)
      {
       ++u_50ms_Count;
       n_50ms_Enc +=n_5ms_Enc;
      }
   else
     {
      u_50ms_Count = 0;
      if(abs(n_5ms_Enc)<= 20)
        {
        n_Com_A = n_50ms_Enc;
        n_Com_A *=1211;
        n_Com_A /=100;
        u_Cal_Flag = 1;
    	}
        n_50ms_Enc = 0;
     }
  if(u_25ms_Count < 5)
      {
       ++u_25ms_Count;
       n_25ms_Enc +=n_5ms_Enc;
      }
   else
     {
      u_25ms_Count = 0;
      if((abs(n_5ms_Enc) > 20) && (abs(n_5ms_Enc) <= 50))
        {
        n_Com_A = n_25ms_Enc;
        n_Com_A *=1211;
        n_Com_A /=50;
        u_Cal_Flag = 1;
        }	
      n_25ms_Enc = 0;
     } 
  if(u_10ms_Count < 2)
     {
      ++u_10ms_Count;
      n_10ms_Enc +=n_5ms_Enc;
     }
   else
     {
      u_10ms_Count = 0;
      if((abs(n_5ms_Enc) > 50) && (abs(n_5ms_Enc) <= 80))
        {
        n_Com_A = n_10ms_Enc;
        n_Com_A *=1211;
        n_Com_A /=20;
        u_Cal_Flag = 1;
        }	
      n_10ms_Enc = 0;
     } 
  if(abs(n_5ms_Enc) > 80)  
     {
      n_Com_A = n_5ms_Enc;
      n_Com_A *= 1211;
      n_Com_A /=10;
      u_Cal_Flag = 1;
     }
   if(u_Cal_Flag)
    {
     n_RPM_BUF[0] = n_RPM_BUF[1];
     n_RPM_BUF[1] = n_RPM_BUF[2];
     n_RPM_BUF[2] = n_RPM_BUF[3];
     n_RPM_BUF[3] = n_Com_A;
     n_Z_Speed = n_Com_A;//(n_RPM_BUF[0] + n_RPM_BUF[1] + n_RPM_BUF[2] + n_RPM_BUF[3])/4; 	    	
    }
 }
 
 
//---------------------------------------------------------------------
void __irq Timer1Done(void)
{
    unsigned short u_a;
    rSRCPND = BIT_TIMER1;       //Clear pending bit
    rINTPND = BIT_TIMER1;
    u_a = rINTPND;  
}

//---------------------------------------------------------------------
void __irq Timer2Done(void)
{
    unsigned short u_a;
    rSRCPND = BIT_TIMER2;       //Clear pending bit
    rINTPND = BIT_TIMER2;
    u_a = rINTPND;   
}

//---------------------------------------------------------------------
void __irq Timer3Done(void)
{
    unsigned short u_a;
    rSRCPND = BIT_TIMER3;       //Clear pending bit
    rINTPND = BIT_TIMER3;
    u_a = rINTPND;  
}

//---------------------------------------------------------------------
void __irq Timer4Done(void)
{
    unsigned short u_a;
    rSRCPND = BIT_TIMER4;       //Clear pending bit
    rINTPND = BIT_TIMER4;
    u_a = rINTPND;    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -