mpu6050 DMP 如何取消水平校准?

2019-08-14 01:43发布

将原子哥的MPU6050DMP成功移植到MINISTM32。每次输出的欧拉角数据都是被自动校准过的。每次初始化的时候,保持mpu6050某一状态,在这个状态的时候输出的欧拉角都为“0”。我想无论mpu6050处在何种状态,初始化完成后,当mpu6050处在水平位置时,输出的欧拉角都为“0”,不知该如何设置?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
624467649
1楼-- · 2019-08-16 06:00
thebest 发表于 2016-6-17 12:13
我今天也用了楼主给出的代码,也一直过不了初始化。硬件肯定是没问题的,用其他的程序都能读出数据。打断 ...

我已经成功了,只把int里面几个变量赋0就好了,不过这样有个现象就是初始化过程中如果晃动,那数值就要很长一段时间来变到正确值(就是慢慢减下来),dmp初始化里的自检函数加一句accel_sens=0就好了。        谁能解答下我描述的这个现象。
                dmp_set_gyro_bias(gyro);               
                accel_sens=0;                                                               
                accel[0] *= accel_sens;
skyscraper
2楼-- · 2019-08-16 11:36
 精彩回答 2  元偷偷看……
激动的小河马
3楼-- · 2019-08-16 12:12
本帖最后由 激动的小河马 于 2017-5-17 10:34 编辑

库的哪些被更改了呢?
老书虫
4楼-- · 2019-08-16 15:07
激动的小河马 发表于 2017-5-17 10:20
库的哪些被更改了呢?

问:楼主提供的无校验库的哪些地方被修改了呢?
答:
1.inv_mpu里面,run_self_test函数被更改1:原子的if(result==0x03)改成了无校验库的if(result==0x07),下面解释:
  首先找到这一句:result = mpu_run_self_test(gyro, accel);这个的意思是对陀螺仪和加计(加速度计)进行检查。
  跳到该函数,找到这里:
    accel_result = accel_self_test(accel, accel_st); //对加计进行自检,OK返回1,不OK返回0;
    gyro_result = gyro_self_test(gyro, gyro_st);     //对陀螺仪进行自检,OK返回1,不OK返回0;

    result = 0;
    if (!gyro_result)
        result |= 0x01;    //如果陀螺仪OK,result变成1;
    if (!accel_result)
        result |= 0x02;    //如果加计也OK,result变成3;

#ifdef AK89xx_SECONDARY
    compass_result = compass_self_test();
    if (!compass_result)
        result |= 0x04;    //如果磁力计也OK,result变成7;
【结论】因为MPU6050没有磁力计,所以result不可能为0x07,也就是说if必然失败,所以不会执行if里面的校正,也就是无校准。

2.inv_mpu里面,run_self_test函数下面的return被更改:return直接被注释掉,所以不会报错MPU6050 Error。
【结论】这种去掉校验的方法不可取,因为去掉校验之后,数据收敛的时间很长,而且不准。可以试试保存偏移量的办法实现以水平面为参考。
老书虫
5楼-- · 2019-08-16 17:22
无校验库的哪些地方被修改了呢? 1.inv_mpu里面,run_self_test函数被更改1:原子的if(result==0x03)改成了无校验库的if(result==0x07),下面解释:   首先找到这一句:result = mpu_run_self_test(gyro, accel);这个的意思是对陀螺仪和加计(加速度计)进行检查。   跳到该函数,找到这里:     accel_result = accel_self_test(accel, accel_st); //对加计进行自检,OK返回1,不OK返回0;     gyro_result = gyro_self_test(gyro, gyro_st);     //对陀螺仪进行自检,OK返回1,不OK返回0;      result = 0;     if (!gyro_result)         result |= 0x01;    //如果陀螺仪OK,result变成1;     if (!accel_result)         result |= 0x02;    //如果加计也OK,result变成3;  #ifdef AK89xx_SECONDARY     compass_result = compass_self_test();     if (!compass_result)         result |= 0x04;    //如果磁力计也OK,result变成7; 【结论】因为MPU6050没有磁力计,所以result不可能为0x07,也就是说if必然失败,所以不会执行if里面的校正,也就是无校准。  2.inv_mpu里面,run_self_test函数下面的return被更改:return直接被注释掉,所以不会报错MPU6050 Error。 【结论】这种去掉校验的方法不可取,因为去掉校验之后,数据收敛的时间很长,而且不准。可以试试保存偏移量的办法实现以水平面为参考。
激动的小河马
6楼-- · 2019-08-16 19:16
老书虫 发表于 2017-8-25 15:19
问:楼主提供的无校验库的哪些地方被修改了呢?
答:
1.inv_mpu里面,run_self_test函数被更改1:原子的i ...

谢谢了,我是直接屏蔽了磁场校准 现象是直接复位后的位置就是0误差面,存在的问题是只有在6050放在水平时才可进行其他实验,有点麻烦,这样感觉不够完美,目前还没想到其他方法。

一周热门 更多>