OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4841|回复: 7

关于MPU6050 加速度计初始值纠偏处理

[复制链接]

29

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2014-5-11
在线时间
87 小时
发表于 2018-8-14 14:08:20 | 显示全部楼层 |阅读模式
本帖最后由 chinacool_00 于 2018-8-14 14:09 编辑

     加速度值的偏移来自两个方面,一是由于芯片的测量精度,导至它测得的加速度向量并不垂直于大地;二是芯片在整个系统(如无人机)上安装的精度是有限的,系统与芯片的座标系很难达到完美重合。前者我们称为读数偏移,后者我们称为角度偏移。因为读数和角度之间是非线性关系,所以要想以高精度进行校准必须先单独校准读数偏移,再把芯片固定在系统中后校准角度偏移。然而,由于校准角度偏移需要专业设备,且对于一般应用来说,两步校准带来的精度提升并不大,因此通常只进行读数校准即可。

     对于多轴无人机而言,空中悬停时的XY平面应当平行于校准时的XY平面。此时,我们认为芯片的加速度方向应当与Z轴负方向重合,且加速度向量的模长为g,因此ACC_X和ACC_Y的理论值应为0,ACC_Z的理论值应为-16384(假设我们设定2g的倍率,1g的加速度的读数应为最大值-32768的一半)。
由于ACC_X和ACC_Y的理论值应为0,与角速度量的校准类似,这两个读数偏移量可用统计均值的方式校准。ACC_Z则需要多一步处理,即在统计偏移量的过程中,每次读数都要加上16384,再进行统计均值校准。

下面是我的MPU6050芯片处于基本水平时的加速度初值状态。我设置的倍率为4g,因此Z轴理论值 在 32768/4 = 8192 附近。与实际测得的差不太多。


微信截图_20180814111523.png

大概设置了一个纠偏数值后,如下
2.png
不论怎么调,还是有点偏差,不能调到0附近。
另外还发现,当角度变化时,加速度值也会发生变化。


bwu
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2018-8-14 15:19:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
发表于 2018-8-22 21:16:16 | 显示全部楼层
你好,能问一下您MPU6050是怎么测原始数据的呢,我这几天也在做这个,芯片水平放置静止时,各个量的跳动就很厉害,从0到几百上千,不知道哪里出问题了,能交流一下吗
回复 支持 反对

使用道具 举报

29

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2014-5-11
在线时间
87 小时
 楼主| 发表于 2018-8-23 08:48:06 | 显示全部楼层
BUAAQZ 发表于 2018-8-22 21:16
你好,能问一下您MPU6050是怎么测原始数据的呢,我这几天也在做这个,芯片水平放置静止时,各个量的跳动就 ...

原子例程里面有获取原始数据的函数,实际就是读取芯片内部对应寄存器的值,你看一下代码。
bwu
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
发表于 2018-8-23 08:54:07 | 显示全部楼层
chinacool_00 发表于 2018-8-23 08:48
原子例程里面有获取原始数据的函数,实际就是读取芯片内部对应寄存器的值,你看一下代码。

我就是按照原子例程里面写的,从初始化到读数,但是6个量都是大范围跳动
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
发表于 2018-8-23 09:01:37 | 显示全部楼层
        SPI_MPU_ReadReg(MPU_buff,0x3B,6);
               
        ax=(((u16)MPU_buff[0]) << 8) | MPU_buff[1];               
        ay=(((u16)MPU_buff[2]) << 8) | MPU_buff[3];
        az=(((u16)MPU_buff[4]) << 8) | MPU_buff[5];
       
        SPI_MPU_ReadReg(MPU_buff,0x41,2);
       
        raw=(((u16)MPU_buff[0]) << 8) | MPU_buff[1];       
        temp=36.53+(raw)/340;               
                                               
        SPI_MPU_ReadReg(MPU_buff,0x43,6);
        gx=(((u16)MPU_buff[0]) << 8) | MPU_buff[1];        
        gy=(((u16)MPU_buff[2]) << 8) | MPU_buff[3];        
        gz=(((u16)MPU_buff[4]) << 8) | MPU_buff[5];       
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
发表于 2018-8-23 09:03:09 | 显示全部楼层
        MPU_AD0_CTRL=0;                       

        SPI_MPU_WriteReg(MPUREG_PWR_MGMT_1,0X80);
        delay_ms(100);
        SPI_MPU_WriteReg(MPUREG_PWR_MGMT_1,0x00);
       
        MPU_Set_Gyro_Fsr(3);                                       
        MPU_Set_Accel_Fsr(0);                                       
       
        SPI_MPU_WriteReg(MPUREG_INT_ENABLE,0X00);       
        SPI_MPU_WriteReg(MPUREG_USER_CTRL,0X00);       
        SPI_MPU_WriteReg(MPUREG_FIFO_EN,0X00);            
        SPI_MPU_WriteReg(MPUREG_INT_PIN_CFG,0X80);       
        SPI_MPU_WriteReg(MPUREG_PWR_MGMT_1,0X01);       
        SPI_MPU_WriteReg(MPUREG_PWR_MGMT_2,0X00);       
        MPU_Set_Rate(50);                                                       
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2018-1-17
在线时间
10 小时
发表于 2018-8-23 09:03:40 | 显示全部楼层
上面这个就是我的读数和初始化程序,没觉得哪里有问题啊,能帮忙看看吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表