【求助】ADXL345三轴输出数据问题

hartsing 2014-07-10 03:24:51
各位大哥,小弟用STM32读取ADXL345的三轴加速度,发现结果读数很不正确,求助大神帮忙看看问题何在?在此谢过!
原始数据——读取寄存器数据;解算数据——(float)原始数据*3.9/1000

附(数据):
依次为X/Y/Z方向
静止:
原始数据:13 14 230
解算数据:0.050700/0.054600/0.897000
原始数据:13 13 229
解算数据:0.050700/0.050700/0.893100
轻微运动:
原始数据:65459 65489 210
解算数据:255.290100/255.407104/0.819000
原始数据:65509 65535 86
解算数据:255.485107/255.586502/0.335400

附(代码):
void ADXL345_READ_XYZ(u16 *x,u16 *y,u16 *z) //读取三个方向的值
{
u8 buf[6];
buf[0]=ADXL345_RD_Reg(DATA_X0);
buf[1]=ADXL345_RD_Reg(DATA_X1);
buf[2]=ADXL345_RD_Reg(DATA_Y0);
buf[3]=ADXL345_RD_Reg(DATA_Y1);
buf[4]=ADXL345_RD_Reg(DATA_Z0);
buf[5]=ADXL345_RD_Reg(DATA_Z1);
*x=buf[1]<<8|buf[0];
*y=buf[3]<<8|buf[2];
*z=buf[5]<<8|buf[4];
printf(“原始数据:%d %d %d\r\n",*x,*y,*z);
}
void ADXL345_Init(void) //ADXL345初始化
{
IIC2_Init();
if(ADXL345_RD_Reg(DEVICE_ID)==0XE5)
{
ADXL345_WR_Reg(DATA_FORMAT,0X2B);
ADXL345_WR_Reg(BW_RATE,0x0A);
ADXL345_WR_Reg(POWER_CTL,0x28);
ADXL345_WR_Reg(INT_ENABLE,0x00);
ADXL345_WR_Reg(OFSX,0x00);
ADXL345_WR_Reg(OFSY,0x00);
ADXL345_WR_Reg(OFSZ,0x00);
}
}
...全文
1555 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinerise 2016-04-19
  • 打赏
  • 举报
回复
用3轴有几个问题要注意一下就好: 1.数据是有符号的 2.数据是不断跳的。即使静止,数据也会有微小的变化 3.数据的准确性和运动的力臂有很大关系。用1米长的杆和用2米长的杆,晃动的时候,读出来的数据是完全不一样的,变化很大。因此,计算运动物体的角度值,一定要和陀螺仪配合起来,做卡尔曼滤波来估算。 4.如果力臂很大,哪怕只有半米,那么滤波计算的时候,收敛的速度也是很明显的。做过测试,用卡尔曼融合陀螺仪的数据来滤波,哪怕放到力臂只有半米的杆上转动,那么算出来的角度的收敛的速度也会明显的延迟。而当力臂只有几个厘米的转动时,反应非常快,角度收敛的实时性好很多。
Gao_Line 2016-04-17
  • 打赏
  • 举报
回复

输出数据是二进制补码,最高位是符号位,当大于0x7FFF时,要减去0xFFFF(取反加一)

21,620

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