MPU6050芯片 寄存器详解与配置指南(详解)

文章目录

    • MPU6050
      • 主要寄存器
        • `MPU6050_SMPLRT_DIV (0x19)`:采样率分频寄存器
        • `MPU6050_CONFIG (0x1A)`:配置寄存器
        • `MPU6050_GYRO_CONFIG (0x1B)`:陀螺仪配置寄存器
        • `MPU6050_ACCEL_CONFIG (0x1C)`:加速度计配置寄存器
        • 数据输出类寄存器(0x3B~0x48)
        • 电源管理类寄存器
          • `MPU6050_PWR_MGMT_1 (0x6B)`:电源管理寄存器 1
          • `MPU6050_PWR_MGMT_2 (0x6C)`:电源管理寄存器 2
        • 设备标识寄存器
          • `MPU6050_WHO_AM_I (0x75)`:身份识别寄存器
        • 1. 采样频率分频器(Sample Rate Divider)
        • 2. 陀螺仪配置寄存器(Gyroscope Configuration)
        • 3. 加速度计配置寄存器(Accelerometer Configuration)
        • 4. 电源管理寄存器 1(Power Management 1)
        • 5. 电源管理寄存器 2(Power Management 2)
        • 6. 数据寄存器(Data Registers)
        • 7. ID 寄存器(WHO_AM_I)
      • MPU6050实现通信的主要代码

MPU6050

主要寄存器

#define	MPU6050_SMPLRT_DIV		0x19
#define	MPU6050_CONFIG			0x1A
#define	MPU6050_GYRO_CONFIG		0x1B
#define	MPU6050_ACCEL_CONFIG	0x1C

#define	MPU6050_ACCEL_XOUT_H	0x3B
#define	MPU6050_ACCEL_XOUT_L	0x3C
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48

#define	MPU6050_PWR_MGMT_1		0x6B
#define	MPU6050_PWR_MGMT_2		0x6C
#define	MPU6050_WHO_AM_I		0x75
MPU6050_SMPLRT_DIV (0x19):采样率分频寄存器
  • 功能:设置陀螺仪的采样频率(最终输出速率)。
  • 原理:陀螺仪的原始输出速率(典型值为 8kHz)会被此寄存器的值分频,最终采样率公式为:
    采样率 = 陀螺仪输出率 / (分频值 + 1)
    例如:分频值设为 0x07(7),则采样率为 8kHz/(7+1)=1kHz
MPU6050_CONFIG (0x1A):配置寄存器
  • 功能
    • 低通滤波器(DLPF)配置:设置陀螺仪和温度传感器的抗混叠滤波器截止频率(影响噪声和响应速度)。
    • 外部帧同步(FSYNC):可选同步外部输入信号(用于多传感器同步)。
  • 典型设置:例如设置 0x03 对应低通滤波器截止频率≈42Hz(标准模式常用)。
MPU6050_GYRO_CONFIG (0x1B):陀螺仪配置寄存器
  • 功能
    • 满量程范围(FS_SEL 位):设置陀螺仪的测量范围(±250/±500/±1000/±2000°/s)。
    • 自检功能(X/Y/Z_GYRO_SELF_TEST 位):用于验证陀螺仪硬件是否正常(工厂校准用,用户一般不使用)。
  • 示例:FS_SEL=0b01 对应 ±500°/s,分辨率为 500*2 / 65536 ≈ 0.015268°/s/LSB
MPU6050_ACCEL_CONFIG (0x1C):加速度计配置寄存器
  • 功能
    • 满量程范围(AFS_SEL 位):设置加速度计的测量范围(±2/±4/±8/±16g)。
    • 自检功能(X/Y/Z_ACCEL_SELF_TEST 位):验证加速度计硬件是否正常。
    • 高通滤波器(HPF)配置:可选设置加速度计的高通滤波器(用于去除低频噪声,如重力偏移)。
数据输出类寄存器(0x3B~0x48)

这些寄存器存储传感器的原始采样数据(16 位有符号整数,高位在前),具体对应关系如下:

