这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【AtomS3R-M12】分享BMI270与BMM150传感器调试心得

共3条 1/1 1 跳转至页

【AtomS3R-M12】分享BMI270与BMM150传感器调试心得

高工
2026-11-04 18:36:50     打赏

第一章  传感器系统总览

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 基础读取(加速度 + 陀螺仪)

03-1 bmi270串口输出图片.png

以下例程使用 M5Unified 库,初始化 BMI270 并在串口每 100 毫秒输出一次加速度与陀螺仪的原始数据与换算后物理量。

#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 地磁数据

03-1 imu串口输出图片.png

//系统初始化
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,会丢失时间对齐优势。综合来看,若重视时间对齐与低功耗,本板原装方案仍是最稳妥的选择。




关键词: AtomS3R-M12     BMI270     BMM150    

院士
2026-11-05 10:42:41     打赏
2楼

您这也太贴心了吧!

昨天我刚刚说,我要对比一下几款六轴IMU,您这抢先了~~


院士
2026-11-05 16:54:25     打赏
3楼

我计划过两天活动的时候在立创购买一颗 测试玩玩


共3条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]