产品简介
Fermion: BMI323+BMM350 9轴惯性运动传感器集成了一个BMI323与BMM350。
BMI323是一款低功耗、高性能的 6 轴 IMU 传感器,集成了 3 轴加速度计和 3 轴陀螺仪。它通过 I2C 接口通信,提供全面的运动检测功能,包括计步、任意运动检测、无运动检测、显著运动检测、敲击检测、倾斜检测、方向检测和平面检测。
该传感器非常适合可穿戴设备、智能手表、健身追踪器和物联网应用,这些应用对运动感知和能效要求很高。BMI323 具有基于硬件的运动检测算法,可独立运行,无需 MCU 持续干预即可实现超低功耗。通过可配置的中断引脚(INT1 和 INT2),传感器可以高效地通知主机系统运动事件,非常适合电池供电的应用。
BMM350 是一款低功耗、低噪声的 3 轴数字地磁传感器,完全符合罗盘应用的要求。 基于博世专有的 FlipCore 技术,BMM350 提供了高精度和动态的绝对空间方向和运动矢量。 体积小、重量轻,特别适用于支持无人机精准航向。 BMM350 还可与由 3 轴加速度计和 3 轴陀螺仪组成的惯性测量单元一起使用。
产品参数
基本参数
| 参数 | 数值 |
|---|---|
| 工作电压 | 3.3V |
| 工作电流 | 0.92mA |
| 低功耗电流 | 0.37mA |
| 通讯接口 | I2C |
| 接口类型 | SH1.0-5P 接口/2.54mm 排针孔 |
| I2C 地址 | BMI323:0x69(默认)/0x68 BMM350:0x15(默认)/0x14 |
| 可编程中断引脚 | BMI323:2个(INT1、INT2) BMM350:1个(INT3) |
BMI323参数
| 参数 | 数值 |
|---|---|
| 加速度测量范围 | ±2g, ±4g, ±8g, ±16g |
| 加速度 ADC 分辨率 | 16 位 |
| 加速度灵敏度 | ±2g 量程:16384 LSB/g ±4g 量程:8192 LSB/g ±8g 量程:4096 LSB/g ±16g 量程:2048 LSB/g |
| 加速度灵敏度误差 | ±0.5% |
| 加速度零 g 偏移 | ±50 mg |
| 加速度输出数据率 (ODR) | 高性能 / 正常模式:12.5 Hz ~ 6400 Hz 低功耗模式:0.78125 Hz ~ 400 Hz |
| 陀螺仪角速度量程 | ±125, ±250, ±500, ±1000, ±2000 °/s |
| 陀螺仪 ADC 分辨率 | 16 位 |
| 陀螺仪灵敏度 | ±2000 °/s 量程:16.384 LSB/(°/s) ±1000 °/s 量程:32.768 LSB/(°/s) ±500 °/s 量程:65.536 LSB/(°/s) ±250 °/s 量程:131.072 LSB/(°/s) |
| 陀螺仪灵敏度误差 | ±3%(无自动校准)/±0.7%(自动校准后) |
| 陀螺仪零速率偏移 | ±1 °/s |
| 陀螺仪输出数据率 (ODR) | 高性能 / 正常模式:12.5 Hz ~ 6400 Hz 低功耗模式:0.78125 Hz ~ 400 Hz |
BMM350参数
| 参数 | 数值 |
|---|---|
| 工作模式 | 正常模式(周期性测量)、强制模式(触发式测量)、休眠模式(低功耗待机) |
| 测量范围 | ±2000 µT |
| 磁场分辨率 | ~0.1 µT |
| 零场偏移漂移(焊接后)零场偏移(校准后) | ±2 µT(-40°C ~ +85°C,经 Bosch eCompass 软件校准) |
| X/Y 轴增益误差 | ±1%(25°C,经 API 补偿后) |
| Z 轴增益误差 | ±3%(25°C,经 API 补偿后) |
| 灵敏度温度漂移(TCS) | ±0.010 %/K |
| 偏移温度误差(TCOerr) | ±200 nT/K |
| 正常模式输出数据率(ODR) | 400/200/100/50/25/12.5/6.25/3.125/1.5625 Hz(典型偏差 ±2%) |
| 强制模式最大触发频率 | 200 Hz(仅 avg=0 时) |
| X/Y 轴输出噪声(rms) | 190 nTrms(ODR=100Hz,平均 2 样本,3dB 带宽 = ODR/2) |
| Z 轴输出噪声(rms) | 450 nTrms(ODR=100Hz,平均 2 样本,3dB 带宽 = ODR/2) |
物理尺寸
| 参数 | 数值 |
|---|---|
| PCB尺寸 | 24mm*19mm |
| 安装孔间距 | 19mm |
| 安装孔直径 | 2mm |
尺寸图
单位:mm

引脚说明

