#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
#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
#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); // 启用设备
}