新手上路
积分 29
金钱 29
注册时间 2021-10-26
在线时间 10 小时
1 金钱
最近在用STM32单片机+正点原子例程调试MPU6050,初始化过程正常(没启动DMP),能正常读取ID,也能读取各个配置过的寄存器,读出的数据是配置写入的数据(读电源管理寄存器1值为0X01),说明I2C时序应该没问题,但在读温度寄存器、加速度及角速度寄存器时,结果全为0,网上各种方法都试过了,包括上电复位延时、优化I2C时序、更换模块等都不好使,折腾好几天还是没进展,影响项目进度!
有人遇到过这样的问题吗?谢谢!
//--------------------------------------MPU初始化-------------------------------------------//
u8 MPU_Init(void)
{
delay_ms(1000); //上电延时
delay_ms(1000);
MPU_IIC_Init(); //I2C IO初始化
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位
delay_ms(100);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒
delay_ms(100);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //再唤醒
delay_ms(100);
MPU_Set_Gyro_Fsr(3); //
MPU_Set_Accel_Fsr(0); //
MPU_Set_Rate(50); //
MPU_Write_Byte(MPU_INT_EN_REG,0X00); //
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //
MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);
res=MPU_Read_Byte(MPU_DEVICE_ID_REG); //读ID
if(res==MPU_ADDR) //正确0X68
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //
res=MPU_Read_Byte(MPU_PWR_MGMT1_REG);
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //¼óËù¶èóëíóÂYòǶ¼1¤×÷
res=MPU_Read_Byte(MPU_PWR_MGMT2_REG);
MPU_Set_Rate(50); //éèÖÃ2éÑùÂêÎa50Hz
}
else return 1;
return 0;
}
//--------------------------------------主函数------------------------------------------------------//
int main(void)
{
float pitch,roll,yaw; //
short aacx,aacy,aacz; //
short gyrox,gyroy,gyroz; //
short temp;
u8 res1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200); //
MPU_Init(); //初始化MPU6050
while(1)
{
delay_ms(20);
temp=MPU_Get_Temperature(); //为0
delay_ms(2);
res1=MPU_Read_Byte(MPU_DEVICE_ID_REG); //为0X68
res1=MPU_Read_Byte(MPU_PWR_MGMT1_REG); //为 0X01
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //全为0
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //全为0
}
}
//--------------------------------------读角速度原始数据------------------------------------------------------//
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{
u8 buf[6],res;
buf[0] = MPU_Read_Byte(MPU_GYRO_XOUTH_REG);
buf[1] = MPU_Read_Byte(MPU_GYRO_XOUTL_REG);
buf[2] = MPU_Read_Byte(MPU_GYRO_YOUTH_REG);
buf[3] = MPU_Read_Byte(MPU_GYRO_YOUTL_REG);
buf[4] = MPU_Read_Byte(MPU_GYRO_ZOUTH_REG);
buf[5] = MPU_Read_Byte(MPU_GYRO_ZOUTL_REG);
// res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
// if(res==0)
{
*gx=((u16)buf[0]<<8)|buf[1];
*gy=((u16)buf[2]<<8)|buf[3];
*gz=((u16)buf[4]<<8)|buf[5];
}
return res;;
}
//--------------------------------------读加速度原始数据------------------------------------------------------//
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
u8 buf[6],res;
res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
if(res==0)
{
*ax=((u16)buf[0]<<8)|buf[1];
*ay=((u16)buf[2]<<8)|buf[3];
*az=((u16)buf[4]<<8)|buf[5];
}
return res;;
}
我来回答