| 引脚丝印 | 功能描述 |
|---|---|
| 3V3 | 电源正极(供电输入3.3V) |
| GND | 电源负极(接地) |
| SCL | I2C模式时钟线(SCL) |
| SDA | I2C模式数据线(SDA) |
| INT1 | BMI323 中断输出引脚1 |
| INT2 | BMI323 中断输出引脚2 |
| INT3 | BMM350 中断输出引脚 |
注意:本传感器供电与通信电平均为 3.3V,推荐搭配 3.3V 供电、3.3V 电平的主控使用。直接接入5V主控易导致传感器损坏。
焊盘配置说明(I2C地址选择)
传感器板载 2 个独立焊盘,分别对应 BMI323和 BMM350 的 I2C 地址切换,通过焊盘的 “断开 / 连接” 状态即可灵活配置目标地址,无需额外硬件修改。

BMI323 传感器 I2C 地址配置
焊盘状态直接决定 BMI323 的 I2C 通信地址,配置规则如下:
- 焊盘断开:I2C 地址为 0x69
- 焊盘连接:I2C 地址为 0x68
BMM350 传感器 I2C 地址配置
BMM350 的 I2C 地址通过对应焊盘状态切换,配置规则如下:
- 焊盘断开:I2C 地址为 0x15
- 焊盘连接:I2C 地址为 0x14
Arduino IDE 使用教程
说明:本传感器支持任意运动、无运动、显著运动等多种运动状态检测,以及敲击、倾斜、方向、平面检测等手势识别功能。Wiki 仅展示核心基础用法,更多运动状态检测与高级功能实现,请直接参考BMI323、BMM350库中完整的 examples 示例程序及API,此处不再逐一展开。
通过I2C读取数据的Arduino示例代码
目标
本教程旨在演示如何初始化BMI323、BMM350传感器,并通过轮询方式直接读取加速度、角速度和地磁数据。
硬件准备
- DFR1222 FireBeetle 2 ESP32-C5 ×1
- SEN0695 Fermion: BMI323+BMM350 9轴惯性运动传感器 ×1
软件准备
- 下载并安装 Arduino IDE:下载 Arduino IDE
- 下载并安装 DFRobot_BMI323 库:下载 DFRobot_BMI323 库
- 下载并安装 DFRobot_BMM350 库:下载 DFRobot_BMM350 库
- 库安装指南:查看安装指南
接线配置

- 按图示连接9轴IMU传感器与 ESP32-C5,核心对应关系:
- 传感器引脚 “3V3” → ESP32-C5 3.3V
- 传感器引脚 “GND” → ESP32-C5 GND
- 传感器 I2C 引脚 “SCL” → ESP32-C5 SCL(默认 GPIO10)
- 传感器 I2C 引脚 “SDA” → ESP32-C5 SDA(默认 GPIO9)
- I2C地址焊盘配置:将BMI323和BMM350的I2C地址焊盘断开,此时 BMI323的 I2C 地址为 0x69,BMM350的 I2C 地址为 0x15(出厂默认模式)
样例代码
#include "DFRobot_BMI323.h"
#include "DFRobot_BMM350.h"
#define BMI323_I2C_ADDR 0x69
#define BMM350_I2C_ADDR 0x15
DFRobot_BMI323 bmi323(&Wire, BMI323_I2C_ADDR);
DFRobot_BMM350_I2C bmm350(&Wire, BMM350_I2C_ADDR);
void setup()
{
Serial.begin(115200);
while(!Serial) {
delay(10);
}
Serial.println("BMI323 and BMM350 Combined Sensor Demo");
Serial.println("========================================");
// 初始化BMI323(六轴)
while (!bmi323.begin()) {
Serial.println("BMI323 init failed, retry in 1s");
delay(1000);
}
Serial.println("BMI323 init success!");
// 配置加速度计:50Hz采样,±8g,普通模式
if (!bmi323.configAccel(bmi323.eAccelODR50Hz, bmi323.eAccelRange8G, bmi323.eAccelModeNormal)) {
Serial.println("Accel config failed!");
while(1) delay(1000);
}
// 配置陀螺仪:800Hz采样,±2000dps,普通模式
if (!bmi323.configGyro(bmi323.eGyroODR800Hz, bmi323.eGyroRange2000DPS, bmi323.eGyroModeNormal)) {
Serial.println("Gyro config failed!");
while(1) delay(1000);
}
// 初始化BMM350(磁力计)
while (bmm350.begin()) { // begin()返回0表示成功,非0表示失败
Serial.println("BMM350 init failed, retry in 1s");
delay(1000);
}
Serial.println("BMM350 init success!");
// 设置操作模式为普通模式
bmm350.setOperationMode(eBmm350NormalMode);
// 设置预设模式为高精度,数据率25Hz
bmm350.setPresetMode(BMM350_PRESETMODE_HIGHACCURACY, BMM350_DATA_RATE_25HZ);
// 使能X、Y、Z轴测量(默认已使能,但显式调用确保)
bmm350.setMeasurementXYZ();
Serial.println("Setup complete!\n");
}
void loop()
{
// 读取BMI323数据
DFRobot_BMI323::sSensorData accel, gyro;
if (bmi323.getAccelGyroData(&accel, &gyro)) {
Serial.print("Accel (g) : ");
Serial.print(accel.x, 3);
Serial.print(", ");
Serial.print(accel.y, 3);
Serial.print(", ");
Serial.println(accel.z, 3);
Serial.print("Gyro (dps) : ");
Serial.print(gyro.x, 2);
Serial.print(", ");
Serial.print(gyro.y, 2);
Serial.print(", ");
Serial.println(gyro.z, 2);
} else {
Serial.println("Failed to read BMI323 data.");
}
// 读取BMM350数据
sBmm350MagData_t magData = bmm350.getGeomagneticData();
Serial.print("Mag (uT) : ");
Serial.print(magData.float_x, 2);
Serial.print(", ");
Serial.print(magData.float_y, 2);
Serial.print(", ");
Serial.println(magData.float_z, 2);
Serial.println("--------------------------------");
delay(200); // 约5Hz刷新率
}
结果

