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

📄 control.c

📁 基于mcx314的运动控制
💻 C
字号:
#include"control.h"
extern short ispause;

typedef unsigned short  uint16;

typedef struct
{
 int SV;
 int V;
 int Vacc;
 float Tacc;
 float Tdec;
}ConParam;
ConParam AxisParam;

typedef struct
{
  long x;
  long y;
}PauseParam;
PauseParam Pause_t;

typedef struct
{
  long pre_LPos1;
  long pre_LPos2;
  int pre_IplCmd;
  int pre_i;
}PreParam;

PreParam pre_t;
int j;
CiplParam_t CNode[65535];
Axis3Param_t axis3node[65535];
    
void smp860_append_3axis_continue_inp(uint16 *AxisArray,Axis3Param_t *Node )
{
   smp860_set_port(C_WR5,0x4324);
   smp860_set_param(C_X,C_P,Node->PosX);
   smp860_set_param(C_Y,C_P,Node->PosY);
   smp860_set_param(C_Z,C_P,Node->PosZ);
   smp860_send_inp_cmd(C_CMD_INP_3LINE);
}

void smp860_3axis_continue_inp(uint16 *AxisArray,Axis3Param_t *Node,int StrVel,int MaxVel,float Tacc,float Tdec,int A0)
{
  uint16 pValue;
  smp860_set_port(C_WR5,0x4324);
  smp860_get_reg(C_X,C_WR3,&pValue);
  smp860_set_reg(C_X,C_WR3,pValue|0x6);
  smp860_send_inp_cmd(C_CMD_INP_DEC_INVALID);
  smp860_start_tr_line3(AxisArray, Node->PosX, Node->PosY, Node->PosZ, StrVel, MaxVel, Tacc, Tdec, A0 );
}

void Test_smp860_3axis_continue_inp(uint16 *AxisArray)
{
  unsigned int i;
  Axis3Param_t ANode[4];
  const int TotalNode=4;
  const int DecNode=TotalNode-1;
  int iStrVel=RPS(2);
  int iMaxVel=RPS(10);
  float Tacc=2.5;
  float Tdec=3.0;
  int iA0=0;
  
    ANode[0].PosX=0;
    ANode[0].PosY=-80000;
    ANode[0].PosZ=0;

    ANode[1].PosX=0;
    ANode[1].PosY=80000;
    ANode[1].PosZ=0;

    ANode[2].PosX=0;
    ANode[2].PosY=-80000;
    ANode[2].PosZ=0;

    ANode[3].PosX=0;
    ANode[3].PosY=80000;
    ANode[3].PosZ=0;
    
  smp860_set_param(C_X,C_LP,0);
  smp860_set_param(C_Y,C_LP,0);
  smp860_set_param(C_Z,C_LP,0);
  
  smp860_3axis_continue_inp(AxisArray,&ANode[0],iStrVel,iMaxVel,Tacc,Tdec,iA0);
  
  for(i=1;i<TotalNode;i++)
  {
    while(smp860_get_state(C_IDRV) && !smp860_get_state(C_CNEXT));
    
    if(i==DecNode)
       smp860_send_inp_cmd(C_CMD_INP_DEC_VALID);
       
    smp860_append_3axis_continue_inp(AxisArray,&ANode[i]);
  }
  
}
void Test_smp860_3axis(uint16 *AxisArray,int Dist1,int Dist2,int Dist3)
{
 int StrVel=RPS(5);
 int MaxVel=RPS(30);
 float Tacc=2.5;
// float Tdec=0.2;
 int Vsacc=RPS(0);
 int A0=0;
 
 smp860_start_sr_line3(AxisArray,Dist1,Dist2,Dist3,StrVel,MaxVel,Tacc,Vsacc,A0);
 
}

