Gravity: BMP585高精度气压温度传感器

产品简介

Gravity:9轴惯性测量单元传感器集成了3轴加速度计、陀螺仪和磁力计,能够实现高级运动检测与精准空间定位。该传感器支持I2C和UART通信接口,适用于多种项目场景。通过开源的Arduino和Python代码,可满足爱好者在各类应用中实现全方位运动追踪的需求。其功能涵盖计步、倾斜检测及欧拉角解算等。

产品参数

基本参数

参数 数值
工作电压 DC 3.3-5V
工作电流 3.42mA
通讯接口 I2C/UART
接口类型 PH2.0-4P(Gravity线序)/2.54mm排针孔
I2C 地址 0x4A(默认)/0x4B/0x4C/0x4D
可编程中断引脚 BMI323:2 个
BMM350:1个

加速度参数

参数 数值
测量范围 ±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

地磁参数

参数 数值
工作模式 正常模式(周期性测量)、强制模式(触发式测量)、休眠模式(低功耗待机)
测量范围 ±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尺寸 32mm*27mm
安装孔间距 20mm
安装孔直径 3mm

尺寸图

单位:mm

SEN0694-尺寸图

引脚说明

SEN0694-功能图

引脚丝印 功能描述
+ 电源正极(供电输入3.3-5V)
- 电源负极(接地)
C/R 复用引脚:I2C模式为时钟线(SCL),UART模式为接收端(RXD)
D/T 复用引脚:I2C模式为数据线(SDA),UART模式为发送端(TXD)
INT1 BMI323中断输出引脚1
INT2 BMI323中断输出引脚2
INT3 BMM350中断输出引脚

I2C地址设置开关说明

I2C地址 A0 A1
0x4A 0 0
0x4B 1 0
0x4C 0 1
0x4D 1 1

注意事项:

  • “I2C/UART切换开关”的切换可以断电保存,重启设备后新模式生效。

Arduino IDE 使用教程

说明:本传感器支持任意运动、无运动、显著运动等多种运动状态检测,以及敲击、倾斜、方向、平面检测等手势识别功能。Wiki 仅展示核心基础用法,更多运动状态检测与高级功能实现,请直接参考库文件中完整的 examples 示例程序及API,此处不再逐一展开。

通过I2C读取数据的ESP32示例代码

目标

本教程旨在演示如何初始化9轴IMU传感器,并通过轮询方式直接读取加速度、角速度和地磁数据。

硬件准备

软件准备

接线配置

SEN0694-I2C接线图

  • 按图示连接9轴IMU传感器与 ESP32-C5,核心对应关系:
    • 传感器引脚 “+” → ESP32-C5 3.3V
    • 传感器引脚 “-” → ESP32-C5 GND
    • 传感器 I2C 引脚 “SCL” → ESP32-C5 SCL(GPIO10)
    • 传感器 I2C 引脚 “SDA” → ESP32-C5 SDA(GPIO9)
    • 传感器拨码开关配置:通信模式拨到I2C侧,I2C地址拨到0x4A(A0=0,A1=0,出厂默认地址)

样例代码

#include "DFRobot_Multi_DOF_IMU.h"
#include <Wire.h>

#define IMU_COMM_I2C
const uint8_t ADDR = 0x4A;

// 初始化I2C模式的IMU
DFRobot_Multi_DOF_IMU_I2C imu(DFRobot_Multi_DOF_IMU::eSensorModel9DOF, &Wire, ADDR);

