📄 comm.c
字号:
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 + -