void Test_smp860_3axis_inp()
{
    int TotalSegNumbers = 10;
    int SV = RPS(100);
    int  V = RPS(150);
    unsigned int i;
    uint16 AxisArray[4];

    int32  XPos[10];
    int32  YPos[10];
    int32  ZPos[10];
	long value;

        XPos[0] =   0;	     YPos[0] =   0;       ZPos[0]=   300000;
		XPos[1] =   0;	     YPos[1] =   0;       ZPos[1]=   -300000;
		
		XPos[2] =   100000;	 YPos[2] =   0;       ZPos[2]=   300000;
		XPos[3] =        0;	 YPos[3] =   0;       ZPos[3]=   -300000;
		
		XPos[4] =        0;	YPos[4] =100000;      ZPos[4]=   300000;
		XPos[5] =        0;	YPos[5] =     0;      ZPos[5]=   -300000;
		  
		XPos[6] = -100000;	YPos[6] =     0;      ZPos[6]=   300000;
		XPos[7] =   0;	    YPos[7] =     0;      ZPos[7]=   -300000;
		
		XPos[8] =   0;	YPos[8] =   -100000;      ZPos[8]=      0;
		XPos[9] =   0;	YPos[9] =   0;            ZPos[9]=      0;
		
    set_port( C_WR0, 0x8000);			// 软件复位IC
    Delay(1);
    set_port( C_WR0, 0x0f0f);
	    
    AxisArray[0] = C_X;					// 选择多轴
    AxisArray[1] = C_Y;
    AxisArray[2] = C_Z;
    AxisArray[3] = 0;
    
	set_reg_multi_axis(AxisArray, C_WR1,0x0000);			// 默认
	//set_reg_multi_axis(AxisArray, C_WR2,0x0040);			// 单脉冲输出
	set_reg_multi_axis(AxisArray, C_WR3,0xf000);			// 屏蔽紧急停止和正负硬限位
	set_port( C_WR5,0x00e4);			// 设定插补轴
    


	set_param(C_X, C_R	, 4000000	);	// 范围设定 4M

	set_param(C_X, C_A	, 20	    );	// 加速度设定

	set_param(C_X, C_SV	, SV		);	// SV 初速度设定
	set_param(C_X, C_V	, V 		);	// 驱动速度设定
	set_param(C_X, C_P	, XPos[0]);	// 位移设定
	set_param(C_X, C_DP	, 9000	    );	// 减速点设定

	set_param(C_X, C_LP,0);				// 逻辑位置计数器设置
	set_param(C_X, C_EP,0);				// 逻辑位置计数器设置
 

	set_param(C_Y, C_R	, 5656854	);	// 范围设定 8M*root(2)
	set_param(C_Y, C_P	, YPos[0]	);	// 位移设定                                                                                                            

	set_param(C_Y, C_LP,0);				// 逻辑位置计数器设置
	set_param(C_Y, C_EP,0);				// 逻辑位置计数器设置

    set_param(C_Z, C_R  , 6928203  );
    set_param(C_Z, C_P,   ZPos[0]  );
    
    set_param(C_Z, C_LP,0);
    set_param(C_Z, C_EP,0);

	send_inp_cmd( C_CMD_INP_DEC_INVALID );		// 禁止插补减速

	send_inp_cmd( C_CMD_INP_3LINE );			// 2轴直线插补驱动


	for(i = 1 ; i < TotalSegNumbers; i++)
    {
		while(!get_state(C_CNEXT));				// 等待发送下一段允许信号
		if(i==(TotalSegNumbers-1)) 
		{
			set_param(C_X, C_DP	, 9000        );			// 减速点设定
			send_inp_cmd( C_CMD_INP_DEC_VALID );		// 允许插补减速
		}
		set_param( C_X, C_P	, XPos[i]	);	// 位移设定
		set_param( C_Y, C_P	, YPos[i]	);	// 位移设定
		set_param( C_Z, C_P , ZPos[i]   );
		send_inp_cmd( C_CMD_INP_3LINE );			// 3轴直线插补驱动

	}	

	while(get_state(C_IDRV));
}

