📄 motor.c
字号:
#define __MOTOR_H__
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "goat.h"
//Shin, On Pil
#include "def.h"
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h"
#include "timer.h"
#include "Motor.h"
#include "Uart0.h"
#define X_Step_Length 2 //0.1mm 要几步
#define Y_Step_Length 2 //0.1mm 要几步
#define Brake_Set() rGPFDAT |= 0x80
#define Brake_Clear() rGPFDAT &=~(0x80)
#define Drive_Set() rGPFDAT |= 0x40
#define Drive_Clear() rGPFDAT &=~(0x40)
#define Needle_Set() rGPBDAT |= 0x08
#define Needle_Clear() rGPBDAT &=~(0x08)
#define NULL 0
#define EMBROIDER 1
#define Z_ORDER_STOP 0
#define Z_ORDER_RUN 1
#define Z_ORDER_ONE 2
#define Z_ORDER_BRAKE 3
#define Z_ORDER_DEBUG 4
#define SYS_DEBUG 0
#define SYS_NORMAL 1
#define SYS_FAULT 2
#define STMT_STOP 0
#define STMT_AUTO 1
#define STMT_MANUAL 2
#define NORMAL_READY 0
#define NORMAL_ENABLE 1
#define NORMAL_RUN 2
#define HANDLE_NULL 0
#define HANDLE_L 1
#define HANDLE_L_HLD 2
#define HANDLE_R 3
#define HANDLE_R_HLD 4
#define HANDLE_ENTER 5
#define HANDLE_BACK 6
#define HANDLE_NULL_ONE_STEP 7
#define HANDLE_BACK_ONE_STEP 8
#define NORMAL 0
#define CHANGE_COLOR 1
#define JUMP_NEEDLE 2
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;
union{
struct
{
unsigned EMB_State :1;//0:停止 1:绣花
unsigned Run :4;//0:Stop 1:Run 2:one Circle 3:Brake
unsigned Stop_Circle :8; //刹车圈数
}b;
unsigned short Word;
}Z_Order;
union
{
struct
{
unsigned EMB_State :1;//0:停止 1:绣花
unsigned Run :4;//0:Stop 1:Run 2:one Circle 3:Break
unsigned Stop_Circle :8; //刹车圈数
}b;
unsigned short Word;
}Z_FBK;
struct
{
unsigned X_Reference :8;
unsigned Y_Reference :8;
unsigned Work_State :4; //bit0-bit2:0: Normal 1:start 2:stop 3:cut wire
unsigned Embroider_Mode :4; //0:正常 1:换色 2:跳针
unsigned Sequence :24;
}Needle[16];
struct
{
unsigned System :2; //0:调试 Debug 1:绣花Normal 2:错误 Fault
unsigned Normal :2; //0:Ready 1: Enable 3:Run
unsigned Run :4; //0:Z_Nothing 1:Z_Run 3:Z_One
unsigned Handle :8; //0:left 01:left Hold 2:right 3:right Hold 4:Null 5:enter 6:Back
}State;
signed short n_THETA_Shifted; //移动相对角度
unsigned short u_PLoop_Flag; //位置控制标示
unsigned char *pFile;
unsigned int u_File_Point; //文件数组尾地址
unsigned int u_File_Point_Front; //文件数组头地址
unsigned short u_Buffer_Index;
signed int n_Speed_Order; //0.1RPM
signed int n_Speed_Desired; //0.1RPM
signed short n_Speed_Slope;
unsigned short u_X_Step = 0;
unsigned short u_Y_Step = 0;
unsigned short u_X_Step_Timer = 0; //>=2
unsigned short u_Y_Step_Timer = 0; //>=2
signed int n_X_Reference; //绣花离原点坐标0.1mm
signed int n_Y_Reference; //绣花离原点坐标0.1mm
unsigned short u_Needle_Over; //每一针完成标示
signed short n_THETA = 0; //主轴电机角度 单位:360度/1000
signed short n_THETA_DN; //针在框上角度
unsigned short u_Over_Stitch_Count; //已绣完针数
unsigned short u_Circle_Count;
unsigned short Z_Ref; //速度给定
unsigned short u_Drive_Flag;
unsigned short u_Brake_Flag;
unsigned short u_First_Flag = 0; //开始标示
unsigned short u_Z_Debug_Flag = 0;
unsigned short u_Read_Index;
unsigned int u_Over_Needle_Index; //当前绣完针
unsigned short u_Embroider_Speed_Des; //绣花速度设定值
unsigned short u_Error_Flag;
unsigned short u_Jump_num;
unsigned int Max_Speed_Limit;
unsigned short Cut_Request_Flag;
unsigned short Buckle_Request_Flag;
unsigned short Draw_Request_Flag;
unsigned short Change_Request_Flag;
unsigned short u_Color_Select;
unsigned char u_OUT_IO = 0;
//===============================================================
//Sub-routine: void Motor_Init(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
void Motor_Init(void)
{
n_Speed_Slope = 1;
State.System = SYS_DEBUG;
Z_FBK.b.Run = Z_ORDER_DEBUG;
n_THETA_DN = -400;
n_X_Reference = 0;
n_Y_Reference = 0;
pFile = (unsigned char *)0x30140000;
u_File_Point = 0;
u_File_Point_Front = 0;
u_PLoop_Flag = 0;
u_Read_Index = 0;
u_Over_Needle_Index = 0;
u_Embroider_Speed_Des = 6000;
u_Error_Flag = 0;
u_Jump_num = 0;
Max_Speed_Limit = 10000;
Motor_First_Read();
u_OUT_IO = 0;
u_OUT_IO |= Change_Color_P;
u_OUT_IO |= Change_Color_N;
u_OUT_IO |= Change_Color_Start;
Out_01 = u_OUT_IO;
Out_02 = u_OUT_IO;
u_Circle_Count = 0;
Motor_Stop_Set();
u_Drive_Flag = 1;
u_Brake_Flag = 1;
}
//===============================================================
//Sub-routine:signed short Motor_Get_Speed_Order(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
signed short Motor_Get_Speed_Order(void)
{
return(n_Speed_Desired);
}
//===============================================================
//Sub-routine:unsigned short Motor_Get_STMT_Order(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
unsigned short Motor_Get_STMT_Order(void)
{
return(STMT_Order.Word);
}
void Motor_Set_X_Direct(unsigned short u_Value)
{
STMT_Order.b.X_Direct = u_Value;
}
void Motor_Set_Y_Direct(unsigned short u_Value)
{
STMT_Order.b.Y_Direct = u_Value;
}
//===============================================================
//Sub-routine:unsigned short Motor_Get_X_Step(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
unsigned short Motor_Get_X_Step(void)
{
return(u_X_Step);
}
void Motor_Set_X_Step(unsigned short u_Value)
{
u_X_Step = u_Value;
}
//===============================================================
//Sub-routine:unsigned short Motor_Get_Y_Step(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
unsigned short Motor_Get_Y_Step(void)
{
return(u_Y_Step);
}
void Motor_Set_Y_Step(unsigned short u_Value)
{
u_Y_Step = u_Value;
}
//===============================================================
//Sub-routine:unsigned short Motor_Get_X_Step_Timer(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
unsigned short Motor_Get_X_Step_Timer(void)
{
return(u_X_Step_Timer);
}
//===============================================================
//Sub-routine:unsigned short Motor_Get_Y_Step_Timer(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
unsigned short Motor_Get_Y_Step_Timer(void)
{
return(u_Y_Step_Timer);
}
//===============================================================
//Sub-routine: unsigned short Motor_Get_Order_Flag(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
unsigned short Motor_Get_Order_Flag(void)
{
return(STMT_Order.b.Flag);
}
//===============================================================
//Sub-routine: unsigned short Motor_Get_Order_Flag(void)
//Description:
//
//Input:
//Output:
//Modified:
//===============================================================
void Motor_Set_Order_Flag(unsigned short u_Value)
{
STMT_Order.b.Flag = u_Value;
}
//===============================================================
//Sub-routine: void Motor_Pattern_To_Order(unsigned short u_Mode)
//Description:花样转换成步进电机运行命令
//
//Input: u_Mode 1:手动 0:自动 u_Direction 1:前进 0:后退
//Output:
//Modified:
//===============================================================
void Motor_Pattern_To_Order(unsigned short u_Mode,unsigned short u_Direction)//1:前进 0:后退
{
signed short x;
signed char a;
if(u_Direction == 0)
{
a = Needle[u_Buffer_Index].X_Reference;
n_X_Reference -= a;
x = -a;
x*=2;
if(x >= 0)
{
u_X_Step = x;
STMT_Order.b.X_Direct = 1;
}
else
{
u_X_Step = -x;
STMT_Order.b.X_Direct = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -