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

📄 comm.c

📁 LPC2129实现从SPI通讯和两个串口定时器中断
💻 C
📖 第 1 页 / 共 3 页
字号:
	uint8 TempU1RBR;
	uint8 TempU1LSR;
	uint8 TempU1IIR;
   
   
	TempU1LSR = U1LSR;
	TempU1IIR = U1IIR; 
		 	
	if((1<<0) == (TempU1LSR&(1<<0))) 
	{   
		if(transMode)
		{
			TempU1RBR=U1RBR;	
			IO0SET=0x00400000;
			U0THR=TempU1RBR;
			Delay(5);
			IO0CLR=0x00400000;	
		}
	 }	
	 else  if( (1<<5) == (TempU1LSR&(1<<5)) )
	 {
	 }
	
	 VICVectAddr = 0x00000000; 

}

/****************************************************************************
* 名称:perform_command()
* 功能:接收上位机指令并解析。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void perform_command (struct DATA_BUF *com_pk)
{	
	if (com_pk->command<=0x0F)
	{
		SelfDetect(com_pk);		   //命令字节值在0x00--0x0F之间,高级卡自检
	}												    
	else if (com_pk->command<=0x1F)		
	{	
	}							   //命令字节值在0x010--0x1F之间,保留
	else if (com_pk->command<=0x2F)
	{
	   operate_driver(com_pk);	   //命令字节值在0x20--0x2F之间,驱动器操作
	} 
	else if (com_pk->command<=0x3F)
	{
		Gpro_process(com_pk);		//命令字节值在0x30--0x3F之间,陀螺仪操作		
	} 
	else if (com_pk->command<=0x4F)
	{
		Driver_debug(com_pk);		//命令字节值在0x40--0x4F之间,驱动器调试
	} 
	else 
	{	 							//命令字节值大于等于0x50,保留								
	}
	com_pk->state &= ~SET_NEW;		//指令解析完毕,设置解析完毕标志
	
}
/****************************************************************************
* 名称:Gpro_process()
* 功能:陀螺仪倾角计操作。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void Gpro_process(struct DATA_BUF *com_pk)
{
	   switch(com_pk->command)
	   {
		case 0x34:			//查询陀螺仪数据
			{
				Gpro_search(com_pk);
			}
			break;
		case 0x35:			//锁定航向PID参数保存
			{
			 	Para_save(com_pk);			
			}
			break;
		case 0x36:
		    
			ISendByte(0x50,0x1F);//给陀螺仪发送标定指令
			send_same_back_uart(0,com_pk);
			break;
		default:
			break;
	   }	  
}
/****************************************************************************
* 名称:Para_save()
* 功能:保存锁定航向PID参数。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void Para_save(struct DATA_BUF *com_pk)
{  uint8 temp1,temp2;
	temp1=com_pk->data[0];
	temp2=com_pk->data[1];

//	para1=com_pk->data[0];
//	para2=com_pk->data[1];

	 ; 
  ISendByte(0x50,0x2f);
	 Delay(20); 
		
  ISendByte(0x50,temp1);
     Delay(20); 	 
	
  ISendByte(0x50,temp2);	
     Delay(20); 
	 Led_off();		   
       
}

/****************************************************************************
* 名称:Gpro_search()
* 功能:陀螺仪数据查询。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void Gpro_search(struct DATA_BUF *com_pk)
{
	uint8 I2c_data[2];
  	struct DATA_BUF *send_pk = &TXD_BUF[0];		//初始化定义
	send_pk->IP_addr = 0x01;							//设置发送从机的IP地址
	send_pk->command = com_pk->command;					//设置反回发送命令,
	send_pk->length = 4;

  		IRcvByte(0x50,I2c_data);
  		Delay(10);
		gyro1 = I2c_data[0];
		
		IRcvByte(0x50,I2c_data);
		Delay(10); 
		gyro2 = I2c_data[0];
		
		IRcvByte(0x50,I2c_data);
		angle1 = I2c_data[0];

		IRcvByte(0x50,I2c_data);
		angle2 = I2c_data[0];

	send_pk->data[0] = gyro1;		
	send_pk->data[1] = gyro2;		
	send_pk->data[2] = angle1;
	send_pk->data[3] = angle2;


	set_sum (send_pk);							//设置校验和	
	uart_tx_isr(0);								//开始发送数据
/*
	IO0SET=0x00400000;
	U0THR = gyro1;
	Delay(5);
	U0THR = gyro2;
	Delay(5);
	U0THR = angle1;
	Delay(5);
	U0THR = angle1;
	Delay(5);
	IO0CLR=0x00400000;	
*/ 
}

/****************************************************************************
* 名称:SelfDetect()
* 功能:驱动器调试模式。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void SelfDetect(struct DATA_BUF *com_pk)
{
 	 switch(com_pk->command)
	 {
	 	case 0x01:				   //检查与陀螺仪通信是否正常
			{
				ISendByte(0x50,0x1f);     
				send_same_back_uart(0,com_pk);							
			}
			break;
		case 0x02:				   //高级卡自我检查
			{
				send_same_back_uart(0,com_pk);
			}
			break;
		default:
			break;
	 }
}
/****************************************************************************
* 名称:Driver_debug()
* 功能:驱动器调试模式。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void Driver_debug(struct DATA_BUF *com_pk)
{
    switch(com_pk->data[0])
	{
		case 0x01:		//左电机调试模式
			transMode=1;
			break;
		case 0x02:		//右电机调试模式
			transMode=2;
			break;
		default: 
			break;
	}
}
/****************************************************************************
* 名称:operate_driver()
* 功能:驱动器操作和电机控制。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void operate_driver(struct DATA_BUF *com_pk)
{	
	switch (com_pk->command)
	{
		case 0x20://电机反向
			dir_convert(com_pk);
			send_same_back_uart(0,com_pk);
			break;
		case 0x21://刹车
			Brake();
			send_same_back_uart(0,com_pk);	
			break;
		case 0x22: // 设置左电机位置
			Lm_posctl(com_pk);	
			send_same_back_uart(0,com_pk);
			break;
		case 0x23: //设置右电机位置
			Rm_posctl(com_pk);
			send_same_back_uart(0,com_pk);
			break;
		case 0x24:	//左电机速度设置
			V_Lctl(com_pk);
			send_same_back_uart(0,com_pk);
			break;
		case 0x25: //右电机速度设置
			V_Rctl(com_pk);
			send_same_back_uart(0,com_pk);
			break;
		case 0x26: //双电机速度设置
			V_Bctl(com_pk);	  
			send_same_back_uart(0,com_pk);
			break;
		case 0x27: //双电机加速度和最大速度设置
			A_Bctl(com_pk);
			send_same_back_uart(0,com_pk);
			break;
		case 0x28://双电机位置速度查询
	    	Mpara_search(com_pk);		
			break;
		case 0x29: //双电机PID设置
			PID_ctl(com_pk);
			send_same_back_uart(0,com_pk);
			break;
		case 0x2A://双电机加速度最大速度查询
			Epara_search(com_pk);
			break;
		case 0x2B://位置模式初始化
			InitDriver(com_pk);	
			send_same_back_uart(0,com_pk);		
			break;
		case 0x2C://锁定航行——通过陀螺仪实现		   
			if(com_pk->length==0x0b)  
			 {
			    set_sf(com_pk);	                //收到命令字2C开启锁定航向功能,采样周期0.1s
			    T0TCR = 0x03;                  // 启动并复位T0TC
	            T0TCR = 0x01; 
				sdhx(com_pk); 
			  }
			 if(com_pk->length==0x04)
			  {
			  	send_same_back_uart(0,com_pk);
				sdhx2(com_pk);
				
			  }
			  break;
		case 0x2D://转一个角度——通过陀螺仪实现
		     send_same_back_uart(0,com_pk);
	    	if(com_pk->length==0x05)
			{
			turn_angle(com_pk);  
			}
			if(com_pk->length==0x04)
			{
			turn_angle2(com_pk); 
			}						 	
			break;
		case 0x2E://设置双电机位置
		    LRm_posctl(com_pk);	 
			send_same_back_uart(0,com_pk);   
			break;
		case 0x2F://设置查询编码器线数
		  	if(com_pk->length==0x00)
			{
			  ISendByte(0x50,0x1F);		//发送标定指令,兼容以前地面移动
			}
		    else 
			set_ENCRES(com_pk);
			send_same_back_uart(0,com_pk);
			break;
	 }

}
/****************************************************************************
* 名称:InitDriver()
* 功能:驱动器位置模式初始化或位置清零。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void InitDriver(struct DATA_BUF *com_pk)
{
	UART1_CS(4); 
	if(com_pk->data[0]==1)
	{
		DFH();
	}
	else
	{
		PosModeInit();
	}

	UART1_CS(2); 
	if(com_pk->data[0]==1)
	{
		DFH();
	}
	else
	{
		PosModeInit();
	}  
}
/****************************************************************************
* 名称:Brake()
* 功能:刹车。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Brake()
{
	 SendSpeedLR(0,0);
}

/****************************************************************************
* 名称:Lm_posctl()
* 功能:双电机位置设置。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void LRm_posctl(struct DATA_BUF *com_pk)
{
	int32 circle=0,mvel=0;
 	int   temp=0;


	mvel = com_pk->data[1];
	mvel <<= 8;
	mvel |= com_pk->data[2];	

	circle = com_pk->data[3]&0x7f;
	circle <<= 24;
	temp = com_pk->data[4];
	temp <<=16;
	circle|=temp;
	temp = com_pk->data[5];
	temp <<=8;
	circle|=temp;
	circle|=com_pk->data[6];
	if(((com_pk->data[3])&0x80)==0x80)
	{
	  circle=0-circle;
	}

	UART1_CS(4); 
//	Delay(10); 
	if(com_pk->data[0]==1)
		POS_control(1,circle,mvel);
	if(com_pk->data[0]==2)
		POS_control(2,circle,mvel);	 


}
/****************************************************************************
* 名称:Lm_posctl()
* 功能:左电机位置设置。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Lm_posctl(struct DATA_BUF *com_pk)
{
    int32 circle=0,mvel=0;
	int   temp=0;


	mvel = com_pk->data[1];
	mvel <<= 8;
	mvel |= com_pk->data[2];	

	circle = com_pk->data[3]&0x7f;
	circle <<= 24;
	temp = com_pk->data[4];
	temp <<=16;
	circle|=temp;
	temp = com_pk->data[5];
	temp <<=8;
	circle|=temp;
	circle|=com_pk->data[6];
	if(((com_pk->data[3])&0x80)==0x80)
	{
	  circle=0-circle;
	}

	UART1_CS(2); 
//	Delay(10); 
	if(com_pk->data[0]==1)
		POS_control(1,circle,mvel);
	if(com_pk->data[0]==2)
		POS_control(2,circle,mvel);	 

}
/****************************************************************************
* 名称:Rm_posctl()
* 功能:右电机位置设置。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Rm_posctl(struct DATA_BUF *com_pk)
{
   int32  circle=0,mvel=0;
	int   temp=0;


	mvel = com_pk->data[1];
	mvel <<= 8;
	mvel |= com_pk->data[2];	

	circle = com_pk->data[3]&0x7f;
	circle <<= 24;
	temp = com_pk->data[4];
	temp <<=16;
	circle|=temp;
	temp = com_pk->data[5];
	temp <<=8;
	circle|=temp;
	circle|=com_pk->data[6];
	if(((com_pk->data[3])&0x80)==0x80)
	{
	   circle=0-circle;
	}

	UART1_CS(1); 
//	Delay(10); 
	if(com_pk->data[0]==1)
		POS_control(1,circle,mvel);
	if(com_pk->data[0]==2)
		POS_control(2,circle,mvel);
}
/****************************************************************************
* 名称:dir_convert()
* 功能:电机反向函数。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void dir_convert(struct DATA_BUF *com_pk)
{
	uint8 temp;
	temp=com_pk->data[0];
    switch(temp)
	{
		case 0x00:
			 SendSpeedLR(lspeed,-rspeed);
			 lspeed=0-lspeed;
			 rspeed=0-rspeed;
			break;
		case 0x01:
			UART1_CS(2);
			V_set(-lspeed);
			lspeed=0-lspeed;
			break;
		case 0x02:
			UART1_CS(1);
			V_set(-rspeed);
			rspeed=0-rspeed;
			break;
	}
}
/****************************************************************************
* 名称:V_Lctl()
* 功能:根据上位机指令设置右驱动器速度。
* 入口参数:com_pk 	需要解析的桢数据
* 出口参数:无
****************************************************************************/
void V_Lctl(struct DATA_BUF *com_pk)
{
	 int speedl=0;

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

	if(((com_pk->data[0])&0x80)==0x80)
	{
	   speedl=0-speedl;
	 }

⌨️ 快捷键说明

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