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

📄 timer.c.bak

📁 步进电机控制程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
//=============================================================================
// File Name : Timer.c
// Function  : 
// Program   : 
// Date      : 
// Version   : 
// History
// 
//=============================================================================
#define __TIMER_H__

#include <string.h>
#include <stdlib.h>
#include "2410addr.h"
#include "2410lib.h"
#include "Timer.h"
#include "Motor.h"
#include "Uart0.h"
#define X_ON()     rGPBDAT |= 0x01
#define X_OFF()    rGPBDAT &=~(0x01)
#define Y_ON()	   rGPBDAT |= 0x02
#define Y_OFF()	   rGPBDAT &=~(0x02)
#define X_POS()    rGPFDAT |= 0x10
#define X_NEG()    rGPFDAT &=~(0x10)			
#define Y_POS()    rGPFDAT |= 0x20
#define Y_NEG()    rGPFDAT &=~(0x20)

//bit0:x_Motor 1:正转,0:反转 bit1:Y_Motor 1:正转, 0:反转 bit2:Z_motor 1:正转;0:反转
//bit3 d_point :1:出界,0:不出界 bit4 c_point :1:出界,0:不出界 bit5 b_point :1:出界,0:不出界
//bit6 a_point :1:出界,0:不出界

void __irq Timer0Done(void);
void __irq Timer1Done(void);
void __irq Timer2Done(void);
void __irq Timer3Done(void);
void __irq Timer4Done(void);
void Timer_Pulse_Control(void);
void Timer_Speed_Test(void);
unsigned int u_1ms_Flag = 0;
int s_X_All_Step = 0;		//X电机离原点的步数 	
int s_Y_All_Step = 0;		//Y电机离原点的步数
signed int n_Z_Speed;	    //0.1RPM 
unsigned short u_Over_Zero;
union{
      struct
	{
         unsigned X       :1;//0:stop 1:run 
	 	 unsigned Y       :1;//0:stop 1:run  
         }b;                                                 
         unsigned short Word;                               
       }STMT_FBK;
/*struct 
      {
      	unsigned X:1;
      	unsigned Y:1;
      	}Volt; */ 
