我这里本来有一个stm32的程序,上电后的姿态会在几秒内稳定到实际姿态,倾斜着放就是倾斜着的姿态,
原子哥的程序写的也很好,但是发现原子哥给的程序上电(复位)后,无论板子怎么放,起初姿态总是是0,当然这样有这样的好处,比如平衡车直接用姿态的俯仰来作为误差来控制........我放在一起参考,发现其实两个程序都是移植DMP,基本 一模一样的,纳闷为什么一个初始化为0,一个读出实际值,无奈也分析不了DMP,只能比对两程序.发现一点细节差异....
把两个位置修改一下....可以得到复位后不为 0的姿态....其余与修改前一致
//·?????:0,????
// ????,?§°?
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) //if (result == 0x3) 这里别用0x03,第一个位置
{
/* Test passed. We can trust the gyro data here, so let's push it down
* to the DMP.
*/
*************************************************************88888
/·?????:0,????
// ????,?§°?
u8 mpu_dmp_init(void)
{
u8 res=0;
//MPU_IIC_Init(); //??????IIC×???
if(mpu_init()==0) //??????MPU6050
{
res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//?è???ù?è?????????÷
if(res)return 1;
res=mpu_configure_fifo(INV_XYZ_GYRO|INV_XYZ_ACCEL);//?è??FIFO
if(res)return 2;
res=mpu_set_sample_rate(DEFAULT_MPU_HZ); //?è?????ù??
if(res)return 3;
res=dmp_load_motion_driver_firmware(); //????dmp????
if(res)return 4;
res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));//?è????????·??ò
if(res)return 5;
res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP| //?è??dmp????
DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO|
DMP_FEATURE_GYRO_CAL);
if(res)return 6;
res=dmp_set_fifo_rate(DEFAULT_MPU_HZ); //?è??DMP????????(×??ó??????200Hz)
if(res)return 7;
res=run_self_test(); //×??ì
// if(res)return 8; //这个屏蔽掉,这里还不能return....................................................第二个位置
res=mpu_set_dmp_state(1); //????DMP
if(res)return 9;
}else return 10;
return 0;
|