MPU6050简介

项目说明
类型6轴姿态传感器
功能测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合可得到姿态角
应用场景平衡车、飞行器等需要检测自身姿态的场景
3轴加速度计(Accelerometer)测量X、Y、Z轴的加速度
3轴陀螺仪传感器(Gyroscope)测量X、Y、Z轴的角速度

传感器轴数说明

轴数组成部分描述
3轴单独的加速度计或陀螺仪测量X、Y、Z三个轴的加速度或角速度
6轴加速度计(3轴) + 陀螺仪(3轴)如MPU6050,同时测量加速度和角速度
9轴加速度计(3轴) + 陀螺仪(3轴) + 磁力计(3轴)增加磁场强度测量,提供更完整的姿态信息
10轴9轴基础上增加气压计增加海拔高度测量,适用于更复杂的导航场景

设备地址信息

配置7位地址写入地址读取地址
AD0接地0x680xD00xD1
AD0接VCC0x690xD20xD3

寄存器总表

寄存器类别寄存器地址寄存器名称功能描述
电源管理0x6BPWR_MGMT_1电源管理1,控制设备复位、睡眠模式等
电源管理0x6CPWR_MGMT_2电源管理2,控制加速度计和陀螺仪的待机模式
配置0x1ACONFIG配置寄存器,控制DLPF(数字低通滤波器)
配置0x1BGYRO_CONFIG陀螺仪配置,设置满量程范围
配置0x1CACCEL_CONFIG加速度计配置,设置满量程范围
加速度计数据0x3BACCEL_XOUT_H加速度计X轴数据高8位
加速度计数据0x3CACCEL_XOUT_L加速度计X轴数据低8位
加速度计数据0x3DACCEL_YOUT_H加速度计Y轴数据高8位
加速度计数据0x3EACCEL_YOUT_L加速度计Y轴数据低8位
加速度计数据0x3FACCEL_ZOUT_H加速度计Z轴数据高8位
加速度计数据0x40ACCEL_ZOUT_L加速度计Z轴数据低8位
温度传感器数据0x41TEMP_OUT_H温度传感器数据高8位
温度传感器数据0x42TEMP_OUT_L温度传感器数据低8位
陀螺仪数据0x43GYRO_XOUT_H陀螺仪X轴数据高8位
陀螺仪数据0x44GYRO_XOUT_L陀螺仪X轴数据低8位
陀螺仪数据0x45GYRO_YOUT_H陀螺仪Y轴数据高8位
陀螺仪数据0x46GYRO_YOUT_L陀螺仪Y轴数据低8位
陀螺仪数据0x47GYRO_ZOUT_H陀螺仪Z轴数据高8位
陀螺仪数据0x48GYRO_ZOUT_L陀螺仪Z轴数据低8位
中断0x38INT_STATUS中断状态寄存器
中断0x37INT_ENABLE中断使能寄存器
中断0x39INT_PIN_CFG中断引脚配置寄存器
I2C从设备0x24-0x33SLAVE_0-3_ADDR, SLAVE_0-3_REG, SLAVE_0-3_CTRLI2C从设备地址、寄存器和控制寄存器
I2C从设备0x6AUSER_CTRL用户控制寄存器,控制I2C主模式
I2C从设备0x34I2C_MST_STATUSI2C主模式状态寄存器
其他0x75WHO_AM_I设备ID寄存器,默认值0x68
其他0x1DACCEL_CONFIG2加速度计配置2,控制加速度计的采样率和低通滤波器
其他0x1ELP_ACCEL_ODR低功耗加速度计输出数据速率配置
其他0x1FWOM_THR运动检测阈值
其他0x69SMPLRT_DIV采样率分频器

寄存器配置说明

  • 陀螺仪满量程范围配置 (GYRO_CONFIG, 0x1B)
FS_SEL位满量程范围灵敏度
0±250 °/s131 LSB/(°/s)
1±500 °/s65.5 LSB/(°/s)
2±1000 °/s32.8 LSB/(°/s)
3±2000 °/s16.4 LSB/(°/s)
  • 加速度计满量程范围配置 (ACCEL_CONFIG, 0x1C)
