.h

MPU6050_REG.h

#ifndef __MPU6050_REG_H
#define __MPU6050_REG_H
 
// 采样率分频寄存器
// 用于设置传感器输出数据的采样频率,计算公式:采样率 = 陀螺仪输出率 / (1 + SMPLRT_DIV)
// 陀螺仪默认输出率为1kHz或8kHz(取决于陀螺仪配置)
#define	MPU6050_SMPLRT_DIV 0x19
 
// 配置寄存器
// 主要用于设置陀螺仪和加速度计的低通滤波器(LPF)参数,控制数据平滑程度
#define	MPU6050_CONFIG 0x1A
 
// 陀螺仪配置寄存器
// 用于设置陀螺仪的量程范围(±250°/s, ±500°/s, ±1000°/s, ±2000°/s)
// 同时可配置陀螺仪自检功能
#define	MPU6050_GYRO_CONFIG 0X1B
 
// 加速度计配置寄存器
// 用于设置加速度计的量程范围(±2g, ±4g, ±8g, ±16g)
// 同时可配置加速度计自检功能
#define	MPU6050_ACCEL_CONFIG 0x1C
 
// 加速度计X轴数据输出寄存器(高8位)
#define	MPU6050_ACCEL_XOUT_H 0X3B
// 加速度计X轴数据输出寄存器(低8位)
// 与高8位组合为16位有符号整数,表示X轴加速度值
#define	MPU6050_ACCEL_XOUT_L 0x3C
 
// 加速度计Y轴数据输出寄存器(高8位)
#define	MPU6050_ACCEL_YOUT_H 0X3D
// 加速度计Y轴数据输出寄存器(低8位)
// 与高8位组合为16位有符号整数,表示Y轴加速度值
#define	MPU6050_ACCEL_YOUT_L 0X3E
 
// 加速度计Z轴数据输出寄存器(高8位)
#define	MPU6050_ACCEL_ZOUT_H 0X3F
// 加速度计Z轴数据输出寄存器(低8位)
// 与高8位组合为16位有符号整数,表示Z轴加速度值
#define	MPU6050_ACCEL_ZOUT_L 0x40
 
// 温度传感器数据输出寄存器(高8位)
#define	MPU6050_TEMP_OUT_H 0x41
// 温度传感器数据输出寄存器(低8位)
// 与高8位组合为16位有符号整数,表示芯片内部温度
#define	MPU6050_TEMP_OUT_L 0x42
 
// 陀螺仪X轴数据输出寄存器(高8位)
#define	MPU6050_GYRO_XOUT_H 0x43
// 陀螺仪X轴数据输出寄存器(低8位)
// 与高8位组合为16位有符号整数,表示X轴角速度值
#define	MPU6050_GYRO_XOUT_L 0x44
 
// 陀螺仪Y轴数据输出寄存器(高8位)
#define	MPU6050_GYRO_YOUT_H 0X45
// 陀螺仪Y轴数据输出寄存器(低8位)
// 与高8位组合为16位有符号整数,表示Y轴角速度值
#define	MPU6050_GYRO_YOUT_L 0x46
 
// 陀螺仪Z轴数据输出寄存器(高8位)
#define	MPU6050_GYRO_ZOUT_H 0x47
// 陀螺仪Z轴数据输出寄存器(低8位)
// 与高8位组合为16位有符号整数,表示Z轴角速度值
#define	MPU6050_GYRO_ZOUT_L 0x48
 
// 电源管理寄存器1
// 用于控制设备的电源模式、时钟源选择
// bit7为复位位(1=复位),bit6用于使能睡眠模式,bits2:0选择时钟源
#define	MPU6050_PWR_MGMT_1 0x6B
 
// 电源管理寄存器2
// 用于单独控制加速度计和陀螺仪各轴的电源模式
#define	MPU6050_PWR_MGMT_2 0x6C
 
// 设备ID寄存器
// 读取该寄存器可获取设备ID,MPU6050默认返回0x68,用于验证设备连接是否正确
#define	MPU6050_WHO_AM_I 0x75
 
#endif
 

MPU6050.h

#ifndef __MPU6050_H
#define __MPU6050_H
 
#include <stdint.h>
 
//写入寄存器
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data);
//读取寄存器
uint8_t MPU6050_ReadReg(uint8_t RegAddress);
 