通过I2C获取运动状态与航向角的Arduino示例代码
目标
本教程旨在指导用户使用BMI323和BMM350传感器在ESP32上实现运动状态检测与航向角(电子罗盘)监测功能。
硬件准备
- DFR1222 FireBeetle 2 ESP32-C5 ×1
- SEN0695 Fermion: BMI323+BMM350 9轴惯性运动传感器 ×1
软件准备
- 下载并安装 Arduino IDE:下载 Arduino IDE
- 下载并安装 DFRobot_BMI323 库:下载 DFRobot_BMI323 库
- 下载并安装 DFRobot_BMM350 库:下载 DFRobot_BMM350 库
- 库安装指南:查看安装指南
接线配置

- 按图示连接9轴IMU传感器与 ESP32-C5,核心对应关系:
- 传感器引脚 “3V3” → ESP32-C5 3.3V
- 传感器引脚 “GND” → ESP32-C5 GND
- 传感器引脚 “INT1” → ESP32-C5 GPIO27
- 传感器引脚 “INT2” → ESP32-C5 GPIO26
- 传感器 I2C 引脚 “SCL” → ESP32-C5 SCL(默认 GPIO10)
- 传感器 I2C 引脚 “SDA” → ESP32-C5 SDA(默认 GPIO9)
- I2C地址焊盘配置:将BMI323和BMM350的I2C地址焊盘断开,此时 BMI323的 I2C 地址为 0x69,BMM350的 I2C 地址为 0x15(出厂默认模式)
样例代码
#include "DFRobot_BMI323.h"
#include "DFRobot_BMM350.h"
// I2C 地址定义
#define BMI323_I2C_ADDR 0x69
#define BMM350_I2C_ADDR 0x15
// 中断引脚定义(根据实际连接修改)
#define INT1_PIN 27 // BMI323 INT1 → GPIO27 (任意运动)
#define INT2_PIN 26 // BMI323 INT2 → GPIO26 (无运动)
// 创建传感器对象
DFRobot_BMI323 bmi323(&Wire, BMI323_I2C_ADDR);
DFRobot_BMM350_I2C bmm350(&Wire, BMM350_I2C_ADDR);
// 中断标志
volatile bool gAnyMotionFlag = false;
volatile bool gNoMotionFlag = false;
// 运动状态枚举
enum MotionState {
STATE_UNKNOWN,
STATE_MOVING,
STATE_STILL
};
MotionState currentState = STATE_UNKNOWN;
// 方向名称数组
const char* directionNames[] = {
"North", "Northeast", "East", "Southeast",
"South", "Southwest", "West", "Northwest"
};
// 中断服务函数
void IRAM_ATTR interruptAnyMotion() {
gAnyMotionFlag = true;
}
void IRAM_ATTR interruptNoMotion() {
gNoMotionFlag = true;
}
/**
* @brief 将航向角转换为方向名称
* @param heading 航向角 (0~360°)
* @return 方向名称字符串
*/
const char* getDirectionName(float heading) {
int index = (int)((heading + 22.5f) / 45.0f) % 8;
return directionNames[index];
}
void setup() {
Serial.begin(115200);
while (!Serial) delay(10);
Serial.println("\n=== BMI323 Motion Detector + BMM350 Compass ===");
// ---------- 初始化 BMI323 ----------
Serial.print("Initializing BMI323... ");
while (!bmi323.begin()) {
Serial.println("Failed, retry in 1s");
delay(1000);
}
Serial.println("OK");
// 配置加速度计
if (!bmi323.configAccel(bmi323.eAccelODR50Hz, bmi323.eAccelRange8G, bmi323.eAccelModeNormal)) {
Serial.println("Error: BMI323 accelerometer config failed!");
while (1) delay(1000);
}
// 配置任意运动检测(INT1)
struct bmi3_any_motion_config anyMotionCfg;
anyMotionCfg.duration = 9; // 9 * 20ms = 180ms
anyMotionCfg.slope_thres = 9; // 9 * 1.953mg ≈ 17.6mg
anyMotionCfg.acc_ref_up = 1; // 始终更新参考
anyMotionCfg.hysteresis = 5; // 5 * 1.953mg ≈ 9.8mg
anyMotionCfg.wait_time = 4; // 4 * 20ms = 80ms
if (!bmi323.enableAnyMotionInt(anyMotionCfg, bmi323.eINT1, bmi323.eAxisXYZ)) {
Serial.println("Error: Failed to enable any-motion interrupt!");
while (1) delay(1000);
}
// 配置无运动检测(INT2)
struct bmi3_no_motion_config noMotionCfg;
noMotionCfg.duration = 9; // 9 * 20ms = 180ms
noMotionCfg.slope_thres = 9; // 9 * 1.953mg ≈ 17.6mg
noMotionCfg.acc_ref_up = 1; // 始终更新参考
noMotionCfg.hysteresis = 5; // 5 * 1.953mg ≈ 9.8mg
noMotionCfg.wait_time = 5; // 5 * 20ms = 100ms
if (!bmi323.enableNoMotionInt(noMotionCfg, bmi323.eINT2, bmi323.eAxisXYZ)) {
Serial.println("Error: Failed to enable no-motion interrupt!");
while (1) delay(1000);
}
// 配置 ESP32 外部中断
attachInterrupt(digitalPinToInterrupt(INT1_PIN), interruptAnyMotion, RISING);
attachInterrupt(digitalPinToInterrupt(INT2_PIN), interruptNoMotion, RISING);
// ---------- 初始化 BMM350 ----------
Serial.print("Initializing BMM350... ");
while (bmm350.begin()) { // begin() 返回 0 成功,非 0 失败
Serial.println("Failed, retry in 1s");
delay(1000);
}
Serial.println("OK");
// 设置操作模式为普通模式
bmm350.setOperationMode(eBmm350NormalMode);
// 设置预设模式为高精度,数据率 25Hz
bmm350.setPresetMode(BMM350_PRESETMODE_HIGHACCURACY, BMM350_DATA_RATE_25HZ);
// 使能 X、Y、Z 轴测量
bmm350.setMeasurementXYZ();
Serial.println("Setup complete! Monitoring motion and compass.\n");
}
void loop() {
static unsigned long lastPrint = 0;
unsigned long now = millis();
// 处理运动中断
if (gAnyMotionFlag) {
gAnyMotionFlag = false;
uint16_t status = bmi323.getIntStatus();
if (status & BMI3_INT_STATUS_ANY_MOTION) {
if (currentState != STATE_MOVING) {
currentState = STATE_MOVING;
float heading = bmm350.getCompassDegree();
const char* dirName = getDirectionName(heading);
Serial.print("[");
Serial.print(now);
Serial.print("] State: MOVING | Direction: ");
Serial.print(dirName);
Serial.print(" (");
Serial.print(heading, 1);
Serial.println("°)");
}
}
}
if (gNoMotionFlag) {
gNoMotionFlag = false;
uint16_t status = bmi323.getIntStatus();
if (status & BMI3_INT_STATUS_NO_MOTION) {
if (currentState != STATE_STILL) {
currentState = STATE_STILL;
float heading = bmm350.getCompassDegree();
const char* dirName = getDirectionName(heading);
Serial.print("[");
Serial.print(now);
Serial.print("] State: STILL | Direction: ");
Serial.print(dirName);
Serial.print(" (");
Serial.print(heading, 1);
Serial.println("°)");
}
}
}
// 每秒输出一次当前状态和方向
if (now - lastPrint >= 1000) {
lastPrint = now;
float heading = bmm350.getCompassDegree();
const char* dirName = getDirectionName(heading);
const char* stateStr = (currentState == STATE_MOVING) ? "MOVING" :
(currentState == STATE_STILL) ? "STILL" : "UNKNOWN";
Serial.print("[");
Serial.print(now);
Serial.print("] State: ");
Serial.print(stateStr);
Serial.print(" | Direction: ");
Serial.print(dirName);
Serial.print(" (");
Serial.print(heading, 1);
Serial.println("°)");
}
delay(10);
}
结果

