第一章 传感器系统总览
AtomS3R-M12 开发板上集成了两枚 Bosch Sensortec 的 MEMS 传感器:BMI270 六轴惯性测量单元(三轴加速度计 + 三轴陀螺仪),以及 BMM150 三轴地磁传感器。两者组合构成一个具备时间对齐能力的九轴传感系统,为姿态检测、运动追踪与航向角计算提供完整的原始数据来源。
与市面上常见的分立方案不同,本板上的 BMM150 并不是直接挂载到主控的 I2C 总线上,而是通过 BMI270 的 Sensor Hub 辅助接口接入。这种设计让 BMI270 与 BMI270 的加速度计、陀螺仪在同一节拍下被统一采样,三组数据的时间戳天然对齐,从而避免了多传感器方案中常见的融合漂移问题——这是理解本板九轴传感系统的关键架构特点。
本章首先介绍整体拓扑与引脚连接,随后分章节分别阐述 BMI270 与 BMM150 的基本信息、产品特点、应用场景,最后给出 Arduino 平台下的开发例程与测评计划。
第二章 BMI270 六轴惯性测量单元
2.1 基本信息
BMI270 是 Bosch Sensortec 推出的一款超低功耗六轴惯性测量单元,内部集成三轴加速度计与三轴陀螺仪,并内置一个可由用户编程的 Sensor Hub 与 2 KB FIFO 数据缓冲区。芯片采用 2.5 × 2.5 × 0.8 毫米的 LGA 封装,工作电压范围 1.71 V 至 3.6 V,与开发板上 3.3 V 供电直接兼容。
BMI270 通过 I2C 或 SPI 接口与主控通信,在 AtomS3R-M12 上使用 I2C 模式,从机地址为 0x68(ADR 引脚在板上已固定为低电平)。传感器的 INT1 与 INT2 中断引脚可配置为数据就绪、FIFO 水位、运动检测等事件的中断输出,在本板上默认连接方式可通过查阅原理图确认。
加速度计支持 ±2g、±4g、±8g、±16g 四种满量程,陀螺仪支持 ±125、±250、±500、±1000°/s 四种满量程,两者的输出数据宽度均为 16 位有符号整数,数值与物理量之间的换算关系为:加速度(g)= 原始值 × 量程 / 32768,角速度(°/s)= 原始值 × 量程 / 32768。
BMI270 还内置一个片上温度传感器,可读取芯片温度用于过温保护与自检,以及一组中断发生器,支持自由落体检测、摔落检测、单/双击检测、六方向方向检测、运动检测等多种可编程中断事件。
2.2 产品特点
超低功耗:在 1 Hz 输出数据速率下加速度计工作电流仅 0.38 微安,陀螺仪在 1 Hz 下为 0.9 微安,适合电池供电的长期监测场景。
内置 Sensor Hub:支持最多 8 路外部传感器通过辅助 I2C 接口接入,由 BMI270 统一按 ODR 节拍采样并写入 FIFO,主控只需周期性读取 FIFO 即可获得多传感器时间对齐数据。
2 KB FIFO:可缓存多达 512 组加速度+陀螺仪数据或 256 组含外部传感器数据,降低主控唤醒频率。
可编程中断引擎:内置自由落体、双击、方向、运动等检测逻辑,可独立于主控运行,降低主 CPU 负载。
片上温度传感器:读取芯片温度,可用于过温保护与数据漂移补偿。
灵活的量程与 ODR:加速度计与陀螺仪的量程和输出数据速率可独立配置,ODR 范围从 0.78 Hz 到 6400 Hz 连续可调。
FSync 引脚:可接入外部参考时钟或帧同步信号,用于与摄像头或其他传感器实现硬同步。
小型 LGA 封装:2.5 × 2.5 毫米,适合空间受限的嵌入式应用。
2.3 应用场景
运动检测与唤醒:检测设备从静止到运动的变化,用于智能手表亮屏、机器人启动、低功耗节点唤醒等。
姿态估计:配合 BMM150 完成九轴融合,输出俯仰、横滚、航向三个姿态角,用于自平衡小车、无人机姿态控制、增强现实等。
计步与运动追踪:利用加速度计信号统计步数、步频与运动模式(跑步、走路、静止),可穿戴设备常见功能。
机械振动监测:安装在电机、轴承或结构件上,通过高频采样捕捉异常振动,预测故障。
屏幕自动旋转:根据重力方向检测设备横竖摆放,自动切换显示方向。
震动报警:检测设备是否被非法搬动或异常冲击,用于防盗与安全监测。
摄像头稳像:与摄像头帧同步信号结合,记录拍摄瞬间的姿态抖动,后续可软件补偿。
第三章 BMM150 三轴地磁传感器3.1 基本信息
BMM150 是 Bosch Sensortec 推出的一款三轴地磁传感器,基于各向异性磁阻(AMR)技术,用于测量空间中地磁场的强度与方向。芯片采用 2.0 × 2.0 × 0.75 毫米的 LGA 封装,工作电压范围 1.71 V 至 3.6 V,测量范围为 ±1300 微特斯拉(X/Y 轴)与 ±2500 微特斯拉(Z 轴),磁场测量精度典型值约 0.3 微特斯拉。
在 AtomS3R-M12 上,BMM150 并不是直接连到主控的 I2C 总线,而是挂载在 BMI270 的 Sensor Hub 辅助 I2C 接口上。主控不直接访问 BMM150 的寄存器,而是通过 BMI270 的 FIFO 间接获取 BMM150 的三轴磁场数据。这种连接方式的好处已在第一章中说明,主要是时间对齐。
BMM150 的输出数据宽度为 16 位有符号整数,换算关系为:磁场(微特斯拉)= 原始值 × 6 / 32768。传感器支持 0.78 Hz 到 100 Hz 的输出数据速率(ODR),与 BMI270 的 Sensor Hub 配合使用时,应在 BMI270 侧配置对 BMM150 的采样率,使之与加速度计、陀螺仪的 ODR 匹配。
BMM150 还内置一个温度传感器,用于对 AMR 磁阻的温度系数进行补偿。若对航向角精度要求较高,建议在软件中结合温度传感器读数做一阶或二阶温度补偿。
3.2 产品特点
高精度地磁测量:0.3 微特斯拉的典型精度,可分辨 0.1° 级别航向变化,适合罗盘类应用。
三轴同时测量:X/Y/Z 三个正交轴同时采样,可在三维空间中完整重建地磁场矢量,不受设备倾斜影响。
宽量程:X/Y 轴 ±1300 微特斯拉、Z 轴 ±2500 微特斯拉,可覆盖地球任一点地磁场强度(约 25-65 微特斯拉),同时也能容忍附近弱磁性材料引起的偏移。
低功耗:在 10 Hz ODR 下工作电流约 3 微安,适合电池供电设备。
内置温度传感器:可用于磁阻温度系数补偿,提升极端温度下的测量稳定性。
小型封装:2.0 × 2.0 毫米,便于布局。
BMI270 Sensor Hub 即插即用:本板已预接线,只需在 BMI270 配置中开启 BMM150 挂载,即可从 FIFO 读取,无需额外连线或主控 I2C 口。
3.3 应用场景
电子罗盘与航向角:融合 BMI270 姿态数据后输出设备朝向,用于导航、户外定位、AR 等。
室内定位辅助:与加速度计结合,可在无 GPS 环境下提供方向信息,辅助 PDR(行人航位推算)。
金属检测:高灵敏度使 BMM150 可用于探测附近铁磁物体,如管道探测、手机金属后盖检测等。
机器人方向控制:为机器人底盘提供航向反馈,实现直线行走与定向转弯。
无人机与云台:与陀螺仪融合,为无人飞行器或摄像云台提供稳定的航向参考。
智能门禁与防盗:检测门体或抽屉的开合方向与角度。
第四章 Arduino 开发例程
本章给出在 Arduino IDE 下使用 AtomS3R-M12 的 BMI270 与 BMM150 的完整例程。由于 BMM150 挂载在 BMI270 的 Sensor Hub 上,开发路径通常是:初始化 BMI270,配置 Sensor Hub 挂载 BMM150,然后从 BMI270 FIFO 中同时读取三组数据。
4.1 开发环境准备
首先确保 Arduino IDE 已安装 ESP32 开发板支持包,并按 AtomS3R-M12 的硬件特性完成开发板选项配置(Flash Size 8MB、PSRAM OPI、USB CDC On Boot Enabled)。本板九轴传感器的官方库有两种选择:一是 M5Stack 提供的 M5Unified 库,内置 BMI270 与 BMM150 的适配;二是 Bosch Sensortec 官方提供的 BMI270 与 BMM150 库,更接近寄存器级控制。建议初学者从 M5Unified 入手,进阶时切换到 Bosch 官方库。
安装库的方式为 Arduino IDE - 工具 - 管理库,搜索 M5Unified 并安装最新版本。Bosch 官方库可搜索 BMI270 与 BMM150 分别安装。
开发板上 BMI270 的 I2C 地址为 0x68,挂载引脚为 G12(SDA)与 G9(SCL),初始化 I2C 时需使用 Wire.begin(G12, G9, 400000)。
4.2 例程一:BMI270 基础读取(加速度 + 陀螺仪)

