我在参考一些例程,将MPU6050移植到了我的51
单片机中了,但资源有限,run_self_test();去掉了,应该不是这个问题吧!
现在的是这样:
上电后大约过15-20秒后系统才能正常工作,读出来pith、yaw、roll与实际运动方向也是吻合的,但就是上电后那20秒内数据一直在动。
由于资料和能力有限,虽然多基本功能算移植成功了,但许多细节我也是知其然不知其所以然。
现在都已经弄了将近一周了,仍然找不出原因,不知道是哪里抽风了。
我在初始化程序里面试过将ADCx的原始数据通过串口打印出来,但发现数据是稳定的,没有异常变化(我判断中断溢出标志后再取得ADC的数据)
但通过DMP后读出来的数据就是不稳定,这是怎么回事儿?
我在网上看见说开机8秒本来数据就稳定,但领导说不可能,还拿了一个别人做的东西出来,确实人家开机顶多3-5秒数据就稳定了
怎么办?
都要疯了。
初始化的程序是这样的:
uchar AnBT_DMP_MPU6050_Init(void){
uchar anbt_dmp_data[6];
st.chip_cfg.accel_half = 0;
st.chip_cfg.sensors = 0xFF;
st.chip_cfg.gyro_fsr = 0xFF;
st.chip_cfg.accel_fsr = 0xFF;
st.chip_cfg.lpf = 0xFF;
st.chip_cfg.sample_rate = 0xFFFF;
st.chip_cfg.fifo_enable = 0xFF;
st.chip_cfg.bypass_mode = 0xFF;
/* mpu_set_sensors always preserves this set
ting. */
st.chip_cfg.clk_src = INV_CLK_PLL;
/* Handled in next call to mpu_set_bypass. */
st.chip_cfg.active_low_int = 1;
st.chip_cfg.latched_int = 0;
st.chip_cfg.int_motion_only = 0;
st.chip_cfg.lp_accel_mode = 0;
memset(&st.chip_cfg.cache, 0, sizeof(st.chip_cfg.cache));
st.chip_cfg.dmp_on = 0;
st.chip_cfg.dmp_loaded = 0;
st.chip_cfg.dmp_sample_rate = 0;
anbt_dmp_data[0] = 0x80; //复位器件
if (AnBT_DMP_I2C_Write(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 1, &(anbt_dmp_data[0]))) return 1;
delay_ms(100);
anbt_dmp_data[0] = 0x00; //唤醒
if (AnBT_DMP_I2C_Write(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 1, &(anbt_dmp_data[0]))) return 2;
anbt_dmp_data[0] = INV_FSR_2000DPS << 3;//设置量程
if(AnBT_DMP_I2C_Write(MPU6050_ADDRESS, MPU6050_RA_GYRO_CONFIG, 1, anbt_dmp_data)) return 3;
st.chip_cfg.gyro_fsr =INV_FSR_2000DPS;
anbt_dmp_data[0] = INV_FSR_2G << 3;//设置量程
if(AnBT_DMP_I2C_Write(MPU6050_ADDRESS, MPU6050_RA_ACCEL_CONFIG, 1, anbt_dmp_data)) return 4;
st.chip_cfg.accel_fsr =INV_FSR_2G;
if (mpu_set_sample_rate(DEFAULT_MPU_HZ)) return 0x13;//频率
if(mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL)) return 5;//完成传感器设置
//例程是 if(mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL)) return 6;//完成fifo设置,换回例程试过也是一样的现象
set_int_enable(1);//原话是开中断
mpu_reset_fifo();
//MPU基础功能初始化完成///////////////////////////////////
if(dmp_load_motion_driver_firmware()) return 7;// 加载运动驱动固件;
if(dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation)))return 8;//设置初始方向和给定偏差
if(dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP |
DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO |
DMP_FEATURE_GYRO_CAL)) return 9;//DMP使能;
if(dmp_set_fifo_rate(DEFAULT_MPU_HZ)) return 10; //DMP设置FIFO速率
#if ENABLE_SELF_TEST
run_self_test();
#endif
if(mpu_set_dmp_state(1))return 11;//Dmp启动 return 0;
}