QMI8658A 六轴惯性测量单元的应用介绍
目录
概述
1 芯片概述
2 性能参数对比(vs MPU6050)
3 引脚配置与接口
3.1 引脚定义(LGA-16封装)
3.2 接口模式配置
4 核心寄存器详解
4.1 关键控制寄存器
4.2 数据输出寄存器
5 QMI8658A的驱动程序实现方法
5.1 I²C初始化代码(Arduino)
5.2 低功耗模式配置
5.3 数据读取与处理
5.3.1 原始数据读取
5.3.2 物理量转换
5.4 高级功能应用
5.4.1 传感器自检
5.4.2 运动中断检测
5.5 校准技术
5.5.1 六点加速度校准法
5.5.2 自动校准实现
6 典型应用
6.1 典型应用电路
6.2 驱动流程
7 寄存器列表
概述
本文主要介绍QMI8658A 的芯片的相关内容,包括寄存器的相关参数,驱动程序的实现。QMI8658A 是矽睿科技(QST)推出的高性能6轴MEMS惯性测量单元,集成了3轴加速度计和3轴陀螺仪,专为工业级应用设计,具有卓越的温度稳定性和抗冲击能力。
1 芯片概述
QMI8658A 是矽睿科技(QST)推出的高性能6轴MEMS惯性测量单元,集成了3轴加速度计和3轴陀螺仪,专为工业级应用设计,具有卓越的温度稳定性和抗冲击能力。
核心优势
超低噪声:加速度计噪声密度仅90μg/√Hz
高温度稳定性:全温范围±0.5mg零偏稳定性
宽电压范围:1.7V-3.6V工作电压
智能电源管理:<2μA待机电流
内置自检功能:硬件级传感器诊断
2 性能参数对比(vs MPU6050)
参数 | QMI8658A | MPU6050 | 优势 |
---|---|---|---|
加速度计量程 | ±2/4/8/16g | ±2/4/8/16g | 同等 |
陀螺仪量程 | ±125/250/500/1000/2000dps | ±250/500/1000/2000dps | 更精细 |
噪声密度 | 90μg/√Hz | 300μg/√Hz | 低67% |
零偏稳定性 | ±0.5mg | ±1mg | 高2倍 |
工作电压 | 1.7-3.6V | 2.375-3.46V | 更宽范围 |
电流消耗 | 150μA@100Hz | 3.9mA@100Hz | 低96% |
温度范围 | -40~+85℃ | -40~+85℃ | 同等 |
3 引脚配置与接口
3.1 引脚定义(LGA-16封装)
引脚 | 名称 | 功能 | 说明 |
---|---|---|---|
1 | GND | 地 | 电源地 |
2 | VDDIO | IO电源 | 1.7-3.6V |
3 | SDA/SPI_SDI | 串行数据 | I²C/SPI模式 |
4 | SCL/SPI_SCK | 串行时钟 | I²C/SPI模式 |
5 | CSB | 片选 | SPI模式使能 |
6 | SDO/SA0 | 数据输出/地址 | SPI输出/I²C地址选择 |
7 | INT1 | 中断1 | 可编程中断 |
8 | INT2 | 中断2 | 可编程中断 |
9-16 | NC | 未连接 | 保留 |
3.2 接口模式配置
模式 | CSB | SDO/SA0 | 说明 |
---|---|---|---|
I²C地址0 | 高 | 低 | 0x6A |
I²C地址1 | 高 | 高 | 0x6B |
SPI模式 | 低 | 任意 | 4线SPI |
4 核心寄存器详解
4.1 关键控制寄存器
寄存器 | 地址 | 功能 | 复位值 |
---|---|---|---|
WHO_AM_I | 0x00 | 设备ID (0x05) | 0x05 |
CTRL1 | 0x02 | 传感器使能 | 0x60 |
CTRL2 | 0x03 | 加速度配置 | 0x04 |
CTRL3 | 0x04 | 陀螺仪配置 | 0x44 |
CTRL7 | 0x08 | 传感器模式 | 0x00 |
4.2 数据输出寄存器
数据轴 | 寄存器地址 | 数据格式 |
---|---|---|
Accel_X | 0x35-0x36 | 16位有符号 |
Accel_Y | 0x37-0x38 | 16位有符号 |
Accel_Z | 0x39-0x3a | 16位有符号 |
Gyro_X | 0x3b-0x3c | 16位有符号 |
Gyro_Y | 0x3d-0x3e | 16位有符号 |
Gyro_Z | 0x3f-0x40 | 16位有符号 |
Temp | 0x33-0x34 | 16位有符号 |
5 QMI8658A的驱动程序实现方法
笔者基于Arduino平台实现QMI8658A的驱动程序
5.1 I²C初始化代码(Arduino)
#include <Wire.h>
#define QMI8658_ADDR 0x6A // SA0=0void setup() {Wire.begin();// 复位设备writeRegister(0x02, 0x80); // CTRL1: Soft resetdelay(50);// 配置加速度计±8g, 100HzwriteRegister(0x03, 0x24); // CTRL2: Accel 100Hz, ±8g// 配置陀螺仪±500dps, 100HzwriteRegister(0x04, 0x54); // CTRL3: Gyro 100Hz, ±500dps// 启用6轴传感器writeRegister(0x02, 0xE0); // CTRL1: Enable Accel+Gyro
}void writeRegister(uint8_t reg, uint8_t value) {Wire.beginTransmission(QMI8658_ADDR);Wire.write(reg);Wire.write(value);Wire.endTransmission();
}
5.2 低功耗模式配置
// 进入低功耗模式
void enterLowPowerMode() {writeRegister(0x02, 0x60); // 仅加速度计工作writeRegister(0x06, 0x03); // CTRL7: 低功耗模式
}// 唤醒设备
void wakeUp() {writeRegister(0x02, 0xE0); // 启用6轴writeRegister(0x06, 0x00); // 正常模式
}
5.3 数据读取与处理
5.3.1 原始数据读取
int16_t readSensor(uint8_t reg) {Wire.beginTransmission(QMI8658_ADDR);Wire.write(reg);Wire.endTransmission(false);Wire.requestFrom(QMI8658_ADDR, 2);uint16_t data = (Wire.read() << 8) | Wire.read();return (int16_t)data;
}void loop() {int16_t accX = readSensor(0x29);int16_t accY = readSensor(0x2B);int16_t accZ = readSensor(0x2D);int16_t gyrX = readSensor(0x2F);int16_t gyrY = readSensor(0x31);int16_t gyrZ = readSensor(0x33);delay(10);
}
5.3.2 物理量转换
// 加速度转换 (g)
float accelToG(int16_t raw, uint8_t range) {const float scales[] = {0.000244f, 0.000488f, 0.000976f, 0.001952f};return raw * scales[range];
}// 陀螺仪转换 (dps)
float gyroToDPS(int16_t raw, uint8_t range) {const float scales[] = {0.0038147f, 0.0076294f, 0.0152588f, 0.0305176f, 0.0610352f};return raw * scales[range];
}// 温度转换 (°C)
float tempToC(int16_t raw) {return (raw / 256.0f) + 25.0f;
}
5.4 高级功能应用
5.4.1 传感器自检
void sensorSelfTest()
{// 启动加速度计自检writeRegister(0x0D, 0x01); delay(100);uint8_t status = readRegister(0x0E);if((status & 0x01) == 0) {Serial.println("Accel SelfTest: FAIL");} else {Serial.println("Accel SelfTest: PASS");}// 启动陀螺仪自检writeRegister(0x0D, 0x02);delay(100);status = readRegister(0x0E);if((status & 0x02) == 0) {Serial.println("Gyro SelfTest: FAIL");} else {Serial.println("Gyro SelfTest: PASS");}
}
5.4.2 运动中断检测
// 配置敲击检测
void setupTapDetection()
{// 配置加速度阈值writeRegister(0x1B, 0x20); // TAP_TH: 2g阈值// 配置敲击时间窗口writeRegister(0x1C, 0x7F); // TAP_DUR: 100ms窗口// 使能敲击检测中断writeRegister(0x0A, 0x20); // INT_EN: 使能敲击中断writeRegister(0x0B, 0x01); // INT_MAP: 映射到INT1
}// 中断服务程序
void isr()
{uint8_t status = readRegister(0x09);if(status & 0x20) {Serial.println("Tap Detected!");}
}
5.5 校准技术
5.5.1 六点加速度校准法
5.5.2 自动校准实现
void calibrateAccelerometer()
{const int samples = 500;float sum[6][3] = {0}; // +X,-X,+Y,-Y,+Z,-Z// 提示用户放置位置for(int pos=0; pos<6; pos++)
{Serial.print("Place position ");Serial.println(pos);delay(3000);for(int i=0; i<samples; i++) {readRawAccel();sum[pos][0] += accelX;sum[pos][1] += accelY;sum[pos][2] += accelZ;delay(10);}}// 计算偏移和比例因子offsetX = (sum[0][0] + sum[1][0]) / (2*samples);scaleX = 1.0 / (fabs(sum[0][0]-offsetX) + fabs(sum[1][0]-offsetX)) * samples;// 同理计算Y,Z轴...
}
6 典型应用
6.1 典型应用电路
1) I2C驱动电路
2)SPI驱动电路