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