寄存器地址 含义 说明
0x3B ACCEL_XOUT_H 加速度计 X 轴数据高位(高 8 位)
0x3C ACCEL_XOUT_L 加速度计 X 轴数据低位(低 8 位)
0x3D~0x40 ACCEL_YOUT_H/L、ACCEL_ZOUT_H/L 加速度计 Y 轴、Z 轴数据(同上)
0x41~0x42 TEMP_OUT_H/L 温度传感器数据(原始值需转换为实际温度:温度(℃) = 36.53 + 原始值/340
0x43~0x48 GYRO_XOUT_H/L、GYRO_YOUT_H/L、GYRO_ZOUT_H/L 陀螺仪 X/Y/Z 轴数据(同上)
电源管理类寄存器
MPU6050_PWR_MGMT_1 (0x6B):电源管理寄存器 1
  • 核心功能
    • 复位(DEVICE_RESET 位):写 1 可软复位所有寄存器(需等待复位完成)。
    • 睡眠模式(SLEEP 位):写 1 进入低功耗睡眠模式(默认上电后可能处于此模式)。
    • 时钟源选择(CLKSEL 位):可选内部 8MHz 晶振或陀螺仪 X 轴时钟(推荐用陀螺仪时钟以提高精度)。
    • 温度传感器使能(TEMP_DIS 位):默认使能,写 1 可关闭(降低功耗)。
MPU6050_PWR_MGMT_2 (0x6C):电源管理寄存器 2
  • 功能:控制加速度计和陀螺仪各轴的待机模式。
    • 若某轴的待机位(如 X_GYRO_STBY)置 1,则该轴传感器进入低功耗待机(节省电流)。
    • 通常需要将所有轴的待机位清零(使能所有轴)以正常工作。
设备标识寄存器
MPU6050_WHO_AM_I (0x75):身份识别寄存器
  • 功能:存储设备的固定 ID(默认值为 0x68),用于验证 MPU6050 是否正常连接。
  • 使用场景:初始化时读取此寄存器,若值不为 0x68,说明 I2C 通信失败或硬件异常。
1. 采样频率分频器(Sample Rate Divider)
  • 地址0x19(十进制 25)

  • 功能:配置采样频率分频系数,控制 ADC 转换速度和数据刷新率。

    • 公式

      数据刷新率 = 陀螺仪输出时钟频率 /(1 + 分频值)

      • 未使用低通滤波器时,陀螺仪时钟为 8kHz
      • 使用低通滤波器时,陀螺仪时钟为 1kHz
    • 配置逻辑:分频值越小,数据刷新越快(如分频值 = 0 时,刷新率 = 8kHz/1=8kHz)。

2. 陀螺仪配置寄存器(Gyroscope Configuration)
  • 地址0x1B(十进制 27)
  • 功能
    • 高 3 位(D7-D5):自测使能位(FSYNC),置 1 时启用陀螺仪自测功能。
      • 自测使能时的数据 - 自测失能时的数据 = 自测响应
      • 使能自测位 → 读取数据 → 禁用自测位 → 再次读取数据 → 计算自测响应值 → 与手册范围对比验证芯片功能。
    • 中间 2 位(D4-D3):满量程范围选择(FS_SEL)
      • 00:±250°/s
      • 01:±500°/s
      • 10:±1000°/s
      • 11:±2000°/s
    • 低 3 位(D2-D0):保留位,默认 0。
    • 通过陀螺仪配置寄存器(0x1B)的低 3 位选择滤波参数,参数越大,数据越平滑(但延迟增加)。
3. 加速度计配置寄存器(Accelerometer Configuration)
  • 地址0x1C(十进制 28)
  • 功能
    • 高 3 位(D7-D5):自测使能位,置 1 时启用加速度计自测功能。与上面一致
    • 中间 2 位(D4-D3):满量程范围选择
      • 00:±2g
      • 01:±4g
      • 10:±8g
      • 11:±16g
    • 低 3 位(D2-D0):高通滤波器配置(用于运动检测,默认 0,暂不使用)。
4. 电源管理寄存器 1(Power Management 1)
  • 地址0x6B(十进制 107)
  • 功能
    • D7(RESET):复位位,置 1 时所有寄存器恢复默认值。
    • D6(SLEEP):睡眠模式,置 1 时芯片进入低功耗模式(上电默认值为 1,需手动清零解除睡眠)。
    • D5(CYCLE):循环模式,置 1 时芯片周期性唤醒(低功耗模式)。
    • D4(TEMP_DIS):温度传感器禁用位,置 1 时关闭温度传感器。
    • D3-D1(CLK_SEL):时钟源选择(关键配置):
      • 000:内部晶振(默认)
      • 001:X 轴陀螺仪晶振(推荐,精度更高)
      • 010:Y 轴陀螺仪晶振
      • 011:Z 轴陀螺仪晶振
      • 100:外部时钟(32.768kHz 方波)
      • 101:外部时钟(19.2MHz 方波)
5. 电源管理寄存器 2(Power Management 2)
  • 地址0x6C(十进制 108)
  • 功能:控制各轴待机模式,置 1 时对应轴进入低功耗状态(如仅需加速度计数据,可将陀螺仪轴待机)。
    • D7-D2:分别对应陀螺仪 X/Y/Z 轴和加速度计 X/Y/Z 轴的待机位。
6. 数据寄存器(Data Registers)
  • 加速度计数据

    • X 轴:0x3B(H)、0x3C(L)
    • Y 轴:0x3D(H)、0x3E(L)
    • Z 轴:0x3F(H)、0x40(L)
  • 陀螺仪数据

    • X 轴:0x43(H)、0x44(L)
    • Y 轴:0x45(H)、0x46(L)
    • Z 轴:0x47(H)、0x48(L)
  • 温度传感器数据0x41(H)、0x42(L)

  • 读取方法

    // 示例:读取加速度计X轴数据
    uint8_t acc_x_h = read_reg(0x3B);
    uint8_t acc_x_l = read_reg(0x3C);
    int16_t acc_x = (acc_x_h << 8) | acc_x_l; // 合并高低位
    
7. ID 寄存器(WHO_AM_I)
  • 地址0x75(十进制 117)
  • 功能:只读寄存器,值固定为 0x68,用于验证芯片是否正常连接(与 AD0 引脚无关,AD0 仅影响 I2C 从机地址)。

三、寄存器配置关键注意事项

  1. 上电默认值

    • 电源管理寄存器 1(0x6B)默认值为 0x40(即 SLEEP=1),需先写入 0x01 解除睡眠模式并选择时钟源(如陀螺仪晶振)。
    // 示例:初始化电源管理寄存器
    write_reg(0x6B, 0x01); // 解除睡眠,选择X轴陀螺仪晶振(CLK_SEL=001)
    
  2. 满量程与分辨率

    • 满量程越小,分辨率越高(如加速度计 ±2g 量程时,1LSB 对应 2g/32768 ≈ 0.00015g),需根据实际运动幅度选择。
  3. I2C 地址与读写操作

    • 7 位从机地址AD0=0 时为 0x68AD0=1 时为 0x69
    • 两种表示方式
      • 方式 1:地址仅含 7 位(如0x68),读写时需左移 1 位并添加读写位(写0x68<<1=0xD0,读0xD0|0x01=0xD1)。
      • 方式 2:直接使用带读写位的地址(写0xD0,读0xD1)。

MPU6050实现通信的主要代码

// MPU6050.c

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"
#include "MPU6050Reg.h" 
#define MPU6050_Address 0xD0


//指定位置读
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
	uint8_t data;
	//起始位
	MyI2C_Start();
	MyI2C_SendByte(MPU6050_Address);
	//接收应答位
	MyI2C_ReadAck();
	//发送寄存器地址
	MyI2C_SendByte(RegAddress);
	MyI2C_ReadAck();
	
	//因为又要设置读写,所以要重启起始位
	MyI2C_Start();
	//发送从机地址,因为是读数据所以地址最后的读写位为1
	MyI2C_SendByte(MPU6050_Address | 0x01);
	//接收应答位
	MyI2C_ReadAck();
	data = MyI2C_ReadByte();
	//发送应答位 表示要停止
	MyI2C_SendAck(1);
	MyI2C_End();
	return data;
}
//指定地址写
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
	//起始位
	MyI2C_Start();
	MyI2C_SendByte(MPU6050_Address);
	//接收应答位
	MyI2C_ReadAck();
	//发送寄存器地址
	MyI2C_SendByte(RegAddress);
	MyI2C_ReadAck();
	//发送数据
	MyI2C_SendByte(Data);
	MyI2C_ReadAck();
	//停止位
	MyI2C_End();
}
uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}
void MPU6050_Init(void)
{
	MyI2C_Init();
	//配置相关的寄存器
	//电源管理寄存器 时钟选择陀螺仪x时钟
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);
	//电源管理寄存器2 配置待机模式,都不待机
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);
	//配置分频系数,值越小越快
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);
	//配置寄存器 滤波模式 最平滑的滤波 0x06
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);
	//陀螺仪配置寄存器 选择最大量程 11 
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);
	//加速度计配置寄存器 最大量程
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);
	
}
//经过上面寄存器的配置,数据都存在了寄存器中,直接设置读取寄存器的函数
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,
							int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
	uint8_t DataH, DataL;
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
	*AccX = DataH << 8 | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
	*AccY = DataH << 8 | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
	*AccZ = DataH << 8 | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
	*GyroX = DataH << 8 | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
	*GyroY = DataH << 8 | DataL;
	
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
	*GyroZ = DataH << 8 | DataL;
	
}

你可能感兴趣的:(STM32,标准库,江协科技,stm32,嵌入式硬件,江协科技,STM32)