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