AFS_SEL位满量程范围灵敏度
0±2g16384 LSB/g
1±4g8192 LSB/g
2±8g4096 LSB/g
3±16g2048 LSB/g

MPU6050配置代码

c
#define MPU6050_ADDRESS    0xD0

// 指定地址写
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
    MyI2C_Start();
    MyI2C_SendByte(MPU6050_ADDRESS);
    MyI2C_ReceiveAck();
    MyI2C_SendByte(RegAddress);
    MyI2C_ReceiveAck();
    MyI2C_SendByte(Data);
    MyI2C_ReceiveAck();
    MyI2C_Stop();
}

// 指定地址读
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
    uint8_t Data;
    MyI2C_Start();
    MyI2C_SendByte(MPU6050_ADDRESS);
    MyI2C_ReceiveAck();
    MyI2C_SendByte(RegAddress);
    MyI2C_ReceiveAck();
    MyI2C_Start();
    MyI2C_SendByte(MPU6050_ADDRESS | 0x01);
    MyI2C_ReceiveAck();
    Data = MyI2C_ReceiveByte(1);
    MyI2C_Stop();
    return Data;
}

// 初始化MPU6050
uint8_t MPU6050_Init(void)
{
    uint8_t WhoAmI;
    MyI2C_Init();
    WhoAmI = MPU6050_ReadReg(MPU6050_REG_WHO_AM_I);
    if (WhoAmI != 0x68) return 1;
    MPU6050_WriteReg(MPU6050_REG_PWR_MGMT_1, 0x00);
    MPU6050_WriteReg(MPU6050_REG_SMPLRT_DIV, 0x07);
    MPU6050_WriteReg(MPU6050_REG_CONFIG, 0x00);
    MPU6050_WriteReg(MPU6050_REG_GYRO_CONFIG, 0x00);
    MPU6050_WriteReg(MPU6050_REG_ACCEL_CONFIG, 0x00);
    return 0;
}

// 获取加速度
void MPU6050_GetAccel(int16_t *AccelX, int16_t *AccelY, int16_t *AccelZ)
{
    uint8_t Data[6];
    MPU6050_ReadRegs(MPU6050_REG_ACCEL_XOUT_H, Data, 6);
    *AccelX = (Data[0] << 8) | Data[1];
    *AccelY = (Data[2] << 8) | Data[3];
    *AccelZ = (Data[4] << 8) | Data[5];
}

// 获取角速度
void MPU6050_GetGyro(int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
    uint8_t Data[6];
    MPU6050_ReadRegs(MPU6050_REG_GYRO_XOUT_H, Data, 6);
    *GyroX = (Data[0] << 8) | Data[1];
    *GyroY = (Data[2] << 8) | Data[3];
    *GyroZ = (Data[4] << 8) | Data[5];
}

// 获取温度值
void MPU6050_GetTemp(int16_t *Temp)
{
    uint8_t Data[2];
    MPU6050_ReadRegs(MPU6050_REG_TEMP_OUT_H, Data, 2);
    *Temp = (Data[0] << 8) | Data[1];
}

// 获取所有数据
void MPU6050_GetAllData(int16_t *AccelX, int16_t *AccelY, int16_t *AccelZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ, int16_t *Temp)
{
    uint8_t Data[14];
    MPU6050_ReadRegs(MPU6050_REG_ACCEL_XOUT_H, Data, 14);
    *AccelX = (Data[0] << 8) | Data[1];
    *AccelY = (Data[2] << 8) | Data[3];
    *AccelZ = (Data[4] << 8) | Data[5];
    *Temp = (Data[6] << 8) | Data[7];
    *GyroX = (Data[8] << 8) | Data[9];
    *GyroY = (Data[10] << 8) | Data[11];
    *GyroZ = (Data[12] << 8) | Data[13];
}