// 读取原始加速度数据。寄存器0x3B到0x40中,分别表示加速度计的X、Y、Z轴数据
void MPU6050_ReadAccel(int16_t *ax, int16_t *ay, int16_t *az);
// 读取原始陀螺仪数据。寄存器0x43到0x48中,分别表示陀螺仪的X、Y、Z轴数据
void MPU6050_ReadGyro(int16_t *gx, int16_t *gy, int16_t *gz);
// 陀螺仪数据格式转换:将读取到的原始数据转换为实际的物理量-------°/s单位
float MPU6050_ConvertGyro(int16_t value);
// 加速度数据格式转换:将读取到的原始数据转换为实际的物理量-------g单位,1g≈9.8m/s²
float MPU6050_ConvertAccel(int16_t value);
 
 
//初始化硬件MPU6050
void MPU6050_Init(void);
 
 
/*----------------------------------------
           初始函数内置函数
------------------------------------------*/
 
// 通过PWR_MGMT_1寄存器设置MPU6050的工作模式
void MPU6050_SetPowerMode(uint8_t mode);
// 通过SMPLRT_DIV寄存器设置采样率分频值,从而控制数据的采样频率
void MPU6050_SetSampleRate(uint8_t div);
// 通过PWR_MGMT_1寄存器启用加速度计和陀螺仪
void MPU6050_EnableSensors(void);
 
#endif
 

.c

MPU6050

#include "MPU6050.h"      
#include "MPU6050_REG.h"//寄存器地址
 
#include <stdint.h>
#include "i2c.h"
 
#define MPU6050_Addr (0x68 << 1) // 7位地址左移1位
 
// 陀螺仪量程配置(对应MPU6050_GYRO_CONFIG寄存器的FS_SEL位)
// 量程越大,可测量的角速度范围越大,但精度越低
#define GYRO_RANGE_250DPS    0x00  // ±250°/s(度每秒),最高精度,适合缓慢姿态变化(如机器人平稳运动)
#define GYRO_RANGE_500DPS    0x08  // ±500°/s,中等精度与量程,适合常规运动检测(如步行、缓慢旋转)
#define GYRO_RANGE_1000DPS   0x10  // ±1000°/s,中低精度,适合快速运动(如车辆转向、游戏手柄)
#define GYRO_RANGE_2000DPS   0x18  // ±2000°/s,最低精度,适合高速旋转场景(如无人机、赛车)
 
// 加速度计量程配置(对应MPU6050_ACCEL_CONFIG寄存器的AFS_SEL位)
// 量程越大,可测量的加速度越大,但精度越低
#define ACCEL_RANGE_2G       0x00  // ±2g(1g≈9.8m/s²),最高精度,适合静态姿态检测(如水平校准、倾角测量)
#define ACCEL_RANGE_4G       0x08  // ±4g,中等精度,适合常规运动(如步行、缓慢加速)
#define ACCEL_RANGE_8G       0x10  // ±8g,中低精度,适合较剧烈运动(如跑步、跳跃)
#define ACCEL_RANGE_16G      0x18  // ±16g,最低精度,适合高强度冲击场景(如碰撞检测、快速移动设备)
 
// 当前选用的量程(根据实际场景修改)
#define Gyro_Range  GYRO_RANGE_2000DPS  // 陀螺仪选用±2000°/s量程
#define Accel_Range ACCEL_RANGE_4G     // 加速度计选用±4g量程
 
 
 
//初始化硬件MPU6050
void MPU6050_Init(void)
{
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x81);//复位选用陀螺仪时钟作为时钟源
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);//使能3轴加速度和3轴陀螺仪
	
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);	//设置采样分频器为10
	
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);	//设置数字低通滤波器
	
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, Gyro_Range); //配置陀螺仪满量程+2000dps
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, Accel_Range);//配置陀螺仪满量程±4g
	
	HAL_Delay(50);
}
 
 
// 读取陀螺仪数据。寄存器0x43到0x48中,分别表示陀螺仪的X、Y、Z轴数据
void MPU6050_ReadGyro(int16_t *gx, int16_t *gy, int16_t *gz) 
{
    uint8_t buffer[6]; // 创建一个6字节的缓冲区,用于存储从MPU6050读取的陀螺仪数据
 
    // 逐个读取陀螺仪的X、Y、Z轴的高字节和低字节数据
    buffer[0] = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H); // X轴陀螺仪数据的高字节
    buffer[1] = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L); // X轴陀螺仪数据的低字节
    buffer[2] = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H); // Y轴陀螺仪数据的高字节
    buffer[3] = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L); // Y轴陀螺仪数据的低字节
    buffer[4] = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H); // Z轴陀螺仪数据的高字节
    buffer[5] = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L); // Z轴陀螺仪数据的低字节
 
    // 将高字节和低字节组合成完整的16位陀螺仪数据
    *gx = (buffer[0] << 8) | buffer[1]; // 将X轴的高字节左移8位后与低字节进行按位或操作,得到完整的X轴陀螺仪数据
    *gy = (buffer[2] << 8) | buffer[3]; // 同理,得到Y轴陀螺仪数据
    *gz = (buffer[4] << 8) | buffer[5]; // 同理,得到Z轴陀螺仪数据
}
 
 
 