//================================================================================                                         
//Sub-routine Name:  void Timer_Init(void)                                                            
//Description:
//             
//                                                                                          
//Input:                                                                                     
//Output:                                                                               
//Modified: 2004/03/10         OK                                                            
//=================================================================================  
void Timer_Init(void)
{
 X_OFF();
 Y_OFF();
 u_Over_Zero = 0;
 pISR_TIMER0 = (int)Timer0Done;
 pISR_TIMER1 = (int)Timer1Done;
 pISR_TIMER2 = (int)Timer2Done;
 pISR_TIMER3 = (int)Timer3Done;
 pISR_TIMER4 = (int)Timer4Done;	
 rINTMSK |= (BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);
 //(1/(PCLK/(Prescaler+1)/divider) * count(Max 65535) = Timer clock (Frequency)
 rTCFG0 = rTCFG0 & ~(0xffffff) | 0x0400;        //Dead zone=0,Prescaler1=24,Prescaler0=0								  
 rTCFG1 = 0x0;             		     //All Interrupt, MUX 4 ~ 0 : 1/2
 rTCNTB0 = rTCNTB0 & ~(0xffff) | 250;       //(1/(50MHz/1/2))  *  250 =  0.1 msec (100k  Hz)
 rTCNTB1 = rTCNTB1 & ~(0xffff) | 250;       //(1/(50MHz/1/2))  *  250 =  0.1 msec (100k  Hz)
 
 rTCNTB2 = rTCNTB2 & ~(0xffff) | 1000;       //(1/(50MHz/5/2))  *  200 =  0.2 msec (5k  Hz)
 rTCNTB3 = rTCNTB3 & ~(0xffff) | 1000;       //(1/(50MHz/5/2))  *  200 =  0.2 msec (5k  Hz)
 rTCMPB2 = rTCMPB2 & ~(0xffff) | 1000;       
 rTCMPB3 = rTCMPB3 & ~(0xffff) | 1000;      
 rTCNTB4 = rTCNTB4 & ~(0xffff) | 1000;       //(1/(50MHz/5/2))  *  1000 =  0.2 msec (5k  Hz)
 rTCON   = rTCON & ~(0xffffff) | 0x6aaa0a;   //Auto reload, Inverter off, Manual update, Stop, Dead zone disable
 rTCON   = rTCON & ~(0xffffff) | 0x599909;   //Auto reload, Inverter off, No operation, Start, Dead zone disable	
 rINTMSK &= ~(BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);
}
//================================================================================                                         
//Sub-routine Name:  void __irq Timer0Done(void)                                                            
//Description:
//             
//                                                                                          
//Input:                                                                                     
//Output:                                                                               
//Modified: 2004/03/10         OK                                                            
//=================================================================================  
void __irq Timer0Done(void)
{
    static unsigned int u_Timer_Counter = 0;
    static unsigned int u_5ms_Timer_Counter = 0;
    unsigned short u_a;
    rSRCPND = BIT_TIMER0;       //Clear pending bit
    rINTPND = BIT_TIMER0;
    u_a=rINTPND;              //Prevent an double interrupt pending
    n_THETA = rSensorL + rSensorH*256;
    if(u_Timer_Counter < 49)
       ++u_Timer_Counter;
    else
      {
      	u_Timer_Counter = 0;
      	u_1ms_Flag = 0xffffffff;
      	/*if(n_THETA > -1059)
      	  n_THETA-=1;
      	else
      	 n_THETA = 0;*/
      } 
   Timer_Pulse_Control(); 
   if(u_5ms_Timer_Counter < 499)
   u_5ms_Timer_Counter++;
   else
   {
    Timer_Speed_Test();
    u_5ms_Timer_Counter = 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 = 8;   
static unsigned short u_Y_Step_Timer = 8;
static unsigned short u_X_Step_Origin = 4;
static unsigned short u_Y_Step_Origin = 4;   
static unsigned short u_X_Acc_Fre = 0;
static unsigned short u_Y_Acc_Fre = 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 = Motor_Get_X_Step_Timer();
    u_X_Step_Timer *= 99;	
    u_Y_Step_Timer = Motor_Get_Y_Step_Timer();
    u_Y_Step_Timer *= 99;	
    STMT_Order.Word = Motor_Get_STMT_Order();
    u_X_Acc_Fre = 0;
    u_Y_Acc_Fre = 0;
    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) && (u_X_Step > 0) && (n_THETA < -430)) 
     {
      if(STMT_Order.b.X_Direct)
         X_POS();
       else
         X_NEG();
       u_X_Step_Count = u_X_Step - 1;
       u_X_Count = u_X_Step_Timer;
       if(Volt.X)	
          {
           X_OFF();
           Volt.X = 0;
          }
       else	
        {
         X_ON();
         Volt.X = 1;
        }
       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;			
     }
  if((STMT_Order.b.X_Motor == 2) && (u_X_Step > 0))
     {
      if(STMT_Order.b.X_Direct)
         X_POS();
      else
         X_NEG();
      u_X_Step_Count = u_X_Step-1;
      u_X_Count = u_X_Step_Timer;
      if(Volt.X)	
        {
         X_OFF();
         Volt.X = 0;
        }
       else	
        {
         X_ON();
         Volt.X = 1;
        }
      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;		
     } 
  if(u_X_Step_Count > 0)
    {
     if(u_X_Count > 0)
        {
         --u_X_Count; 	
        }	
     else
      {
       if((u_X_Step_Count == (u_X_Step -2)) ||(u_X_Step_Count == 2))
         {
          u_X_Step_Timer = 49;	
         }
       else if((u_X_Step_Count == (u_X_Step -4)) ||(u_X_Step_Count == 4))
         {
          u_X_Step_Timer = 24;	
         }
       else if((u_X_Step_Count == (u_X_Step -6)) ||(u_X_Step_Count == 6))
         {
          u_X_Step_Timer = u_X_Step_Origin;	
         }
       else
        {
         u_X_Step_Timer = u_Y_Step_Origin;	
        }
       if(u_X_Step_Timer > u_X_Step_Origin)
          {
          if(u_X_Acc_Fre > 4)
             --u_X_Step_Timer;
          else
            u_X_Acc_Fre = 0;
          }
       u_X_Count = u_X_Step_Timer;	
       if(Volt.X)	
        {
         X_OFF();
         Volt.X = 0;
        }
       else	
        {
         X_ON();
         Volt.X = 1;
        }
       if(STMT_Order.b.X_Direct)
          ++s_X_All_Step;
       else
          --s_X_All_Step;
       --u_X_Step_Count;
       ++u_X_Acc_Fre;	
      }		
   } 
 else
   {
    u_X_Step_Count = 0;	
    STMT_FBK.b.X = 0;		
   } 
if((STMT_Order.b.Y_Motor == 1) && (u_Y_Step)&& (n_THETA<-430)) 
    {
      if(STMT_Order.b.Y_Direct)
        Y_POS();
      else
        Y_NEG();
      u_Y_Step_Count = u_Y_Step -1;
      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;
      STMT_Order.b.Y_Motor = 0;
      STMT_FBK.b.Y= 1;			
     }
  if((STMT_Order.b.Y_Motor == 2) && (u_Y_Step))
     {
      if(STMT_Order.b.Y_Direct)
         Y_POS();
      else
         Y_NEG();
      u_Y_Step_Count = u_Y_Step -1;
      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;
        STMT_Order.b.Y_Motor = 0;
        STMT_FBK.b.Y = 1;		
     } 
  if(u_Y_Step_Count > 0)
    {
     if(u_Y_Count > 0)
       {
        --u_Y_Count; 	
       }	
     else
      {
      	if((u_Y_Step_Count == (u_Y_Step -2)) ||(u_Y_Step_Count == 2))
         {
          u_Y_Step_Timer = 49;	
         }
       else if((u_Y_Step_Count == (u_Y_Step -4)) ||(u_Y_Step_Count == 4))
         {
          u_Y_Step_Timer = 24;	
         }
       else if((u_Y_Step_Count == (u_Y_Step -6)) ||(u_Y_Step_Count == 6))
         {
          u_Y_Step_Timer = u_Y_Step_Origin;	

⌨️ 快捷键说明

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