void setup() {
  // 初始化串口
  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }

  Serial.println("9DOF IMU Polling Example (I2C)");

  // [1] 初始化传感器
  Serial.print("[1] Initializing sensor... ");
  while (!imu.begin()) {
    Serial.println("Failed, please check device address and connections!");
    delay(1000);
  }
  Serial.println("Success");
  delay(1000);

  // [2] 设置传感器为正常模式
  Serial.print("[2] Setting sensor mode to normal... ");
  while (!imu.setSensorMode(DFRobot_Multi_DOF_IMU::eNormalMode)) {
    Serial.println("Failed, please check device communication!");
    delay(1000);
  }
  Serial.println("Success");
  delay(1000);

  // [3] 设置加速度计量程为±2G
  Serial.print("[3] Setting accelerometer range to ±2G... ");
  while (!imu.setAccelRange(DFRobot_Multi_DOF_IMU::eAccelRange2G)) {
    Serial.println("Failed, please check device communication!");
    delay(1000);
  }
  Serial.println("Success");
  delay(1000);

  // [4] 设置陀螺仪量程为±250dps
  Serial.print("[4] Setting gyroscope range to ±250dps... ");
  while (!imu.setGyroRange(DFRobot_Multi_DOF_IMU::eGyroRange250DPS)) {
    Serial.println("Failed, please check device communication!");
    delay(1000);
  }
  Serial.println("Success");
  delay(100);

  // 配置完成提示
  Serial.println("\nConfiguration complete, starting data reading");
}

void loop() {
  DFRobot_Multi_DOF_IMU::sSensorData_t accel, gyro, mag;

  // 读取9轴数据
  if (imu.get9dofData(&accel, &gyro, &mag)) {
    // 打印加速度计数据
    Serial.print("Accel (g): X=");
    Serial.print(accel.x, 3);
    Serial.print(", Y=");
    Serial.print(accel.y, 3);
    Serial.print(", Z=");
    Serial.println(accel.z, 3);

    // 打印陀螺仪数据
    Serial.print("Gyro (dps): X=");
    Serial.print(gyro.x, 2);
    Serial.print(", Y=");
    Serial.print(gyro.y, 2);
    Serial.print(", Z=");
    Serial.println(gyro.z, 2);

    // 打印磁力计数据
    Serial.print("Mag (uT): X=");
    Serial.print(mag.x, 2);
    Serial.print(", Y=");
    Serial.print(mag.y, 2);
    Serial.print(", Z=");
    Serial.println(mag.z, 2);

    Serial.println("---");
  } else {
    Serial.println("Failed to read data!");
  }

  delay(500);
}

结果

SEN0694-I2C结果图

通过UART与中断读取数据的ESP32示例代码

目标

本教程旨在演示如何配置9轴IMU传感器,在数据就绪时通过硬件中断触发,并在中断服务程序中读取加速度、角速度和地磁数据,实现高效的数据采集。

硬件准备

软件准备

接线配置

SEN0694-UART接线图

  • 按图示连接9轴IMU传感器与 ESP32-C5,核心对应关系:
    • 传感器引脚 “+” → ESP32-C5 3.3V
    • 传感器引脚 “-” → ESP32-C5 GND
    • 传感器引脚“INT1” → ESP32-C5 GPIO27
    • 传感器引脚“INT3” → ESP32-C5 GPIO28
    • 传感器 UART 引脚 “RX” → ESP32-C5 D3(GPIO26)
    • 传感器 UART 引脚 “TX” → ESP32-C5 D2(GPIO8)
    • 传感器拨码开关配置:通信模式拨到UART侧,地址拨到0x4A(A0=0,A1=0)

样例代码

#include "DFRobot_Multi_DOF_IMU.h"

// 仅保留UART通信模式
#define IMU_COMM_UART
const uint8_t ADDR = 0x4A;

// ESP32-C5 UART1映射:RX = GPIO8(D2),TX = GPIO26(D3)
DFRobot_Multi_DOF_IMU_UART imu(DFRobot_Multi_DOF_IMU::eSensorModel9DOF, &Serial1, 9600, ADDR, /*rx=*/8, /*tx=*/26);

volatile bool int1DataReady = false;
volatile bool int3DataReady = false;

// INT1数据就绪中断服务函数
void IRAM_ATTR int1ISR() {
  int1DataReady = true;
}

// INT3数据就绪中断服务函数
void IRAM_ATTR int3ISR() {
  int3DataReady = true;
}