//  读取加速度数据。寄存器0x3B到0x40中,分别表示加速度计的X、Y、Z轴数据
void MPU6050_ReadAccel(int16_t *ax, int16_t *ay, int16_t *az) 
{
    uint8_t buffer[6]; // 创建一个6字节的缓冲区,用于存储从MPU6050读取的加速度数据
 
    // 逐个读取加速度计的X、Y、Z轴的高字节和低字节数据
    buffer[0] = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H); // X轴加速度数据的高字节
    buffer[1] = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L); // X轴加速度数据的低字节
    buffer[2] = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H); // Y轴加速度数据的高字节
    buffer[3] = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L); // Y轴加速度数据的低字节
    buffer[4] = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H); // Z轴加速度数据的高字节
    buffer[5] = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L); // Z轴加速度数据的低字节
 
    // 将高字节和低字节组合成完整的16位加速度数据
    *ax = (buffer[0] << 8) | buffer[1]; // 将X轴的高字节左移8位后与低字节进行按位或操作,得到完整的X轴加速度数据
    *ay = (buffer[2] << 8) | buffer[3]; // 同理,得到Y轴加速度数据
    *az = (buffer[4] << 8) | buffer[5]; // 同理,得到Z轴加速度数据
}
 
 
// 加速度数据格式转换:将读取到的原始数据转换为实际的物理量
float MPU6050_ConvertAccel(int16_t value) 
{
    float factor; // 用于存储转换因子
    // 根据加速度计的量程选择合适的转换因子
    switch (Accel_Range) {
        case 0x00: factor = 16384.0; break; // ±2g,转换因子为16384
        case 0x08: factor = 8192.0; break;  // ±4g,转换因子为8192
        case 0x10: factor = 4096.0; break;  // ±8g,转换因子为4096
        case 0x18: factor = 2048.0; break;  // ±16g,转换因子为2048
        default: factor = 16384.0; break;    // 默认量程范围为±2g
    }
    // 将原始加速度值转换为g单位
    return value / factor;
}
 
 
 
// 陀螺仪数据格式转换:将读取到的原始数据转换为实际的物理量
float MPU6050_ConvertGyro(int16_t value) 
{
    float factor; // 用于存储转换因子
    // 根据陀螺仪的量程选择合适的转换因子
    switch (Gyro_Range) {
        case 0x00: factor = 131.0; break;  // ±250°/s,转换因子为131
        case 0x08: factor = 65.5; break;   // ±500°/s,转换因子为65.5
        case 0x10: factor = 32.8; break;   // ±1000°/s,转换因子为32.8
        case 0x18: factor = 16.4; break;   // ±2000°/s,转换因子为16.4
        default: factor = 131.0; break;     // 默认量程范围为±250°/s
    }
    // 将原始陀螺仪值转换为°/s单位
    return value / factor;
}
 
 
// 通过IIC接口向MPU6050的寄存器写入数据,可以配置传感器的工作模式、量程、采样率等参数。
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data) 
{
    uint8_t buffer[2] = {RegAddress,Data};
    HAL_I2C_Master_Transmit(&hi2c1,MPU6050_Addr,buffer,sizeof(buffer),HAL_MAX_DELAY);
}
 
 
// 通过IIC接口从MPU6050的寄存器读取数据,可以获取传感器的配置状态或测量数据。
uint8_t MPU6050_ReadReg(uint8_t RegAddress) {
    uint8_t received_data;
    
    // 第一步:先发送要读取的寄存器地址
    HAL_I2C_Master_Transmit(&hi2c1, MPU6050_Addr, &RegAddress, 1, HAL_MAX_DELAY);
    
    // 第二步:读取数据
    HAL_I2C_Master_Receive(&hi2c1, MPU6050_Addr, &received_data, 1, HAL_MAX_DELAY);
    
    return received_data;
}
 
 
// 通过PWR_MGMT_1寄存器设置MPU6050的工作模式
void MPU6050_SetPowerMode(uint8_t mode) 
{
    MPU6050_WriteReg(MPU6050_PWR_MGMT_1, mode);
}
 
// 通过SMPLRT_DIV寄存器设置采样率分频值,从而控制数据的采样频率
void MPU6050_SetSampleRate(uint8_t div) 
{
    MPU6050_WriteReg(MPU6050_SMPLRT_DIV, div);
}
 
// 通过PWR_MGMT_1寄存器启用加速度计和陀螺仪
void MPU6050_EnableSensors(void) 
{
    MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x00); // 启用设备
}