主机在与MPU6050六轴传感器通信时出现的问题总结: 1.如果遇到读取MPU6050的ID值正常,读取的传感器数据也符合正常值,但读取到的数据为一个不变值(如读取温度为25.253529不变化),但主机复位后却出现一次变化(此时温度为25.262352,然后再次采集,值还是不变化)。 出现问题的原因:可能是I2C驱动的时序出错,大家可检查I2C的驱动程序(如本人出现问题的原因就是结束信号出错,SCL还未拉高,就将SDA置高)
I2C结束开始条件是:必须是SCL时钟信号在高电平稳定后,SDA信号产生一个下降沿,则视为通信开始。 I2C结束信号条件是:必须是SCL时钟信号在由低变高稳定后,SDA信号产生一个上升沿,则视为通信结束。
2.如果遇到读取MPU6050的ID值正常,读取的传感器数据不符合正常值,且输出一个不变值(如读取温度为36.529999,值不变化)。 原因及解决: (1)初始化之前没有进行复位MPU6050和延时处理,可参考下面代码: uint8_t MPU6050_Init(void) { uint8_t i=0;
IIC_Init(); while(MPU6050_Check()) //检测MPU6050连接是否正常 { if(i==10) return 1; delay_ms(5); i++; } MPU_Write_Byte(MPU6050_RA_PWR_MGMT_1, 0x80); //复位MPU6050 delay_ms(100); MPU_Write_Byte(MPU6050_RA_PWR_MGMT_1, 0x00); // MPU_Write_Byte(MPU6050_RA_INT_ENABLE, 0x00); //禁止中断 MPU_Write_Byte(MPU6050_RA_GYRO_CONFIG, 0x18); //陀螺仪满量程+-2000度/秒 (最低分辨率 = 2^15/2000 = 16.4LSB/度/秒 MPU_Write_Byte(MPU6050_RA_ACCEL_CONFIG, 0x08); //加速度满量程+-4g (最低分辨率 = 2^15/4g = 8196LSB/g ) MPU_Write_Byte(MPU6050_RA_CONFIG, MPU6050_DLPF_BW_20);//设置陀螺的输出为1kHZ,DLPF=20Hz MPU_Write_Byte(MPU6050_FIFO_EN_REG, 0x00); //关闭FIFO MPU_Write_Byte(MPU6050_RA_SMPLRT_DIV, 0x00); //采样分频 (采样频率 = 陀螺仪输出频率 / (1+DIV),采样频率1000hz) MPU_Write_Byte(MPU6050_RA_INT_PIN_CFG, 0x02); //MPU 可直接访问MPU6050辅助I2C MPU_Write_Byte(MPU6050_RA_PWR_MGMT_1, 0x01); //唤醒MPU6050,并选择陀螺仪x轴PLL为时钟源 MPU_Write_Byte(MPU6050_RA_PWR_MGMT_2, 0x00); return 0; }
(2)MPU6050可能损坏,更换模块,再次尝试。 (3)I2C时序出现错误,不同单片机主频不同等原因(如延时等需要调整),根据自身原因检查、调整I2C时序,保证通信正常。
|