概述

这是一个适用于 ESP32 微控制器的完整 MPU6050 I2C 驱动程序,提供完整支持来读取加速度计和陀螺仪数据,并使用互补滤波和四元数表示法计算3D方向角。

MPU6050 是一个6轴惯性测量单元(IMU),结合了:

  • 3轴加速度计 (可选范围 ±2g 到 ±16g)
  • 3轴陀螺仪 (可选范围 ±250°/s 到 ±2000°/s)
  • 内置温度传感器

主要特性

完整传感器支持

  • 读取加速度计和陀螺仪原始数据
  • 可配置的全量程范围
  • 温度传感器读取和补偿
  • FIFO缓冲区支持

高级滤波和处理

  • 互补滤波器: 结合加速度计和陀螺仪数据以计算精确的角度
  • Z轴追踪器: 专用的偏航角追踪,具有自动校正功能
  • 温度补偿: 根据温度变化自动进行漂移校正
  • 四元数支持: 将欧拉角转换为四元数表示(用于3D图形)

轻松配置

  • 通过 menuconfig 自定义I2C总线和GPIO引脚
  • 多种采样率和滤波选项
  • 漂移偏置校准
  • 简单的初始化和反初始化

硬件要求

  • ESP32 开发板 (或 ESP32-S3, ESP32-C3 等)
  • MPU6050 传感器模块
  • I2C 上拉电阻 (通常 4.7kΩ) - 默认启用内部上拉

引脚分配

组件 SDA 引脚 SCL 引脚
ESP32 I2C主机 I2C_MASTER_SDA I2C_MASTER_SCL
MPU6050 SDA SCL

默认引脚可通过 idf.py menuconfig 配置

快速开始

1. 硬件连接

MPU6050          ESP32
VCC      ----→  3.3V
GND      ----→  GND
SDA      ----→  GPIO21 (默认)
SCL      ----→  GPIO22 (默认)

2. 配置

idf.py menuconfig
# 导航到: Example Configuration
# 设置 I2C_MASTER_SDA 和 I2C_MASTER_SCL 引脚

3. 编译和烧录

idf.py -p PORT flash monitor

(按 Ctrl-] 退出串口监视器)

4. 初始化 MPU6050

#include "mpu6050.h"

void app_main(void) {
    i2c_master_bus_handle_t bus_handle;
    i2c_master_dev_handle_t dev_handle;
    mpu6050_setup_t setup = MPU6050_SETUP_DEFAULT();
    mpu6050_z_axis_tracker_t z_tracker;

    // 使用 0.0°/s 漂移补偿初始化
    mpu6050_init(&bus_handle, &dev_handle, &z_tracker, 0.0f, &setup);

    ESP_LOGI(TAG, "MPU6050 初始化成功");

    vTaskDelay(pdMS_TO_TICKS(500));

    // 主循环 - 每10ms读取一次数据 (100Hz)
    while (1) {
        mpu6050_accel_data_t accel;
        mpu6050_gyro_data_t gyro;

        mpu6050_read_accel(&dev_handle, &accel);
        mpu6050_read_gyro(&dev_handle, &gyro);

        printf("加速度: X=%.2fg, Y=%.2fg, Z=%.2fg\n", accel.x, accel.y, accel.z);
        printf("陀螺仪: X=%.2f°/s, Y=%.2f°/s, Z=%.2f°/s\n", 
               gyro.x, gyro.y, gyro.z);

        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

5. 计算3D角度

#include "mpu6050.h"

void app_main(void) {
    // ... 初始化代码 ...

    mpu6050_complementary_filter_t filter = MPU6050_COMPLT_FILTER_INIT();
    mpu6050_angle_data_t angles;
    mpu6050_z_axis_tracker_t z_tracker;

    while (1) {
        // 使用互补滤波器更新角度 (10ms采样周期)
        mpu6050_processed_angle_update(
            &dev_handle,
            &filter,
            &angles,
            0.01f,  // 10ms换算为秒
            &z_tracker
        );

        // 转换为四元数用于3D图形
        mpu6050_quaternion_t q = mpu6050_angle_to_quaternion(&angles);

        printf("欧拉角: 俯仰=%.2f°, 滚转=%.2f°, 偏航=%.2f°\n",
               angles.x, angles.y, angles.z);
        printf("四元数: w=%.4f, x=%.4f, y=%.4f, z=%.4f\n",
               q.w, q.x, q.y, q.z);

        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

API 参考

核心函数

mpu6050_init() - 初始化 MPU6050 和 I2C总线

esp_err_t mpu6050_init(
    i2c_master_bus_handle_t *bus_handle,
    i2c_master_dev_handle_t *dev_handle,
    mpu6050_z_axis_tracker_t *z_tracker,
    float drift_bias,
    mpu6050_setup_t *setup);

mpu6050_read_accel() - 读取加速度计数据

esp_err_t mpu6050_read_accel(
    i2c_master_dev_handle_t *dev_handle,
    mpu6050_accel_data_t *accel_data);

mpu6050_read_gyro() - 读取陀螺仪数据

esp_err_t mpu6050_read_gyro(
    i2c_master_dev_handle_t *dev_handle,
    mpu6050_gyro_data_t *gyro_data);

mpu6050_processed_angle_update() - 通过滤波计算3D角度

esp_err_t mpu6050_processed_angle_update(
    i2c_master_dev_handle_t *dev_handle,
    mpu6050_complementary_filter_t *filter,
    mpu6050_angle_data_t *angle_data,
    float dt,
    mpu6050_z_axis_tracker_t *z_tracker);

mpu6050_angle_to_quaternion() - 将欧拉角转换为四元数

mpu6050_quaternion_t mpu6050_angle_to_quaternion(mpu6050_angle_data_t *angles);

数据结构

  • mpu6050_accel_data_t - 加速度计读数 (g)
  • mpu6050_gyro_data_t - 陀螺仪读数 (°/s)
  • mpu6050_angle_data_t - 计算的欧拉角 (度)
  • mpu6050_quaternion_t - 四元数表示 (w, x, y, z)
  • mpu6050_z_axis_tracker_t - Z轴跟踪状态和校准数据

故障排除

问题 解决方案
WHO_AM_I 读取失败 检查I2C连接,验证 menuconfig 中的GPIO引脚
角度不准确 校准Z轴陀螺仪偏移,检查采样率
长期角度漂移 增加互补滤波器 alpha 值(更接近1.0)
温度依赖漂移 确保设备使用前至少通电6秒

示例输出

I (328) example: I2C初始化成功
I (338) example: WHO_AM_I = 104
I (348) mpu6050: Z轴校准完成! 偏移: -125
加速度: X=0.02g, Y=0.05g, Z=1.00g
陀螺仪: X=0.12°/s, Y=-0.18°/s, Z=0.05°/s
欧拉角: 俯仰=2.45°, 滚转=3.21°, 偏航=0.00°
四元数: w=0.9978, x=0.0211, y=0.0281, z=0.0001

许可证

本项目提供用于教育和个人使用。

参考资料


GitHub 仓库:Go to GitHub


Ciallo~(∠・ω< )⌒★