void setup() {
  // 初始化串口监视器(波特率:115200)
  Serial.begin(115200);
  while (!Serial) delay(10);

  // 初始化传感器
  while (!imu.begin()) {
    delay(1000);
  }

  // 设置传感器为正常模式
  imu.setSensorMode(DFRobot_Multi_DOF_IMU::eNormalMode);
  delay(100);

  // 设置加速度计量程为±2G
  Serial.print("Set accel range ±2G... ");
  while (!imu.setAccelRange(DFRobot_Multi_DOF_IMU::eAccelRange2G)) {
    delay(1000);
  }
  Serial.println("OK");

  // 设置陀螺仪量程为±250dps
  Serial.print("Set gyro range ±250dps... ");
  while (!imu.setGyroRange(DFRobot_Multi_DOF_IMU::eGyroRange250DPS)) {
    delay(1000);
  }
  Serial.println("OK");

  // 配置INT1数据就绪中断
  Serial.print("Config INT1 (data ready)... ");
  while (!imu.setInt(DFRobot_Multi_DOF_IMU::eImuIntPin1, DFRobot_Multi_DOF_IMU::eInt1_2DataReady)) {
    delay(1000);
  }
  Serial.println("OK");

  // 配置INT3数据就绪中断
  Serial.print("Config INT3 (data ready)... ");
  while (!imu.setInt(DFRobot_Multi_DOF_IMU::eImuIntPin3, DFRobot_Multi_DOF_IMU::eInt3DataReady)) {
    delay(1000);
  }
  Serial.println("OK");

  // 绑定INT1(GPIO27)和INT3(GPIO28)中断,上升沿触发
  attachInterrupt(digitalPinToInterrupt(27), int1ISR, RISING);
  attachInterrupt(digitalPinToInterrupt(28), int3ISR, RISING);
  Serial.println("Interrupts attached (rising edge)");

  // 配置完成提示
  Serial.println("\nConfiguration complete. Reading data...");
}