API函数
BMI323 API函数
/**
* @fn DFRobot_BMI323
* @brief 构造函数
* @details 构造函数 - I2C 接口
* @param wire TwoWire 对象指针,默认为 &Wire
* @param i2cAddr I2C 地址,默认为 0x69
* @return 无
*/
DFRobot_BMI323(TwoWire *wire = &Wire, uint8_t i2cAddr = 0x69);
/**
* @fn begin
* @brief 初始化函数
* @details 初始化 I2C 接口、芯片寄存器和功能上下文
* @param 无
* @return bool 类型,表示初始化状态
* @retval true 初始化成功
* @retval false 初始化失败
*/
bool begin(void);
/**
* @fn configAccel
* @brief 配置加速度计
* @param odr 输出数据速率选择(参见:eAccelODR_t)
* @n 可用速率:
* @n - eAccelODR0_78125Hz: 0.78125 Hz
* @n - eAccelODR1_5625Hz: 1.5625 Hz
* @n - eAccelODR3_125Hz: 3.125 Hz
* @n - eAccelODR6_25Hz: 6.25 Hz
* @n - eAccelODR12_5Hz: 12.5 Hz
* @n - eAccelODR25Hz: 25 Hz
* @n - eAccelODR50Hz: 50 Hz
* @n - eAccelODR100Hz: 100 Hz
* @n - eAccelODR200Hz: 200 Hz
* @n - eAccelODR400Hz: 400 Hz
* @n - eAccelODR800Hz: 800 Hz
* @n - eAccelODR1600Hz: 1600 Hz
* @n - eAccelODR3200Hz: 3200 Hz
* @n - eAccelODR6400Hz: 6400 Hz
* @n @note ODR 范围限制(基于工作模式):
* @n - 低功耗模式:0.78Hz ~ 400Hz
* @n - 普通模式:12.5Hz ~ 6400Hz
* @n - 高性能模式:12.5Hz ~ 6400Hz
* @param range 量程选择(参见:eAccelRange_t)
* @n 可用量程:
* @n - eAccelRange2G: ±2g
* @n - eAccelRange4G: ±4g
* @n - eAccelRange8G: ±8g
* @n - eAccelRange16G: ±16g
* @param mode 工作模式选择(参见:eAccelMode_t),默认为 eAccelModeNormal
* @n 可用模式:
* @n - eAccelModeLowPower: 低功耗模式
* @n - eAccelModeNormal: 普通模式(默认)
* @n - eAccelModeHighPerf: 高性能模式
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool configAccel(eAccelODR_t odr, eAccelRange_t range, eAccelMode_t mode = eAccelModeNormal);
/**
* @fn configGyro
* @brief 配置陀螺仪
* @param odr 输出数据速率选择(参见:eGyroODR_t)
* @n 可用速率:
* @n - eGyroODR0_78125Hz: 0.78125 Hz
* @n - eGyroODR1_5625Hz: 1.5625 Hz
* @n - eGyroODR3_125Hz: 3.125 Hz
* @n - eGyroODR6_25Hz: 6.25 Hz
* @n - eGyroODR12_5Hz: 12.5 Hz
* @n - eGyroODR25Hz: 25 Hz
* @n - eGyroODR50Hz: 50 Hz
* @n - eGyroODR100Hz: 100 Hz
* @n - eGyroODR200Hz: 200 Hz
* @n - eGyroODR400Hz: 400 Hz
* @n - eGyroODR800Hz: 800 Hz
* @n - eGyroODR1600Hz: 1600 Hz
* @n - eGyroODR3200Hz: 3200 Hz
* @n - eGyroODR6400Hz: 6400 Hz
* @n @note ODR 范围限制(基于工作模式):
* @n - 低功耗模式:0.78Hz ~ 400Hz
* @n - 普通模式:12.5Hz ~ 6400Hz
* @n - 高性能模式:12.5Hz ~ 6400Hz
* @param range 量程选择(参见:eGyroRange_t)
* @n 可用量程:
* @n - eGyroRange125DPS: ±125dps
* @n - eGyroRange250DPS: ±250dps
* @n - eGyroRange500DPS: ±500dps
* @n - eGyroRange1000DPS: ±1000dps
* @n - eGyroRange2000DPS: ±2000dps
* @param mode 工作模式选择(参见:eGyroMode_t),默认为 eGyroModeNormal
* @n 可用模式:
* @n - eGyroModeLowPower: 低功耗模式
* @n - eGyroModeNormal: 普通模式(默认)
* @n - eGyroModeHighPerf: 高性能模式
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool configGyro(eGyroODR_t odr, eGyroRange_t range, eGyroMode_t mode = eGyroModeNormal);
/**
* @fn getAccelGyroData
* @brief 同时读取加速度计和陀螺仪数据并返回物理单位
* @details 一次性读取加速度计和陀螺仪原始数据,转换为 g/dps 并返回
* @param accel 加速度计输出
* @param gyro 陀螺仪输出
* @return bool 类型,表示读取状态
* @retval true 读取成功
* @retval false 读取失败
*/
bool getAccelGyroData(sSensorData *accel, sSensorData *gyro);
/**
* @fn getTemperature
* @brief 读取芯片温度(摄氏度)
* @details 从传感器读取温度原始值,并按官方公式换算:温度(°C) = (int16_t)raw / 512.0 + 23.0。
* 需先配置加速度计或陀螺仪。
* @return float 温度值(单位:°C);若传感器未初始化或读取失败则返回 0.0f
*/
float getTemperature(void);
/**
* @fn enableStepCounterInt
* @brief 使能计步器中断功能
* @details 配置计步器功能并映射到指定的中断引脚,当步数变化时将触发中断
* @param pin 绑定的中断引脚(eINT1 或 eINT2)
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableStepCounterInt(eInt_t pin);
/**
* @fn readStepCounter
* @brief 读取计步器数据
* @param stepVal 步数输出指针,读取的步数将写入该指针指向的内存
* @return int8_t BMI3_OK 表示成功,其他值表示失败
*/
int8_t readStepCounter(uint16_t *stepVal);
/**
* @fn getIntStatus
* @brief 获取中断状态
* @details 读取并合并 INT1 和 INT2 引脚的中断状态,返回值为 INT1 和 INT2 状态寄存器的 OR 组合。
* @return uint16_t 合并的中断状态寄存器值(INT1 | INT2)。每一位代表不同的中断类型:
* @n - BMI3_INT_STATUS_ANY_MOTION: 检测到任意运动
* @n - BMI3_INT_STATUS_NO_MOTION: 检测到无运动
* @n - BMI3_INT_STATUS_FLAT: 平面检测
* @n - BMI3_INT_STATUS_ORIENTATION: 方向变化
* @n - BMI3_INT_STATUS_STEP_DETECTOR: 检测到步数
* @n - BMI3_INT_STATUS_SIG_MOTION: 检测到显著运动
* @n - BMI3_INT_STATUS_TILT: 检测到倾斜
* @n - BMI3_INT_STATUS_TAP: 检测到敲击
*/
uint16_t getIntStatus(void);
/**
* @fn enableAnyMotionInt
* @brief 配置任意运动阈值中断(使用官方结构体参数)
* @param config 任意运动配置结构体(参见 bmi3_any_motion_config)
* @n 参数说明:
* @n - slope_thres: 加速度斜率阈值,范围
* 0-4095,单位 1.953mg/LSB(官方示例:9 ≈ 17.6mg)
* @n - hysteresis: 滞回值,范围 0-1023,单位 1.953mg/LSB(官方示例:5 ≈ 9.8mg)
* @n - duration: 持续时间,范围 0-8191,单位 20ms(官方示例:9 = 180ms)
* @n - acc_ref_up: 加速度参考更新模式,0=事件触发时,1=始终更新(官方示例:1)
* @n - wait_time: 等待时间,范围 0-7,单位 20ms(官方示例:4-5 = 80-100ms)
* @param pin 绑定的中断引脚
* @param axisMask 轴选择掩码(默认:eAxisXYZ)
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableAnyMotionInt(const struct bmi3_any_motion_config &config,
eInt_t pin, uint8_t axisMask = eAxisXYZ);
/**
* @fn enableNoMotionInt
* @brief 配置无运动阈值中断(使用官方结构体参数)
* @param config 无运动检测配置结构体(参见 bmi3_no_motion_config)
* @n 参数说明:
* @n - slope_thres: 加速度斜率阈值,范围
* 0-4095,单位 1.953mg/LSB(官方示例:9 ≈ 17.6mg)
* @n - hysteresis: 滞回值,范围 0-1023,单位 1.953mg/LSB(官方示例:5 ≈ 9.8mg)
* @n - duration: 持续时间,范围 0-8191,单位 20ms(官方示例:9 = 180ms)
* @n - acc_ref_up: 加速度参考更新模式,0=事件触发时,1=始终更新(官方示例:1)
* @n - wait_time: 等待时间,范围 0-7,单位 20ms(官方示例:5 = 100ms)
* @param pin 绑定的中断引脚
* @param axisMask 轴选择掩码(默认:eAxisXYZ)
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableNoMotionInt(const struct bmi3_no_motion_config &config, eInt_t pin,
uint8_t axisMask = eAxisXYZ);
/**
* @fn enableSigMotionInt
* @brief 配置显著运动检测中断(使用官方结构体参数)
* @param config 显著运动配置结构体(参见 bmi3_sig_motion_config)
* @n 参数说明:
* @n - block_size: 检测段大小,范围 0-65535(官方示例:200)
* @n - peak_2_peak_min: 峰峰值加速度最小值,范围 0-1023(官方示例:30)
* @n - peak_2_peak_max: 峰峰值加速度最大值,范围 0-1023(官方示例:30)
* @n - mcr_min: 每秒平均交叉率最小值,范围 0-62(官方示例:0x10 = 16)
* @n - mcr_max: 每秒平均交叉率最大值,范围 0-62(官方示例:0x10 = 16)
* @param pin 绑定的中断引脚
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableSigMotionInt(const struct bmi3_sig_motion_config &config,
eInt_t pin);
/**
* @fn enableFlatInt
* @brief 配置平面检测中断(使用官方结构体参数)
* @param config 平面检测配置结构体(参见 bmi3_flat_config)
* @n 参数说明:
* @n - theta: 最大允许倾斜角,范围 0-63,角度计算公式为 64 *
* (tan(angle)^2)(官方示例:9)
* @n - blocking: 阻塞模式,0=MODE_0(禁用),1=MODE_1(>1.5g),
* 2=MODE_2(>1.5g 或斜率>半阈值),3=MODE_3(>1.5g 或斜率>阈值)(官方示例:3)
* @n - hold_time: 设备保持平面状态的最小持续时间,范围 0-255,单位 20ms(官方示例:50 = 1000ms)
* @n - hysteresis: 平面检测的滞回角度,范围 0-255(官方示例:9)
* @n - slope_thres: 连续加速度样本之间的最小斜率,范围 0-255(官方示例:0xCD = 205)
* @param pin 绑定的中断引脚
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableFlatInt(const struct bmi3_flat_config &config, eInt_t pin);
/**
* @fn enableOrientationInt
* @brief 配置方向检测中断(使用官方结构体参数)
* @param config 方向检测配置结构体(参见 bmi3_orientation_config)
* @n 参数说明:
* @n - ud_en: 是否检测翻转(正反面),0=禁用,1=使能(官方示例:1)
* @n - hold_time: 方向变化检测所需的持续时间,范围 0-255,单位 20ms(官方示例:4 = 80ms)
* @n - hysteresis: 方向检测的滞回值,范围 0-255(官方示例:5)
* @n - theta: 最大允许倾斜角,范围 0-63,角度=64*(tan(angle)^2)(官方示例:16)
* @n - mode: 方向检测模式,0/3=对称,1=高不对称,2=低不对称(官方示例:1)
* @n - slope_thres: 防止剧烈运动导致误检测的斜率阈值,范围 0-255(官方示例:30)
* @n - blocking: 阻塞模式,0-3(官方示例:3)
* @param pin 绑定的中断引脚
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableOrientationInt(const struct bmi3_orientation_config &config,
eInt_t pin);
/**
* @fn readOrientation
* @brief 读取方向检测输出
* @param portraitLandscape 横竖屏状态输出指针,可为 NULL
* @param faceUpDown 正反面状态输出指针,可为 NULL
* @return bool 类型,表示读取状态
* @retval true 读取成功
* @retval false 读取失败或功能未使能
*/
bool readOrientation(uint8_t *portraitLandscape, uint8_t *faceUpDown);
/**
* @fn enableTapInt
* @brief 配置敲击检测中断(使用官方结构体参数)
* @param config 敲击检测配置结构体(参见 bmi3_tap_detector_config)
* @n 关键参数(参考 tap.c):
* @n - axis_sel: 选择敲击检测的轴(0=X,1=Y,2=Z)
* @n - mode: 检测模式(0=敏感,1=普通,2=稳健)
* @n - tap_peak_thres / tap_shock_settling_dur 等用于确定敲击的时序/幅度阈值
* @param pin 绑定的中断引脚
* @param enableSingle 是否使能单击检测(默认 true)
* @param enableDouble 是否使能双击检测(默认 true)
* @param enableTriple 是否使能三击检测(默认 true)
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableTapInt(const struct bmi3_tap_detector_config &config, eInt_t pin,
bool enableSingle = true, bool enableDouble = true,
bool enableTriple = true);
/**
* @fn readTapStatus
* @brief 读取敲击检测状态(单击/双击/三击)
* @param tapMask 输出掩码(可组合 BMI3_TAP_DET_STATUS_SINGLE/DOUBLE/TRIPLE)
* @return bool 类型,表示读取状态
* @retval true 读取成功
* @retval false 读取失败
*/
bool readTapStatus(uint8_t *tapMask);
/**
* @fn enableTiltInt
* @brief 配置倾斜检测中断(使用官方结构体参数)
* @param config 倾斜检测配置结构体(参见 bmi3_tilt_config)
* @n 关键参数(参考 tilt.c):
* @n - segment_size: 用于平均参考向量的时间窗口,范围 0-255
* @n - min_tilt_angle: 需要超过的最小倾斜角,范围 0-255,角度=256*cos(angle)
* @n - beta_acc_mean: 低通平均系数,范围 0-65535
* @param pin 绑定的中断引脚
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableTiltInt(const struct bmi3_tilt_config &config, eInt_t pin);
BMM350 API函数
/**
* @fn softReset
* @brief 软件复位,软件复位后先恢复为挂起模式
*/
void softReset(void);
/**
* @fn setOperationMode
* @brief 设置传感器的执行模式
* @param opMode mode
* @n eBmm350SuspendMode 挂起模式:挂起模式是芯片上电后BMM350的默认电源模式,在挂起模式下电流消耗最小,因此该模式适用于不需要数据转换的时期(所有寄存器的读写都是可能的)
* @n eBmm350NormalMode 常规模式: 获取地磁数据
* @n eBmm350ForcedMode 强制模式: 单次测量,测量完成后传感器恢复到暂停模式
* @n eBmm350ForcedModeFast 只有使用FM_FAST时,ODR才能达到200Hz
*/
void setOperationMode(uint8_t opMode);
/**
* @fn getOperationMode
* @brief 获取传感器的执行模式
* @return result 返回字符串为传感器的执行模式
*/
String getOperationMode(void);
/**
* @fn setPresetMode
* @brief 设置预置模式,使用户更简单的配置传感器来获取地磁数据(默认的采集速率为12.5Hz)
* @param presetMode
* @n BMM350_PRESETMODE_LOWPOWER 低功率模式,获取少量的数据 取均值
* @n BMM350_PRESETMODE_REGULAR 普通模式,获取中量数据 取均值
* @n BMM350_PRESETMODE_ENHANCED 增强模式,获取大量数据 取均值
* @n BMM350_PRESETMODE_HIGHACCURACY 高精度模式,获取超大量数据 取均值
*/
void setPresetMode(uint8_t presetMode, uint8_t rate = BMM350_DATA_RATE_12_5HZ);
/**
* @fn setRate
* @brief 设置获取地磁数据的速率,速率越大获取越快(不加延时函数)
* @param rate
* @n BMM350_DATA_RATE_1_5625HZ
* @n BMM350_DATA_RATE_3_125HZ
* @n BMM350_DATA_RATE_6_25HZ
* @n BMM350_DATA_RATE_12_5HZ (默认速率)
* @n BMM350_DATA_RATE_25HZ
* @n BMM350_DATA_RATE_50HZ
* @n BMM350_DATA_RATE_100HZ
* @n BMM350_DATA_RATE_200HZ
* @n BMM350_DATA_RATE_400HZ
*/
void setRate(uint8_t rate);
/**
* @fn getRate
* @brief 获取配置的数据速率 单位:HZ
* @return rate
*/
uint8_t getRate(void);
/**
* @fn selfTest
* @brief 传感器自测,返回值表明自检结果
* @param testMode:
* @n eBmm350SelfTestNormal 常规自检,检查x轴、y轴、z轴是否接通或短路
* @return result 返回的字符串为自测的结果
*/
String selfTest(eBmm350SelfTest_t testMode = eBmm350SelfTestNormal);
/**
* @fn setMeasurementXYZ
* @brief 使能x y z 轴的测量,默认设置为使能,禁止后xyz轴的地磁数据不准确
* @param en_x
* @n BMM350_X_EN 使能 x 轴的测量
* @n BMM350_X_DIS 禁止 x 轴的测量
* @param en_y
* @n BMM350_Y_EN 使能 y 轴的测量
* @n BMM350_Y_DIS 禁止 y 轴的测量
* @param en_z
* @n BMM350_Z_EN 使能 z 轴的测量
* @n BMM350_Z_DIS 禁止 z 轴的测量
*/
void setMeasurementXYZ(enum eBmm350XAxisEnDis_t enX = BMM350_X_EN, enum eBmm350YAxisEnDis_t enY = BMM350_Y_EN, enum eBmm350ZAxisEnDis_t enZ = BMM350_Z_EN);
/**
* @fn getMeasurementStateXYZ
* @brief 获取 x y z 轴的使能状态
* @return result 返回字符串为使能的状态
*/
String getMeasurementStateXYZ(void);
/**
* @fn getGeomagneticData
* @brief 获取x y z 三轴的地磁数据
* @return 地磁的数据的结构体,单位:微特斯拉(uT)
*/
sBmm350MagData_t getGeomagneticData(void);
/**
* @fn getCompassDegree
* @brief 获取罗盘方向
* @return 罗盘方向 (0° - 360°)
* @n 0° = North, 90° = East, 180° = South, 270° = West.
*/
float getCompassDegree(void);
/**
* @fn setDataReadyPin
* @brief 使能或者禁止数据准备中断引脚
* @n 使能后有数据来临DRDY引脚跳变
* @n 禁止后有数据来临DRDY不进行跳变
* @n 高极性:高电平为活动电平,默认为低电平,触发中断时电平变为高
* @n 低极性:低电平为活动电平,默认为高电平,触发中断时电平变为低
* @param modes
* @n BMM350_ENABLE_INTERRUPT 使能DRDY
* @n BMM350_DISABLE_INTERRUPT 禁止DRDY
* @param polarity
* @n BMM350_ACTIVE_HIGH 高极性
* @n BMM350_ACTIVE_LOW 低极性
*/
void setDataReadyPin(uint8_t modes, uint8_t polarity=POLARITY_HIGH);
/**
* @fn getDataReadyState
* @brief 获取数据准备的状态,用来判断数据是否准备好
* @return status
* @n true 数据准备好了
* @n false 数据没有准备好
*/
bool getDataReadyState(void);
/**
* @fn setThresholdInterrupt(uint8_t modes, int8_t threshold, uint8_t polarity)
* @brief 设置阈值中断,当某个通道的地磁值高/低于阈值时触发中断
* @n 高极性:高电平为活动电平,默认为低电平,触发中断时电平变为高
* @n 低极性:低电平为活动电平,默认为高电平,触发中断时电平变为低
* @param modes
* @n LOW_THRESHOLD_INTERRUPT 低阈值中断模式
* @n HIGH_THRESHOLD_INTERRUPT 高阈值中断模式
* @param threshold
* @n 阈值,默认扩大16倍,例如:低阈值模式下传入阈值1,实际低于16的地磁数据都会触发中断
* @param polarity
* @n POLARITY_HIGH 高极性
* @n POLARITY_LOW 低极性
*/
void setThresholdInterrupt(uint8_t modes, int8_t threshold, enum eBmm350IntrPolarity_t polarity);
/**
* @fn getThresholdData
* @brief 获取发生阈值中断的数据
* @return 返回存放地磁数据的结构体,结构体存放三轴当数据和中断状态,
* @n xyz轴的数据为 NO_DATA 时,未触发中断
* @n mag_x、mag_y、mag_z 存放地磁数据
* @n interrupt_x、interrupt_y、interrupt_z 存放轴中断状态
*/
sBmm350ThresholdData_t getThresholdData(void);