概述
这是一个适用于 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

Comments | NOTHING