//T型差补运动
void  Test_smp860_2axis_continue_inp_T(uint16 *AxisArray)
{
	unsigned int i;
    //long value;
    const int TotlaNode = j;
    const int DecNode = TotlaNode-1;
    const int SV = RPS(AxisParam.SV);
    const int  V = RPS(AxisParam.V);
    const float  Tacc = 2.5;
    const float  Tdec = 3.0;
    int AO = 0;
	
	smp860_set_param(AxisArray[0],C_LP,0);
	smp860_set_param(AxisArray[1],C_LP,0);

	smp860_start_tr_2axis_continue_inp(AxisArray,&CNode[0],SV,V,Tacc,Tdec,AO);


	for(i = 1 ; i < TotlaNode; i++)
    {
    
       /* if(ispause==1)
        {
         smp860_send_drv_cmd(C_X,C_CMD_DRV_DEC_Stop);
         break;
        }
        
        pre_t.pre_LPos1+=CNode[i-1].Pos1;
        pre_t.pre_LPos2+=CNode[i-1].Pos2;
        pre_t.pre_IplCmd=CNode[i-1].IplCmd;
        pre_t.pre_i=i-1;*/
       
		while( smp860_get_state(C_IDRV) && !smp860_get_state(C_CNEXT) );				// 等待发送下一段允许信号
		if(i==DecNode) 
			smp860_send_inp_cmd( C_CMD_INP_DEC_VALID );		// 允许插补减速
		
	    smp860_append_2axis_continue_inp( AxisArray, &CNode[i] );
	    
    }	
}   


//S型差补运动
void  Test_smp860_2axis_continue_inp_S(uint16 *AxisArray)
{	
   unsigned int i;
 //  long value;
   const int TotlaNode = j;
   const int DecNode = TotlaNode-1;
   const int SV = RPS(AxisParam.SV);
   const int  V = RPS(AxisParam.V);
   const int Vsacc = RPS(AxisParam.Vacc);
   const float  Tacc = 2.5;
   int AO = 0;
	
	smp860_set_param(AxisArray[0],C_LP,0);
	smp860_set_param(AxisArray[1],C_LP,0);

	smp860_start_sr_2axis_continue_inp(AxisArray,&CNode[0],SV,V,Tacc,Vsacc,AO);


	for(i = 1 ; i < TotlaNode; i++)
    {   
		while( smp860_get_state(C_IDRV) && !smp860_get_state(C_CNEXT) );				// 等待发送下一段允许信号
		if(i==DecNode) 
			smp860_send_inp_cmd( C_CMD_INP_DEC_VALID );		// 允许插补减速
		
		smp860_append_2axis_continue_inp( AxisArray, &CNode[i] );
		
	}	
	    
}


void Pause(void)
{
  long value;
  int index,index_t;
  index_t=1;
 
  smp860_get_param(C_X,C_rLP,&value);
  Pause_t.x=value;
  smp860_get_param(C_Y,C_rLP,&value);
  Pause_t.y=value;
  
  value=Pause_t.x-pre_t.pre_LPos1;
  CNode[0].Pos1=CNode[pre_t.pre_i].Pos1-value;
  
  value=Pause_t.y-pre_t.pre_LPos2;
  CNode[0].Pos2=CNode[pre_t.pre_i].Pos2-value;
  
  CNode[0].Center1=CNode[pre_t.pre_i].Center1;
  CNode[0].Center2=CNode[pre_t.pre_i].Center2;
  
  CNode[0].IplCmd=CNode[pre_t.pre_i].IplCmd;
  
  for(index=pre_t.pre_i+1;index<=j-pre_t.pre_i;index++)
  {
   CNode[index_t].Pos1=CNode[index].Pos1;
   CNode[index_t].Pos2=CNode[index].Pos2;
   CNode[index_t].Center1=CNode[index].Center1;
   CNode[index_t].Center2=CNode[index].Center2;
   CNode[index_t].IplCmd=CNode[index].IplCmd;
   index_t++;
  }

}
//回原点
void Home(void)
{
 /*  if(!smp860_set_reg(C_X,C_WR4,65535))
     {
        SerialPrintf("Set Xcount!");
     }*/
    if(!smp860_set_reg(C_X,C_WR1,128))
    {
     // SerialPrintf("X Set home right !\n");
    }
    if(!smp860_home_move(C_X,1,1000,10000,10))
    {
    // SerialPrintf("X Home move right !\n");
    }
    while(smp860_get_state(C_XDRV));
    
     //SerialPrintf("Y Start home !\n");
    
     if(!smp860_set_reg(C_Y,C_WR1,128))
    {
     // SerialPrintf("Y Set home right !\n");
    }
    if(!smp860_home_move(C_Y,1,1000,10000,10))
    {
    // SerialPrintf("Y Home move right !\n");
    }
    while(smp860_get_state(C_YDRV));
    
    // SerialPrintf("Finish home !\n");
    
  /*  if(!smp860_set_reg(C_X,C_WR4,0));
     {
        SerialPrintf("Cleaer count !\n");
       for(i=0;i<1000000;i++);
     }
    if(!smp860_set_reg(C_X,C_WR4,0x0))
     {
        SerialPrintf("Set count!\n");
     }*/
}