void loop() {
  if (int1DataReady || int3DataReady) {
    if (int1DataReady && int3DataReady) {
      int1DataReady = false;
      int3DataReady = false;

      DFRobot_Multi_DOF_IMU::sSensorData_t accel, gyro, mag;
      if (imu.get9dofData(&accel, &gyro, &mag)) {
        // 打印格式严格匹配图片
        Serial.print("\nACCEL(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);

        Serial.print("MAG(uT): ");
        Serial.print(mag.x, 2); Serial.print(", ");
        Serial.print(mag.y, 2); Serial.print(", ");
        Serial.println(mag.z, 2);
      }
    } else {
      // 清除未完成的中断标志位,避免程序卡死
      if (int1DataReady) int1DataReady = false;
      if (int3DataReady) int3DataReady = false;
    }
  }
  delay(200);
}

结果

SEN0694-UART结果图

API函数

 /**
   * @fn begin
   * @brief 初始化UART通信和传感器
   * @return bool
   * @retval true  初始化成功
   * @retval false 初始化失败
   */
  bool begin(void);

  /**
   * @fn setSensorMode
   * @brief 设置传感器工作模式
   * @param mode 传感器工作模式(参见 eSensorMode_t)
   * @n 可用模式:
   * @n - eSleepMode:           睡眠模式(最低功耗,传感器停止工作)
   * @n - eLowPowerMode:        低功耗模式(降低采样率,节省功耗)
   * @n - eNormalMode:          正常模式(平衡功耗和性能)
   * @n - eHighPerformanceMode: 高性能模式(最高采样率和精度,功耗最高)
   * @return bool
   * @retval true  设置成功
   * @retval false 设置失败
   */
  bool setSensorMode(eSensorMode_t mode);

  /**
   * @fn reset
   * @brief 恢复出厂设置
   * @return bool
   * @retval true  恢复出厂设置成功
   * @retval false 恢复出厂设置失败
   */
  bool reset(void);

  /**
   * @fn setAccelRange
   * @brief 设置加速度计量程
   * @param range 加速度计量程(参见 eAccelRange_t)
   * @n 可用量程:
   * @n - eAccelRange2G:  ±2g 量程
   * @n - eAccelRange4G:  ±4g 量程
   * @n - eAccelRange8G:  ±8g 量程
   * @n - eAccelRange16G: ±16g 量程
   * @return bool
   * @retval true  设置成功
   * @retval false 设置失败
   */
  bool setAccelRange(eAccelRange_t range);

  /**
   * @fn setGyroRange
   * @brief 设置陀螺仪量程
   * @param range 陀螺仪量程(参见 eGyroRange_t)
   * @n 可用量程:
   * @n - eGyroRange125DPS:  ±125dps 量程
   * @n - eGyroRange250DPS:  ±250dps 量程
   * @n - eGyroRange500DPS:  ±500dps 量程
   * @n - eGyroRange1000DPS: ±1000dps 量程
   * @n - eGyroRange2000DPS: ±2000dps 量程
   * @return bool
   * @retval true  设置成功
   * @retval false 设置失败
   */
  bool setGyroRange(eGyroRange_t range);

  /**
   * @fn get6dofData
   * @brief 读取6轴IMU数据(物理量)
   * @param accel 指向sSensorData_t结构的指针,用于存储加速度数据(单位:g)
   * @param gyro 指向sSensorData_t结构的指针,用于存储陀螺仪数据(单位:dps)
   * @return bool
   * @retval true  读取成功
   * @retval false 读取失败
   */
  bool get6dofData(sSensorData_t *accel, sSensorData_t *gyro);

  /**
   * @fn get9dofData
   * @brief 读取9轴IMU数据(物理量)
   * @param accel 指向sSensorData_t结构的指针,用于存储加速度数据(单位:g)
   * @param gyro 指向sSensorData_t结构的指针,用于存储陀螺仪数据(单位:dps)
   * @param mag 指向sSensorData_t结构的指针,用于存储磁力计数据(单位:uT)
   * @return bool
   * @retval true  读取成功
   * @retval false 读取失败
   */
  bool get9dofData(sSensorData_t *accel, sSensorData_t *gyro, sSensorData_t *mag);


  /**
   * @fn setInt
   * @brief 配置中断(统一API)
   * @param pin 中断引脚(参见 eImuIntPin_t)
   * @n 可用引脚:
   * @n - eImuIntPin1: INT1引脚(6轴传感器,支持多种中断类型)
   * @n - eImuIntPin2: INT2引脚(6轴传感器,支持多种中断类型)
   * @n - eImuIntPin3: INT3引脚(9轴传感器-磁力计,仅支持数据就绪中断)
   * @param intType 中断类型(uint8_t)
   * @n INT1/INT2支持的中断类型(eInt1_2Type_t):
   * @n - eInt1_2Disable (0x00): 禁用中断
   * @n - eInt1_2DataReady (0x01): 数据就绪中断
   * @n - eInt1_2AnyMotion (0x02): 任意运动中断
   * @n - eInt1_2NoMotion (0x03): 无运动中断
   * @n - eInt1_2SigMotion (0x04): 显著运动中断
   * @n - eInt1_2StepCounter (0x05): 步进计数中断
   * @n - eInt1_2Flat (0x06): 平面中断
   * @n - eInt1_2Orientation (0x07): 方向中断
   * @n - eInt1_2Tap (0x08): 敲击中断
   * @n - eInt1_2Tilt (0x09): 倾斜中断
   * @n INT3支持的中断类型(eInt3Type_t):
   * @n - eInt3Disable (0x00): 禁用中断
   * @n - eInt3DataReady (0x01): 数据就绪中断
   */
  bool setInt(eImuIntPin_t pin, uint8_t intType);

  /**
   * @fn getIntStatus
   * @brief 读取中断状态(统一API)
   * @param pin 中断引脚(参见 eImuIntPin_t)
   * @return uint16_t 中断状态
   * @n 可与相应的中断状态宏进行按位与操作来判断中断类型
   * @retval 0 无中断或读取失败
   */
  uint16_t getIntStatus(eImuIntPin_t pin);

  /**
   * @fn getStepCount
   * @brief 读取步数计数器数据
   * @details 读取当前累计步数
   * @n 检测到步进中断后,调用此函数读取累计步数
   * @return uint32_t 累计步数(32位)
   * @retval 0 无步数数据或读取失败
   */
  uint32_t getStepCount(void);

  /**
   * @fn getTap
   * @brief 读取敲击数据
   * @details 当检测到敲击中断后,调用此函数读取具体的敲击类型
   * @return uint16_t 敲击数据
   * @n 返回值:
   * @n - TAP_TYPE_SINGLE (0x0001): 单击
   * @n - TAP_TYPE_DOUBLE (0x0002): 双击
   * @n - TAP_TYPE_TRIPLE (0x0003): 三击
   * @retval 0 无敲击数据或读取失败
   */
  uint16_t getTap(void);

  /**
   * @fn getOrientation
   * @brief 读取方向数据
   * @details 当检测到方向中断后,调用此函数读取具体的方向和面部朝向
   * @return uint16_t 方向数据
   * @n 高字节:方向类型
   * @n - ORIENT_TYPE_PORTRAIT_UP (0x01): 竖屏正向
   * @n - ORIENT_TYPE_LANDSCAPE_LEFT (0x02): 横屏向左
   * @n - ORIENT_TYPE_LANDSCAPE_RIGHT (0x03): 横屏向右
   * @n - ORIENT_TYPE_PORTRAIT_DOWN (0x04): 竖屏倒置
   * @n 低字节:朝向类型
   * @n - ORIENT_FACE_UP (0x00): 面向前
   * @n - ORIENT_FACE_DOWN (0x01): 面向后
   * @retval 0 无方向数据或读取失败
   */
  uint16_t getOrientation(void);

上位机使用教程

硬件准备

软件准备

接线配置

SEN0694-上位机接线图

  • 按图示连接9轴IMU传感器与 RainbowLink V2,核心对应关系:
    • 传感器引脚 “+” → RainbowLink V2 5V
    • 传感器引脚 “-” → RainbowLink V2 GND
    • 传感器 UART 引脚 “RX” → RainbowLink V2 TX
    • 传感器 UART 引脚 “TX” → RainbowLink V2 RX
    • 传感器拨码开关配置:通信模式拨到UART侧,地址拨到0x4A

操作步骤

  1. 将 9 轴 IMU 传感器与 RainbowLink V2 正确连接,传感器通信模式拨码开关拨至 UART 侧,地址拨至 0x4A。
  2. 打开上位机,在右上方将语言切换为中文模式,选择正确的端口号,设置波特率为默认9600,点击右上方的「打开串口」。
  3. 然后摇动传感器3s进行校准,此时界面左侧可显示6轴IMU传感器运动的动态画面。右侧则是加速度、陀螺仪等实时数据。

结果

Modbus 寄存器定义

寄存器类型 寄存器地址 名称 读/写 数据范围 默认值 描述
输入寄存器 0x0000 VID R 0x3343 0x3343 VID(代表厂商为DFRobot)
输入寄存器 0x0001 PID R 0x0009 型号而定 0x0009代表9DOF IMU传感器
输入寄存器 0x0002 设备地址 R 0x004A~0x004D 根据拨码开关决定 MODBUS设备地址,可通过拨码开关修改
输入寄存器 0x0003 保留 R 0x0000~0xFFFF 0xFFFF 保留
输入寄存器 0x0004 模块校验位(H) 停止位(L) R 0x0001 0x0001 0x00=None;0x01=1Byte停止位
输入寄存器 0x0005 VERSION R 0x0000~0xFFFF 0x1000 0x1000表示固件版本号为V1.0.0.0
输入寄存器 0x0006 加速度计X轴数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的加速度计X轴方向数据
输入寄存器 0x0007 加速度计Y轴数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的加速度计Y轴方向数据
输入寄存器 0x0008 加速度计Z轴数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的加速度计Z轴方向数据
输入寄存器 0x0009 陀螺仪X轴数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的陀螺仪计X轴方向数据
输入寄存器 0x000A 陀螺仪Y轴数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的陀螺仪计Y轴方向数据
输入寄存器 0x000B 陀螺仪Z轴数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的陀螺仪计Z轴方向数据
输入寄存器 0x000C 磁力计X轴低字数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的磁力计X轴方向低字数据
输入寄存器 0x000D 磁力计X轴高字数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的磁力计X轴方向高字数据
输入寄存器 0x000E 磁力计Y轴低字数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的磁力计Y轴方向低字数据
输入寄存器 0x000F 磁力计Y轴高字数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的磁力计Y轴方向高字数据
输入寄存器 0x0010 磁力计Z轴低字数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的磁力计Z轴方向低字数据
输入寄存器 0x0011 磁力计Z轴高字数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的磁力计Z轴方向高字数据
输入寄存器 0x0014 计步器低字数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的计步器低字数据
输入寄存器 0x0015 计步器高字数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的计步器高字数据
输入寄存器 0x0016 敲击状态数据 R 0x0000~0x0003 0x0000 9DOF IMU的敲击状态数据
0x0001---单次敲击中断
0x0002---双击中断
0x0003---三击中断
输入寄存器 0x0017 方向检测数据 R 0x0000~0xFFFF 0x0000 9DOF IMU的方向状态数据
方向(H)
0x01--竖屏正向
0x02--横屏向左
0x03--横屏向右
0x04--竖屏倒置
朝向(L)
0x00--面向前
0x01--面向后
保持寄存器 0x0000 保留 R/W 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0001 保留 R/W 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0002 保留 R/W 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0003 设备波特率 R/W 0x0000~0x00FF 0x0003 设备波特率
0x0001---2400
0x0002---4800
0x0003---9600
0x0004---14400
0x0005---19200
0x0006---38400
0x0007---57600
0x0008---115200
Other---115200
输入寄存器 0x0004 保留 R 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0005 保留 R/W 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0006 设备工作模式 R/W 0x0000~0x0003 0x0002 0x0000---休眠模式(丢失传感器配置进入休眠,功耗最低)
0x0001---低功耗模式(以较低功耗测量数据)
0x0002---正常模式(平衡测量精度与功耗)
0x0003---高性能模式(测量精度最高,功耗最大)
保持寄存器 0x0007 恢复出厂设置 R/W 0x0000~0x0001 0x0001 恢复出厂设置
写入0x0001触发恢复出厂设置
保持寄存器 0x0008 加速度计量程 R/W 0x0000~0x0003 0x0002 加速度计的测量范围
0x0000---±2G
0x0001----±4G
0x0002---±8G
0x0003----±16G
保持寄存器 0x0009 陀螺仪量程 R/W 0x0000~0x0004 0x0004 陀螺仪的测量范围
0x0000---±125DPS
0x0001---±250DPS
0x0002---±500DPS
0x0003---±1000DPS
0x0004---±2000DPS
保持寄存器 0x000E 中断引脚1配置 R/W 0x0000~0x0009 0x0000 9DOF IMU的中断引脚1配置
0x0000---中断禁用
0x0001---6DOF数据就绪中断使能
0x0002---任意运动检测中断使能
0x0003---静止检测中断使能
0x0004---显著运动检测中断使能
0x0005---计步数据检测中断使能
0x0006---平面检测中断使能
0x0007---方向检测中断使能
0x0008---敲击检测中断使能
0x0009---倾斜检测中断使能
保持寄存器 0x000F 中断引脚2配置 R/W 0x0000~0x0009 0x0000 9DOF IMU的中断引脚2配置
与INT1相同
保持寄存器 0x0010 中断引脚3配置 R/W 0x0000~0x0001 0x0000 9DOF IMU的中断引脚3配置
0x0000---中断禁用 0x0001----地磁数据就绪中断使能

Modbus-RTU 常用功能代码:

功能码 名称 功能
0x03 读多个寄存器 读整型、字符型、状态字、浮点型(读N个words)---读保持寄存器,字节操作
0x04 读输入寄存器 读整型、状态字、浮点型(读N个words)---读输入寄存器,字节操作
0x06 写单个保持寄存器 写整型、字符型、状态字、浮点型(写一个word)---写保持寄存器,字节操作
0x10 写多个保持寄存器 写多个保持寄存器---把具体的二进制值装入一串连续的保持寄存器

通过以上命令可读写输入寄存器和保持寄存器。

读取加速度三轴数据示例

目标

通过 Modbus RTU 协议读取9轴IMU传感器当前检测到的加速度数值

硬件准备

接线配置

SEN0694-modbus接线图

  • 按图示连接9轴IMU传感器与 RainbowLink V2,核心对应关系:
    • 传感器引脚 “+” → RainbowLink V2 5V
    • 传感器引脚 “-” → RainbowLink V2 GND
    • 传感器 UART 引脚 “RX” → RainbowLink V2 TX
    • 传感器 UART 引脚 “TX” → RainbowLink V2 RX
    • 传感器拨码开关配置:通信模式拨到UART侧,地址拨到0x4A

通用操作步骤

  • 硬件连接:通过 RainbowLink USB 协议转换器,将传感器与主机(电脑)连接,传感器通信模式切换至 UART,地址切换至0x4A
  • 参数配置:在串口调试工具中设置参数(需与传感器一致):
    • 波特率:9600(默认)
    • 数据位:8 位
    • 停止位:1 位
    • 校验位:无
  • 发送指令:在调试工具的 “发送区” 输入下述十六进制指令,勾选 “十六进制发送” 后发送。

发送指令及解析

字段名 十六进制值 说明
设备地址 4A MODBUS设备地址,默认 0x4A(可通过拨码开关修改)
功能码 04 读输入寄存器(固定指令)
寄存器起始地址 00 06 加速度 X 轴寄存器地址(0x0006)
寄存器个数 00 03 读取 3 个寄存器(加速度 X、Y、Z)
CRC 校验 5F B1 指令的 CRC16 校验值

完整发送指令:4A 04 00 06 00 03 5F B1

返回数据及解析

传感器收到指令后返回如下数据(示例):

字段名 十六进制值 说明
设备地址 4A 与发送指令中的设备地址一致
功能码 04 确认执行 “读输入寄存器” 操作
字节数 06 返回数据的字节总数(6 字节)
读取数据 FF AD FF DD EF E1 依次为加速度 X、Y、Z 轴的原始值(各 2 字节)
CRC 校验 B7 E1 返回数据的 CRC16 校验值

完整返回数据:4A 04 06 FF AD FF DD EF E1 B7 E1

SEN0694-modbus结果图

数据解析步骤

返回的原始数据 FF ADFF DDEF E1 是 16 位有符号整数(补码),需要按以下步骤转换为实际的加速度值(单位:g)。

  1. 将十六进制转换为有符号十进制

    • X 轴原始值:FF AD 无符号值 = 0xFFAD = 65453 有符号值 = 65453 − 65536 = -83
    • Y 轴原始值:FF DD 无符号值 = 0xFFDD = 65493 有符号值 = 65493 − 65536 = -43
    • Z 轴原始值:EF E1 无符号值 = 0xEFE1 = 61409 有符号值 = 61409 − 65536 = -4127
  2. 根据量程和灵敏度转换为物理值

    BMI323 加速度计的默认量程为 ±8 g,在此量程下灵敏度为 4096 LSB/g(参见规格书第 9 页 Table 3)。

    计算公式:

    加速度 (g)=有符号原始值/灵敏度

    • X 轴:−83/4096≈−0.0203 g
    • Y 轴:−43/4096≈−0.0105 g
    • Z 轴:−4127/4096≈−1.0076 g
  3. 结果解读

  • X、Y 轴接近 0 g,表明传感器在水平面上无倾斜。
  • Z 轴约为 -1 g,表明重力方向为负(传感器正面朝上,Z 轴指向地心)。
  • 该数据符合传感器静止时的预期输出。

为什么这样处理?

  1. 数字输出:传感器内部将模拟量转换为数字信号,输出为 16 位二进制补码。必须通过规格书定义的灵敏度将其还原为物理量。
  2. 量程影响:灵敏度与所选量程相关(不同量程对应不同 LSB/g 值),解析前需确认当前量程设置(默认 ±8 g,若更改需通过保持寄存器 0x0008 读取)。
  3. 符号性:加速度有方向,因此采用有符号数表示。补码格式需通过减去 65536 转换为负数。

注意事项

  • 若修改了加速度计量程(如 ±2 g、±4 g、±16 g),灵敏度会相应变化,解析公式中的分母需同步调整。
  • 返回数据中的 CRC 校验可用于验证传输完整性(本示例中 CRC 正确,数据可靠)。
  • 如需连续读取,可直接重复发送相同指令,传感器会返回最新采样值。

更多资料下载