#include "M5Unified.h"
#include <Wire.h>
void setup() {
M5.begin();
Serial.begin(115200);
delay(1000);
M5.Imu.begin();
Serial.println("BMI270 ready");
}
void loop() {
float ax, ay, az; // 加速度(g)
float gx, gy, gz; // 角速度(°/s)
M5.Imu.getAccel(&ax, &ay, &az);
M5.Imu.getGyro(&gx, &gy, &gz);
Serial.printf("A: %.3f %.3f %.3f g | G: %.2f %.2f %.2f deg/s\n",
ax, ay, az, gx, gy, gz);
delay(1000);
}4.3 通过 Sensor Hub 读取 BMM150 地磁数据

//系统初始化
void setup()
{
Serial.begin(115200);
while(!Serial);
M5.begin();M5.Imu.init();
if(!M5.Imu.isEnabled()){
Serial.println("IMU初始化失败");
while(1){
}
}
Serial.println("IMU初始化成功");
}
void loop(){
M5.update();
if(M5.Imu.update()){
float ax,ay,az;
float gx,gy,gz;
float mx,my,mz;
M5.Imu.getAccel(&ax,&ay,&az);
M5.Imu.getGyro(&gx,&gy,&gz);
M5.Imu.getMag(&mx,&my,&mz);
// 打印加速度数据 (单位: m/s²)
Serial.printf("Accel: X=%.2f, Y=%.2f, Z=%.2f \n",
ax, ay, az);
// 打印陀螺仪数据 (单位: rad/s)
Serial.printf("Gyro: X=%.2f, Y=%.2f, Z=%.2f\n",
gx, gy, gz);
// 打印磁力计数据
Serial.printf("Mag: X=%.2f, Y=%.2f, Z=%.2f\n",
mx, my, mz);
// 计算姿态角
float pitch = atan2(-ax,sqrt(ay*ay+az*az))*180/PI;
float roll = atan2(ay,az)*180/PI;
float heading=atan2(my,mx)*180/PI;
if(heading<0) heading+360;
// 判断运动状态
bool isMoving=(abs(gx)>5)||(abs(gy)>5)||(abs(gz)>5);
Serial.printf("===当前设备方位信息===\n");
Serial.printf("俯仰角:%.1f°(%s)\n",pitch,
pitch>45?"上仰":pitch<-45?"下俯" :"水平");
Serial.printf("横滚角:%.1f°(%s)\n",roll,
roll>45?"右倾":roll<-45?"左倾":"水平");
Serial.printf("方位角:%.1f°(%s)\n",heading,
heading<45?"北":heading<135?"东"
:heading<225?"南"
:heading<315?"西"
:"北");
Serial.printf("运动状态:%s\n",isMoving?"正在运动":"处于静止");
Serial.println();
}
delay(500);
}第五章 调试心得
5.1 BMI270 基础功能验证
上电自检:读取 BMI270 芯片 ID(寄存器 0x00),期望值为 0x24;确认 I2C 通信正常。
加速度静态:设备水平静止,各轴加速度平均值应接近 1g(Z 轴)、0g(X/Y 轴),若偏差大于量程 1% 则需检查装配水平度。
陀螺仪静止:设备静止,各轴角速度平均值应接近 0°/s,标准差低于 0.5°/s,否则疑似陀螺零偏过大或设备未完全静止。
加速度动态:手持设备做快速挥舞,观察三轴加速度是否能够正确反映运动方向,无明显饱和或截断。
陀螺仪动态:以不同速度旋转设备,对比读出的角速度与实际旋转速度的一致性,检查量程是否合适。
温度传感器:读取片上温度,与外部温度计对比,检查偏差是否在 ±2°C 以内。
5.2 BMM150 基础功能验证
Sensor Hub 挂载:确认 BMI270 secondary sensor 寄存器配置成功,能读出 BMM150 数据。
地磁读数:设备静止时读数应在地球磁场范围内(约 25-65 微特斯拉);旋转设备,读数应随之变化,X/Y/Z 三方向覆盖完整旋转。
磁场干扰测试:在传感器附近 10 厘米内放置铁质螺丝刀,观察读数偏移;评估实际安装时的抗干扰能力。
温度补偿:加热传感器到 40°C,观察读数漂移;对比开启与关闭温度补偿的效果。
5.3 调试注意事项
BMI270 初始化失败(返回错误码):检查 I2C 地址是否正确(本板 0x68);确认 I2C 引脚是否为 G12/G9;确认库版本匹配。
加速度读数始终接近 1g 且其他两轴为零:设备静止且水平放置时属于正常现象,做动态测试需移动设备。
航向角明显漂移:需要做完整校准——BMI270 静止校准陀螺零偏;BMM150 在三维空间内充分晃动做硬铁软铁校准;同时检查安装位置是否靠近铁磁材料、电机或大电流走线。
FIFO 读取数据错位:检查 FIFO 帧长度配置是否与实际挂载的传感器数量一致;若包含 BMM150,需在帧长度中额外加上 6 字节。
Sensor Hub 读取 BMM150 超时:确认 BMI270 已正确配置 secondary sensor;检查 BMM150 I2C 地址;必要时在 BMI270 内部上拉电阻配置中打开 aux 接口上拉。
六:调试后记
AtomS3R-M12 上使用 BMI270 + BMM150 的组合在同类开发板中属于中上配置。BMI270 的优势在于 Sensor Hub 与低功耗,适合需要长期监测或多传感器融合的项目;若对姿态精度要求极高,可考虑 BMI088(六轴)或 BNO085(九轴一站式方案),但后者通过 UART 输出,不适合与摄像头共享高速接口的场景。
对 BMM150,若项目只需要航向角且对磁场精度要求不高,可单独换用 HMC5883L,成本更低;但 HMC5883L 不能通过 Sensor Hub 挂载,需直接接主控 I2C,会丢失时间对齐优势。综合来看,若重视时间对齐与低功耗,本板原装方案仍是最稳妥的选择。
我要赚赏金
