Skip to content

第 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_I0x00芯片 ID(应为 0x05)
CTRL10x02SPI/I2C 配置
CTRL20x03加速度计量程/ODR
CTRL30x04陀螺仪量程/ODR
CTRL70x08使能加速度计+陀螺仪
AX_L0x35加速度 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.0

5.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, &reg, 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 算法。


Built for OSRCORE robot development board.