WineQ圈9 发表于 2017-6-18 10:34:03

MPU6050使用dmp库直接读角度数据

MPU6050使用的别家驱动代码,也是使用dmp库直接读角度数据,但是一开始读到的pitch值,一定为0,不管小车实际的pitch(即相对于重力方向),然后以后小车pitch变化,都是以最初的姿态为起点进行变化。弄得我每次开启小车都必须将小车很认真地摆正。
这个在初始化MPU6050的时候应该能矫正吧,在什么位置用什么函数设置呢?
还是说只能自己一开始读3轴重力加速度的值,算个初始pitch,以后每次都将从MPU6050读到的pitch值和它相减,手动矫正呢?

WineQ圈9 发表于 2017-6-18 12:29:13

总算找到原因了,我对比了平衡之家的驱动和原子的驱动,发现正点驱动里的run_self_test()这个函数里面:
u8 run_self_test(void)
{
        int result;
        //char test_packet = {0};
        long gyro, accel;
        result = mpu_run_self_test(gyro, accel);
        if (result == 0x3)
        {
                /* Test passed. We can trust the gyro data here, so let's push it down
                * to the DMP.
                */
                float sens;
                unsigned short accel_sens;
                mpu_get_gyro_sens(&sens);
                gyro = (long)(gyro * sens);
                gyro = (long)(gyro * sens);
                gyro = (long)(gyro * sens);
                dmp_set_gyro_bias(gyro);
                mpu_get_accel_sens(&accel_sens);
                accel *= accel_sens;
                accel *= accel_sens;
                accel *= accel_sens;
                dmp_set_accel_bias(accel);
                return 0;
        }else return 1;
}

这个函数内部调用了result = mpu_run_self_test(gyro, accel);
我看了一下这个内部函数的注释,大概就是如果#define了MPU6050这个宏,这个函数最终会返回0x03,如果是#define MPU6500,那么它返回7,而且好像MPU6500需要手动校正,而MPU6050不需要,所以,应该在这个函数返回0x07的时候,我们才校正,而这个校正是会对dmp里面对那pitch、roll产生影响的。如果使用MPU6050却进行该校正,那么pitch、roll会清0。所以你初始姿态的pitch就成了0值。

zbtc1 发表于 2019-3-2 17:52:12

WineQ圈9 发表于 2017-6-18 12:29
总算找到原因了,我对比了平衡之家的驱动和原子的驱动,发现正点驱动里的run_self_test()这个函数里面:
u ...

为什么我在result = mpu_run_self_test(gyro, accel);
                 if (result == 0x3)
这两行代码中把0x3改成了0x7还是不行,直接说我dmp初始化错误,您知道是哪里的问题吗?请指教,万分感谢
页: [1]
查看完整版本: MPU6050使用dmp库直接读角度数据