|
最近在做一个关于MPU6050的项目。但是关于MP6050的数据读取一直有问题。
问题的现象是:1、配置完成IIC初始化,等一会再配置初始化MPU6050,然后再读WHO_AM_I。读出0x68。
2、读各个常用配置寄存器的值都是自己写入的值。
3、利用连续读取采样数据函数读出MPU6050的值,发现所有6轴的值都是0x00.
4、偶尔能读出MPU6050的6轴原始数据。但是发现这些数据寄存器的值无法改变,无论如何晃动MPU6050,都是 固定的那些数值。将MPU6050复位后,数据依旧是原样。掉电重启再重新读6轴数值均为0x00。
这问题已经困扰我好多天了,特来向大家请教一下。
以下是我的初始化代码,读取代码。
void mpu6050_init()
{
mpu6050_writeBits(MPU6050_ADDR, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_DEVICE_RESET_BIT, 1, 0x80);
halMcuWaitMs(1000);
mpu6050_writeByte(MPU6050_ADDR, MPU6050_RA_PWR_MGMT_1, 0x00);
halMcuWaitMs(1000);
mpu6050_writeByte(MPU6050_ADDR, MPU6050_RA_SMPLRT_DIV, 0x07); //采样率 125Hz
halMcuWaitMs(100);
mpu6050_writeByte(MPU6050_ADDR, MPU6050_RA_CONFIG, 0x06); //低通滤波5Hz
halMcuWaitMs(100);
mpu6050_writeByte(MPU6050_ADDR, MPU6050_RA_GYRO_CONFIG, 0x18); //± 2000 °/s
halMcuWaitMs(100);
mpu6050_writeByte(MPU6050_ADDR, MPU6050_RA_ACCEL_CONFIG, 0x08); //4G
halMcuWaitMs(100);
//mpu6050_writeByte(MPU6050_ADDR, MPU6050_RA_USER_CTRL, 0x40);
//mpu6050_writeByte(MPU6050_ADDR, MPU6050_RA_FIFO_EN, 0xFF);
#if MPU6050_GETATTITUDE == 1
MPU6050_TIMER0INIT
#endif
}
void mpu6050_getRawData(int16* ax, int16* ay, int16* az, int16* gx, int16* gy, int16* gz)
{
//mpu6050_readBytes(MPU6050_ADDR, 0x75, 2, (uint8 *)buffer);
//mpu6050_readBytes(MPU6050_ADDR, MPU6050_RA_FIFO_COUNTL, 14, (uint8 *)buffer);
mpu6050_readBytes(MPU6050_ADDR, MPU6050_RA_ACCEL_XOUT_H, 14, (uint8 *)buffer);
*ax = (((int16)buffer[0]) << 8) | buffer[1];
*ay = (((int16)buffer[2]) << 8) | buffer[3];
*az = (((int16)buffer[4]) << 8) | buffer[5];
*gx = (((int16)buffer[8]) << 8) | buffer[9];
*gy = (((int16)buffer[10]) << 8) | buffer[11];
*gz = (((int16)buffer[12]) << 8) | buffer[13];
}
int8 mpu6050_readBytes(uint8 DevAddr, uint8 regAddr, uint8 length, uint8 *data)
{
uint8 i = 0;
int8 count = 0;
if(length > 0)
{
//request register
IIC_Start();
IIC_Write(DevAddr | MPU6050_WR);
IIC_Write(regAddr);
halMcuWaitUs(10);
//read data
IIC_Start();
IIC_Write(MPU6050_ADDR | MPU6050_RD);
for(i=0; i<length; i++)
{
count++;
if(i==length-1)
data[i] = IIC_Read_NOACK();
else
data[i] = IIC_Read_ACK();
}
IIC_Stop();
}
return count;
}
|
|