第 5 章:QMI8658 IMU(I2C 读取)
5.1 知识要点
- ESP-IDF I2C Master 新 API(v5.x)的总线与设备配置
- QMI8658 寄存器映射与初始化序列
- 加速度计(±8g)和陀螺仪(±2048 dps)的量程与灵敏度
- 原始数据到物理量的换算公式
5.2 课程内容
QMI8658 是一款六轴惯性测量单元(IMU),集成三轴加速度计和三轴陀螺仪,通过 I2C 接口与 ESP32-S3 通信。OSRCORE 将其配置为 1000 Hz 输出速率,为姿态解算提供高频传感器数据。
5.3 基础学习
I2C Master 新 API 架构
ESP-IDF v5.x 引入了新的 I2C Master API,采用总线-设备两级结构:
i2c_new_master_bus():创建总线句柄,配置 SDA/SCL 引脚和时钟i2c_master_bus_add_device():在总线上添加设备,配置地址和速率i2c_master_transmit()/i2c_master_transmit_receive():执行传输
QMI8658 关键寄存器
| 寄存器 | 地址 | 说明 |
|---|---|---|
| WHO_AM_I | 0x00 | 芯片 ID(应为 0x05) |
| CTRL1 | 0x02 | SPI/I2C 配置 |
| CTRL2 | 0x03 | 加速度计量程/ODR |
| CTRL3 | 0x04 | 陀螺仪量程/ODR |
| CTRL7 | 0x08 | 使能加速度计+陀螺仪 |
| AX_L | 0x35 | 加速度 X 低字节(共 12 字节) |
数据换算
加速度(g)= raw_int16 / 4096.0 (±8g 量程,灵敏度 4096 LSB/g)
角速度(dps)= raw_int16 / 16.0 (±2048 dps 量程,灵敏度 16 LSB/dps)
温度(°C)= raw_int16 / 256.0 + 25.05.4 程序学习
I2C 总线与设备初始化:
c
i2c_master_bus_config_t bus_cfg = {
.i2c_port = I2C_NUM_0,
.sda_io_num = 10,
.scl_io_num = 11,
.clk_source = I2C_CLK_SRC_DEFAULT,
.glitch_ignore_cnt = 7,
.flags.enable_internal_pullup = true,
};
i2c_master_bus_handle_t bus;
ESP_ERROR_CHECK(i2c_new_master_bus(&bus_cfg, &bus));
i2c_device_config_t dev_cfg = {
.dev_addr_length = I2C_ADDR_BIT_LEN_7,
.device_address = 0x6B,
.scl_speed_hz = 400000,
};
i2c_master_dev_handle_t dev;
ESP_ERROR_CHECK(i2c_master_bus_add_device(bus, &dev_cfg, &dev));读取寄存器(写地址后读数据):
c
static esp_err_t qmi_read(i2c_master_dev_handle_t dev,
uint8_t reg, uint8_t *buf, size_t len)
{
return i2c_master_transmit_receive(dev, ®, 1, buf, len, 100);
}读取并换算 IMU 数据:
c
qmi8658_data_t d;
if (qmi8658_read(&d)) {
printf("ax=%.3f ay=%.3f az=%.3f gx=%.2f gy=%.2f gz=%.2f T=%.1f\n",
d.ax, d.ay, d.az, d.gx, d.gy, d.gz, d.temp);
}5.5 课程总结
本章掌握了 ESP-IDF I2C Master 新 API 的使用方式,学会了 QMI8658 的初始化和数据读取。IMU 数据是姿态解算的原始输入,第 10 章将在此基础上实现 Madgwick AHRS 算法。