void Init(void)
{
 // uint16 xValues;
 // uint16 yValues;
  int i;
  smp860_set_port(C_WR0,0x8000);
//  smp860_set_reg(C_Y,C_WR4, 0x022);
 
}
//串口通信
void com(void)
{
 int index;
 char cmd[10];
 char temp[10];
 int data,i;
 SerialGetString(0,cmd);
 strcpy(temp,"yes");
 if(0!=strcmp(temp,cmd))
   return;
   
 SerialPrintf("@%d*%d$",11,0);
 SerialGetString(0,cmd);
 
 strcpy(temp,"axis2");
 if(0==strcmp(temp,cmd))
   index=2;
   
 strcpy(temp,"axis3");
 if(0==strcmp(temp,cmd))
   index=3;
 
 if(2==index)
 {
  SerialPrintf("@%d*%d$",22,220);          //set CNode len
  j=SerialGetIntNum(0);
  
  SerialPrintf("@%d*%d$",22,221);          //set start speed
  data=SerialGetIntNum(0);
  AxisParam.SV=data;
  
  SerialPrintf("@%d*%d$",22,222);          //set dirve speed
  data=SerialGetIntNum(0);
  AxisParam.V=data;
  
  SerialPrintf("@%d*%d$",22,223);          //set acc
  data=SerialGetIntNum(0);
  AxisParam.Vacc=data;
  
 for(i=0;i<j;i++)
 {
  SerialPrintf("@%d*%d$",22,224);
  data=SerialGetIntNum(0);
  CNode[i].Pos1=data;
  
  SerialPrintf("@%d*%d$",22,225);
  data=SerialGetIntNum(0);
  CNode[i].Pos2=data;
  
  SerialPrintf("@%d*%d$",22,226);
  data=SerialGetIntNum(0);
  CNode[i].Center1=data;
  
  SerialPrintf("@%d*%d$",22,227);
  data=SerialGetIntNum(0);
  CNode[i].Center2=data;
  
  SerialPrintf("@%d*%d$",22,228);
  data=SerialGetIntNum(0);
  switch(data)
  {
    case 1:
     CNode[i].IplCmd=C_CMD_INP_2LINE;
     break;
    case 2:
     CNode[i].IplCmd=C_CMD_INP_CCW;
     break;
    case 3:
     CNode[i].IplCmd=C_CMD_INP_CW;
     break;
    default:
     break;
  }
  SerialPrintf("@%d*%d$",22,229);       //responed sign
 }
 SerialPrintf("@%d*%d$",22,230);        //file successful
 }
 else if(3==index)
 {
   SerialPrintf("@%d*%d$",33,330);          //set CNode len
  j=SerialGetIntNum(0);
  
  SerialPrintf("@%d*%d$",33,331);          //set start speed
  data=SerialGetIntNum(0);
  AxisParam.SV=data;
  
  SerialPrintf("@%d*%d$",33,332);          //set dirve speed
  data=SerialGetIntNum(0);
  AxisParam.V=data;
  
  SerialPrintf("@%d*%d$",22,333);          //set acc
  data=SerialGetIntNum(0);
  AxisParam.Vacc=data;
  
 for(i=0;i<j;i++)
 {
  SerialPrintf("@%d*%d$",33,334);
  data=SerialGetIntNum(0);
  axis3node[i].PosX=data;
  
  SerialPrintf("@%d*%d$",33,335);
  data=SerialGetIntNum(0);
  axis3node[i].PosY=data;
  
  SerialPrintf("@%d*%d$",33,336);
  data=SerialGetIntNum(0);
  axis3node[i].PosZ=data;
  
  SerialPrintf("@%d*%d$",33,337);       //responed sign
 }
 SerialPrintf("@%d*%d$",33,338);        //file successful
 }
 else
 {
   SerialPrintf("error");
 }
 
}
void SetInterrupt(void)
{
  rINTMSK=~(BIT_GLOBAL|BIT_EINT4567|BIT_TIMER0);
}

void CloseInterrupt(void)
{
   rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);
}

⌨️ 快捷键说明

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