中级会员
- 积分
- 276
- 金钱
- 276
- 注册时间
- 2017-7-26
- 在线时间
- 81 小时
|
150金钱
我用JY901的上位机接收数据,显示的数据比较平滑。但是自己写的程序用IAR监控的话数据跳变比较大,请问各位大手子是怎么解决的。是完全按照手册来写的程序吗,有写过的的大手子给个例程或者帮忙看下我的例程指教下哪里有错误:
/*************************************************
数据接收区域,数据类型:1、加速度,2、角速度,3、角度,其余以后另外加
字头0x55,加速度0x51,角速度0x52,角度0x53
*************************************************/
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
temp = USART_ReceiveData(USART2);
/**************************************
判断是不是数组的起始位置
****************************************/
if(temp_data.lock == 0 && temp == 0x55)
{
temp_data.lock = 1;
temp_data.start_byte = 0x55;
//USART_SendData(USART1,temp_data.start_byte);
}
/*************************************
开始接受数据
**************************************/
else if(temp_data.lock == 1 && i<10)
{
/********************************
加速度数据接收
*******************************/
temp_data.rev_data[i] = temp;
if(temp_data.rev_data[0] == 0x51)
{
acc[i] = temp_data.rev_data[i];
//USART_SendData(USART1,acc[i]);
i++;
if(i == 10)
{
temp_data.lock = 0;
i = 0;
}
}
/*********************************
角速度数据接收
**********************************/
else if(temp_data.rev_data[0] == 0x52)
{
angv[i] = temp_data.rev_data[i];
//USART_SendData(USART1,angv[i]);
i++;
if(i == 10)
{
temp_data.lock = 0;
i = 0;
}
}
/************************************
角度数据接收
************************************/
else if(temp_data.rev_data[0] == 0x53)
{
ang[i] = temp_data.rev_data[i];
//USART_SendData(USART1,ang[i]);
i++;
if(i == 10)
{
temp_data.lock = 0;
i = 0;
temp_data.status_byte = 1; //最后一个数据接收完毕,标志位置1
}
}
}
}
/****************************************************
数据接收完成,对数据进行处理,数据类型
1、acc,加速度计算
2、angv,角速度计算
3、ang,角度计算
*****************************************************/
if(temp_data.status_byte ==1)
{
/****************************
加速度计算区域
ax = (float)(((acc[2]*256)+acc[1]))/32768*16*9.8;
ay = (float)(((acc[4]*256)+acc[3]))/32768*16*9.8;
az = (float)(((acc[6]*256)+acc[5]))/32768*16*9.8;
****************************/
/******************************
角速度计算区域
******************************/
wx = (float)((angv[2]*256)+angv[1])/32768*2000;
wy = (float)((angv[4]*256)+angv[3])/32768*2000;
wz = (float)((angv[6]*256)+angv[5])/32768*2000;
/*******************************
角度计算区域
********************************/
rx = (float)((ang[2]*256)+ang[1])/32768*180; //X向角度计算
if(rx>180)
{
rx = rx-360;
}
ry = (float)((ang[4]*256)+ang[3])/32768*180; //Y向角度计算
if(ry>180)
{
ry = ry-360;
}
rz = (float)((ang[6]*256)+ang[5])/32768*180; //Z向角度计算
temp_data.status_byte = 0; //最后一个数据接收完成标志位复位
if(ctr_fly ==1)
{
PID_Control(rx,ry);
}
}
|
|