OpenEdv-开源电子网

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

发现MPU6050驱动里的bug

[复制链接]

25

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2016-5-15
在线时间
50 小时
发表于 2017-6-18 13:42:21 | 显示全部楼层 |阅读模式
做MPU6050实验时,发现无论小车初始位置什么姿态,pitch值都是0,以后pitch值的读数都是实际pitch值(即相对于重力方向)相对于初始pitch的差值。
我在查别的驱动时对比发现,在这个函数里,有问题:
u8 run_self_test(void)
{
        int result;
        //char test_packet[4] = {0};
        long gyro[3], accel[3];
        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[0] = (long)(gyro[0] * sens);
                gyro[1] = (long)(gyro[1] * sens);
                gyro[2] = (long)(gyro[2] * sens);
                dmp_set_gyro_bias(gyro);
                mpu_get_accel_sens(&accel_sens);
                accel[0] *= accel_sens;
                accel[1] *= accel_sens;
                accel[2] *= accel_sens;
                dmp_set_accel_bias(accel);
                return 0;
        }else return 1;
}



这个函数内部调用mpu_run_self_test(),并根据返回值result决定要不要进行手动校正,而我查看mpu_run_self_test()的注释,发现,MPU6500才需要这个功能,而MPU6050不需要,他有硬件矫正。但是我又想,硬件校正完,再软件校正一下应该不是什么大问题吧,结果还真是问题,就是出现我之前说的情况,不知道它内部是个什么工作机理,反正结论就是使用MPU6050时,不能在run_self_test()函数里进行手动校正,而使用MPU6050的话, result = mpu_run_self_test(gyro, accel),它的返回值为0x03。使用MPU6500它的返回值是0x07,所以这个函数应该改为:
u8 run_self_test(void)
{
        int result;
        //char test_packet[4] = {0};
        long gyro[3], accel[3];
        result = mpu_run_self_test(gyro, accel);
        if (result == 0x7)      //修改1
        {
                /* 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[0] = (long)(gyro[0] * sens);
                gyro[1] = (long)(gyro[1] * sens);
                gyro[2] = (long)(gyro[2] * sens);
                dmp_set_gyro_bias(gyro);
                mpu_get_accel_sens(&accel_sens);
                accel[0] *= accel_sens;
                accel[1] *= accel_sens;
                accel[2] *= accel_sens;
                dmp_set_accel_bias(accel);
                return 0;
        }else return 0;    //修改2
}
最后还要将 return 1,改为return 0,否则通不过初始化,mpu_dmp_init( )会陷入死循环。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-6-19
在线时间
55 小时
发表于 2017-6-19 17:48:45 | 显示全部楼层
6050和6500的自检寄存器地址不一样的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 02:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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