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

📄 comm.c

📁 LPC2129实现从SPI通讯和两个串口定时器中断
💻 C
📖 第 1 页 / 共 3 页
字号:
	 lspeed=speedl;
	 UART1_CS(2);
	 V_set(lspeed);
}
/****************************************************************************
* 名称:V_Rctl()
* 功能:根据上位机指令设置右电机速度。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void V_Rctl(struct DATA_BUF *com_pk)
{
	int speedr=0;

	speedr=(com_pk->data[1])&0x000000FF;
	speedr|=((com_pk->data[0])&0x0000007F)<<8;

	if(((com_pk->data[0])&0x80)==0x80)											  
	{ 	
		speedr=0-speedr;
	 }
	  
	 rspeed=speedr;
	 UART1_CS(1);
	 V_set(rspeed);

}
/****************************************************************************
* 名称:V_Bctl()
* 功能:根据上位机指令设置左右电机速度。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void V_Bctl(struct DATA_BUF *com_pk)
{
	int speedl=0,speedr=0;

	speedl = com_pk->data[0];
	speedl <<= 8;
	speedl |= com_pk->data[1];
	
	if(speedl >=0x8000)
	{
		speedl -= 0x8000;
		speedl = 0 - speedl; 
	}

	speedr = com_pk->data[2];
	speedr <<= 8;
	speedr |= com_pk->data[3];
	
	if(speedr >= 0x8000)
	{
		speedr -= 0x8000;
		speedr = 0 - speedr; 
	}

	  lspeed=speedl;
	  rspeed=speedr;
	SendSpeedLR(lspeed,rspeed);
}
/****************************************************************************
* 名称:A_Bctl()
* 功能:根据上位机指令设置左右电机加速度最大速度。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void A_Bctl(struct DATA_BUF *com_pk)
{
	uint16 accel=0,accer=0,spl=0,spr=0;

	accer=com_pk->data[0]<<8;
	accer|=com_pk->data[1];
	UART1_CS(1);
	AC_set(accer);
	EEPSAV();
	Delay(5);	
	EEPSAV();

	accel=com_pk->data[2]<<8;
	accel|=com_pk->data[3];
	UART1_CS(2);
	AC_set(accel);
	EEPSAV();
	Delay(5);	
	EEPSAV();

	spl=com_pk->data[4]<<8;
	spl|=com_pk->data[5];
	UART1_CS(1);
	set_SP(spl);
	EEPSAV();
	Delay(5);	
	EEPSAV();

	spr=com_pk->data[6]<<8;
	spr|=com_pk->data[7];
	UART1_CS(2);
	set_SP(spr);
	EEPSAV();
	Delay(5);	
	EEPSAV();
}
/****************************************************************************
* 名称:PID_ctl()
* 功能:根据上位机指令设置左右驱动器PID参数。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void PID_ctl(struct DATA_BUF *com_pk)
{
	uint8 kp,ki,kd,temp;

	temp=com_pk->data[0];
	kp=com_pk->data[1];
	ki=com_pk->data[2];
	kd=com_pk->data[3];

  	if(temp==0x02)		
	   UART1_CS(1);
	if(temp==0x01)
       UART1_CS(2); 
			

	PID_set('p',kp);
	while((U1LSR&0x40)==0);
	EEPSAV();
	PID_set('p',kp);
	while((U1LSR&0x40)==0);
	EEPSAV();
   	
	PID_set('i',ki);
   	while((U1LSR&0x40)==0);
	EEPSAV();
	PID_set('i',ki);
   	while((U1LSR&0x40)==0);
	EEPSAV();

	PID_set('d',kd);
    while((U1LSR&0x40)==0);
	EEPSAV();
	PID_set('d',kd);
    while((U1LSR&0x40)==0);
	EEPSAV();


}

/****************************************************************************
* 名称:Mpara_search()
* 功能:驱动器位置,速度。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Mpara_search(struct DATA_BUF *com_pk)
{	
	 
	uint8 pos_index=0;
	uint8 v_index=0;
	uint8 temp;
			
	TXD_BUF[0].IP_addr=0x01;
	TXD_BUF[0].length=0x06;
	TXD_BUF[0].command=0x28;

	temp=com_pk->data[0];
/* */
	if(temp==0x02)		
	   UART1_CS(1);
	if(temp==0x01)
		UART1_CS(2); 
	
	POS_get();
	Delay(60);
 
	while((U1LSR&(1<<0) == (1<<0)))  
	{   
		pos[pos_index++]=U1RBR;		
	}
 

	GN_get();	
	Delay(60);
 	while((U1LSR&(1<<0) ==(1<<0))) 
	{  
		v[v_index++]=U1RBR;
		
	}	

	PVdata_proc();
	set_sum(&TXD_BUF[0]);  
  	TXD_BUF[0].state=0x00;

	while( ((TXD_BUF[0].state)&SET_NEW)!=0x01 )
	 {	 
		 while((U0LSR&0x40)==0);
		 uart_tx_isr(0);	
	 }

}
/****************************************************************************
* 名称:PVdata_proc()
* 功能:把串口1接收到的位置、速度和电流数据(ASKII码)按协议要求的格式保存在缓冲区。
* 入口参数:temp  临时数据
* 出口参数:无
****************************************************************************/
void PVdata_proc()
{
	uint8 index1,index2;
	uint8 temp,data;
	uint8 nOrp1=0;
	uint8 nOrp2=0;
	uint8 num;

	uint32 posdata=0;
	uint16 vdata=0;

	for(num=0;num<7;num++)
	{
		TXD_BUF[0].data[num]	= 0;	
	}

	for(index1=0;index1<12;index1++)
	{
		temp=pos[index1];
		if((temp!=0x0D)&&(temp!=0x0A))
		{  
		 	
			if(temp==0x2D)
			{
				nOrp1 = 1;
			}
			else
			{
				data=temp-0x30;
				posdata*=10;
				posdata+=data;
			}
	  	/*
		 	posdatal<<=8;
			posdatal+=temp;
		*/ 
		}	
		else
		 	break;
	}
	if(nOrp1==1)
	{
		TXD_BUF[0].data[0]=((posdata>>24)&0x000000FF)|0x80;	
	}
	else
	{
		TXD_BUF[0].data[0]=(posdata>>24)&0x000000FF;
	}

	TXD_BUF[0].data[1]=(posdata>>16)&0x000000FF;
	TXD_BUF[0].data[2]=(posdata>>8)&0x000000FF;
	TXD_BUF[0].data[3]=posdata&0x000000FF;

	for(index2=0;index2<6;index2++)
	{
		temp=v[index2];
		if((temp!=0x0D)&&(temp!=0x0A))
		{
		 	if(temp==0x2D)
			{
				nOrp2=1;
			}
			else
			{
				data=temp-0x30;
				vdata*=10;
				vdata+=data;
		 	}
		 /*
		 	vdata<<=8;
			vdata+=temp;
		*/	
		}	
		else
		 	break;
	}
	if(nOrp2==1)
	{
		TXD_BUF[0].data[4]=((vdata>>8)&0x00FF)|0x80;
	}
	else
	{
 		TXD_BUF[0].data[4]=(vdata>>8)&0x00FF;
	}
	TXD_BUF[0].data[5]=vdata&0x00FF;

	
/*	   	
	while( ((TXD_BUF[0].state)&SET_NEW)!=0x01 )
	 {	 
		 while((U0LSR&0x40)==0);
		 uart_tx_isr(0);	
	 }
*/
}
/****************************************************************************
* 名称:Epara_search()
* 功能:电气参数查询
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Epara_search(struct DATA_BUF *com_pk)
{
 	uint8 ac_index=0;
	uint8 sp_index=0;
	uint8 por_index=0,i_index=0,der_index=0;
	uint8 temp;
			
	TXD_BUF[0].IP_addr=0x01;
	TXD_BUF[0].length=0x07;
	TXD_BUF[0].command=0x2A;

	temp=com_pk->data[0];

	if(temp==0x02)		
	   UART1_CS(1);
	if(temp==0x01)
		UART1_CS(2); 
	
	GAC_get();
	Delay(60);
 
	while((U1LSR&(1<<0) == (1<<0)))  
	{   
		ac[ac_index++]=U1RBR;		
	}
 

	GSP_get();	
	Delay(60);
 	while((U1LSR&(1<<0) ==(1<<0))) 
	{  
		sp[sp_index++]=U1RBR;
		
	}	

	GPOR_get();	
	Delay(60);
	while((U1LSR&(1<<0) == (1<<0)))  
	{   
		por[por_index++]=U1RBR;		
	}
	GI_get();
	Delay(60);
	while((U1LSR&(1<<0) == (1<<0)))  
	{   
		in[i_index++]=U1RBR;		
	}
	GDER_get();
	Delay(60);
	while((U1LSR&(1<<0) == (1<<0)))  
	{   
		der[der_index++]=U1RBR;		
	}  

	PVdata_proc2();
	set_sum(&TXD_BUF[0]);  
  	TXD_BUF[0].state=0x00;
		
	while( ((TXD_BUF[0].state)&SET_NEW)!=0x01 )
	 {	 
		 while((U0LSR&0x40)==0);
		 uart_tx_isr(0);	
	 }	

}
/****************************************************************************
* 名称:PVdata_proc2()
* 功能:把串口1接收到的加速度、最大速度和PID参数(ASKII码)按协议要求的格式保存在缓冲区。
* 入口参数:temp  临时数据
* 出口参数:无
****************************************************************************/
void PVdata_proc2()
{
	uint8 index;
	uint8 temp,data;
	uint8 num;

	uint16 acdata=0;
	uint16 spdata=0;
	uint16 pordata=0,indata=0,derdata=0;

	for(num=0;num<7;num++)
	{
		TXD_BUF[0].data[num]	= 0;	
	}

	for(index=0;index<6;index++)
	{
		temp=ac[index];
		if((temp!=0x0D)&&(temp!=0x0A))
		{  		
			data=temp-0x30;
			acdata*=10;
			acdata+=data;
			
		}	
		else
		 	break;
	}

	TXD_BUF[0].data[0]=(acdata>>8)&0x000000FF;

    TXD_BUF[0].data[1]=acdata&0x000000FF;


	for(index=0;index<6;index++)
	{
		temp=sp[index];
		if((temp!=0x0D)&&(temp!=0x0A))
		{
		 
			data=temp-0x30;
			spdata*=10;
			spdata+=data;
		 
		}	
		else
		 	break;
	}

 	TXD_BUF[0].data[2]=(spdata>>8)&0x00FF;
	TXD_BUF[0].data[3]=spdata&0x00FF;

	for(index=0;index<3;index++)
	{
		temp=por[index];
		if((temp!=0x0D)&&(temp!=0x0A))
		{
			data=temp-0x30;
			pordata*=10;
			pordata+=data;
		 	
		}	
		else
		 	break;
	}
	
	TXD_BUF[0].data[4]=pordata&0x00FF;
	for(index=0;index<3;index++)
	{
		temp=in[index];
		if((temp!=0x0D)&&(temp!=0x0A))
		{
		 
			data=temp-0x30;
			indata*=10;
			indata+=data;
		 
		}	
		else
		 	break;
	}

	TXD_BUF[0].data[5]=indata&0x00FF;
	for(index=0;index<3;index++)
	{
		temp=der[index];
		if((temp!=0x0D)&&(temp!=0x0A))
		{
		 
			data=temp-0x30;
			derdata*=10;
			derdata+=data;
		 
		}	
		else
		 	break;
	}
	
	TXD_BUF[0].data[6]=derdata&0x00FF;

	
/*	   	
	while( ((TXD_BUF[0].state)&SET_NEW)!=0x01 )
	 {	 
		 while((U0LSR&0x40)==0);
		 uart_tx_isr(0);	
	 }
*/
}
/****************************************************************************
* 名称:Transparent()
* 功能:电气参数查询。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Transparent(uint8 temp)
{
	if(transMode==1)
	{
   		UART1_CS(2);
	 }
	else if(transMode==2)
	{
		UART1_CS(1);
	}

	Delay(10);
	U1THR=temp;
}

⌨️ 快捷键说明

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