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

📄 motor.c

📁 步进电机控制程序
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -