📄 timer.c.bak
字号:
//=============================================================================
// 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 + -