一、总体进度
本项目以 B-WBA5M-WPAN 扩展板为核心、ST 官方 BLE_Sensor 工程为基线,已完成:1. 板载温度传感器 SHT40-AD1B 和三轴加速度计/陀螺仪 ISM330DHCX 的数据采集;2. Madgwick AHRS 姿态融合,输出 Roll 和 Pitch;3. 自定义 BLE GATT Telemetry 服务,通过 Notify 将温度、加速度和姿态角实时推送到手机端;4. 按键切换实时/低功耗工作模式;5. LED 显示广播、连接和模式状态;6. 低功耗模式下动态调整 BLE 广播/连接间隔和传感器采样率。
二、软件基线
开发环境:STM32CubeIDE + STM32CubeWBA Firmware Package V1.10.0。基线工程使用 ST 官方 B-WBA5M-WPAN BLE_Sensor 示例,该示例已包含 BLE 协议栈初始化和 I²C3 传感器驱动。
三、传感器数据采集
1. I²C 总线
板载 I²C3 使用 PA6(SCL)+ PA7(SDA),默认 100 kHz。两个传感器挂接在同一总线上:
2. 温度采集
调用 BSP 接口 `BSP_ENV_SENSOR_GetValue(ENV_SENSOR_SHT40AD1B_0, ENV_TEMPERATURE, &temperature)`,读取浮点温度值。Telemetry 中以 `int16` 格式输出,单位为 0.01 °C。
3. 加速度和陀螺仪采集
使用 `BSP_MOTION_SENSOR_GetAxes(MOTION_SENSOR_ISM330DHCX_0, ...)` 获取三轴加速度和角速度。BSP 返回值是原始 ADC 计数与灵敏度的乘积,单位为 mg 和 mdps。进入 Madgwick 算法前做单位换算:
acceleration_g = (float)mg / 1000.0f; // mg → ggyro_radians = (float)mdps / 1000.0f * PI / 180.0f; // mdps → dps → rad/s
四、姿态融合
使用 Madgwick AHRS 六轴融合算法。由于板载 ISM330DHCX 不含磁力计,本项目仅输出 Roll 和 Pitch,Yaw 因无绝对航向参考会漂移,仅作为调试观察值。
核心代码:
Madgwick_UpdateIMU(&filter, gx, gy, gz, ax, ay, az, dt);Madgwick_GetEuler(&filter, &roll_deg, &pitch_deg, &yaw_deg);
算法参数 β = 0.08,更新频率 20 Hz(50 ms)。经过实际验证,在静止平放时 Roll 和 Pitch 稳定在 0° ± 3° 以内。
关于 MotionFX:经检查,STM32CubeWBA V1.10.0 软件包中不含适用于本工程平台(Cortex-M33,硬浮点 ABI)的 MotionFX 库文件,因此本项目采用 Madgwick 方案,无任何外部依赖。
五、自定义 BLE Telemetry 服务
在保留官方 BLE Sensor 服务的前提下,新增一个独立的自定义 Telemetry Service。1. 服务信息:
2. 数据格式(小端,LE)
3. nRF Connect 验证手机端 nRF Connect 扫描到设备 `WBA5M_27`,连接后展开服务列表,可以看到原有 BLE Sensor 服务和新增 Telemetry 服务。订阅 Notify 后持续接收 20 字节数据。板子平放时加速度 Z ≈ 1024 mg(约 1g),移动板子时加速度和姿态角实时变化。
六、按键与 LED 交互
1. 按键
板载用户按键 B2(PC13)响应:
2. LED
板载蓝色 LED(PA1)状态:
LED 刷新通过独立的上层应用定时器(250 ms 周期)和 sequencer 任务驱动,不阻塞 BLE 协议栈。
七、低功耗模式
低功耗监测模式下执行以下策略:1. 传感器采样率:从实时模式的 104 Hz 降至 12.5 Hz;2. BLE 连接间隔:从实时模式的约 20 ms 提升至约 500 ms,减少射频活动时间;3. BLE 广播间隔(未连接时):从实时模式的 100 ms 调整为 1000 ms(1 s),符合申请方案中"广播间隔 100ms~1s 可调"的要求;4. LED:从常亮改为慢闪。
上述切换在按键事件中通过 `ApplyMode()` 函数统一执行。每次模式变更后通过 UART 输出当前 ODR、广播间隔和连接参数,方便调试。
两种模式下的参数差异如下,Telemetry 数据推送频率的变化在 nRF Connect 中可以直观看到:
STOP 低功耗模式已通过 `app_conf.h` 启用:
#define CFG_LPM_LEVEL (1U)#define CFG_LPM_STOP1_SUPPORTED (1U)#define CFG_LPM_STOP2_SUPPORTED (0U) /* 本 BLE_Sensor 基线未实现 STOP2 入口 */低功耗模式下,主循环空闲时自动进入 STOP1 深度休眠,按键 EXTI 唤醒;实时模式下限制为 SLEEP,保证数据采集和 BLE 推送不被中断。
八、关键技术点
1. 传感器单位转换
ISM330DHCX 驱动返回值说明:加速度灵敏度约为 0.061 mg/LSB,角速度灵敏度约为 8.750 mdps/LSB。BSP 已自动完成灵敏度乘算,应用层得到的 `GetAxes()` 返回值直接是 mg 和 mdps 单位,进入姿态算法前需手动转换为 g 和 rad/s。
2. Madgwick 初值问题
Madgwick 滤波器从单位四元数(q0=1)冷启动后,约需 0.5~1 秒收敛。该时间内 Roll/Pitch 输出可能会有短暂跳变,连接稳定后即可忽略。
3. Telemetry 独立运行设计
Telemetry 数据发送不依赖 Motion 或 Environmental Notify 是否开启。运动传感器和温度传感器定时器在初始化时即启动,无论手机端是否订阅,传感器数据始终采集并计算姿态。只有当手机端订阅了 Telemetry Notify 时,数据才会通过 BLE 发送。
4. BLE和服务共存
官方 BLE Sensor 服务保持不变,Telemetry 服务作为独立 Service 注册。二者共用同一 BLE Stack 和 GATT 数据库,在 `app_conf.h` 中已为 Telemetry 分配足够的 GATT 属性和缓冲区空间。
九、总结
本项目基于 STM32CubeWBA 官方 BLE_Sensor 工程,完成了从传感器采集、姿态融合、BLE 自定义服务到交互与低功耗模式的完整实现。
本项目以 B-WBA5M-WPAN 扩展板为核心、ST 官方 BLE_Sensor 工程为基线,已完成:1. 板载温度传感器 SHT40-AD1B 和三轴加速度计/陀螺仪 ISM330DHCX 的数据采集;2. Madgwick AHRS 姿态融合,输出 Roll 和 Pitch;3. 自定义 BLE GATT Telemetry 服务,通过 Notify 将温度、加速度和姿态角实时推送到手机端;4. 按键切换实时/低功耗工作模式;5. LED 显示广播、连接和模式状态;6. 低功耗模式下动态调整 BLE 广播/连接间隔和传感器采样率。
二、软件基线
开发环境:STM32CubeIDE + STM32CubeWBA Firmware Package V1.10.0。基线工程使用 ST 官方 B-WBA5M-WPAN BLE_Sensor 示例,该示例已包含 BLE 协议栈初始化和 I²C3 传感器驱动。
三、传感器数据采集1. I²C 总线
板载 I²C3 使用 PA6(SCL)+ PA7(SDA),默认 100 kHz。两个传感器挂接在同一总线上:
| 设备 | 7 位地址 |
| SHT40-AD1B | 0x44 |
| ISM330DHCX | 0x6A |
调用 BSP 接口 `BSP_ENV_SENSOR_GetValue(ENV_SENSOR_SHT40AD1B_0, ENV_TEMPERATURE, &temperature)`,读取浮点温度值。Telemetry 中以 `int16` 格式输出,单位为 0.01 °C。
3. 加速度和陀螺仪采集
使用 `BSP_MOTION_SENSOR_GetAxes(MOTION_SENSOR_ISM330DHCX_0, ...)` 获取三轴加速度和角速度。BSP 返回值是原始 ADC 计数与灵敏度的乘积,单位为 mg 和 mdps。进入 Madgwick 算法前做单位换算:
acceleration_g = (float)mg / 1000.0f; // mg → ggyro_radians = (float)mdps / 1000.0f * PI / 180.0f; // mdps → dps → rad/s
四、姿态融合
使用 Madgwick AHRS 六轴融合算法。由于板载 ISM330DHCX 不含磁力计,本项目仅输出 Roll 和 Pitch,Yaw 因无绝对航向参考会漂移,仅作为调试观察值。
核心代码:
Madgwick_UpdateIMU(&filter, gx, gy, gz, ax, ay, az, dt);Madgwick_GetEuler(&filter, &roll_deg, &pitch_deg, &yaw_deg);
算法参数 β = 0.08,更新频率 20 Hz(50 ms)。经过实际验证,在静止平放时 Roll 和 Pitch 稳定在 0° ± 3° 以内。
关于 MotionFX:经检查,STM32CubeWBA V1.10.0 软件包中不含适用于本工程平台(Cortex-M33,硬浮点 ABI)的 MotionFX 库文件,因此本项目采用 Madgwick 方案,无任何外部依赖。
五、自定义 BLE Telemetry 服务
在保留官方 BLE Sensor 服务的前提下,新增一个独立的自定义 Telemetry Service。1. 服务信息:
| 项目 | 值 |
| Service UUID | `7a112d90-425b-4e83-929b-1d6e7a200000` |
| Char UUID | `7a112d90-425b-4e83-929b-1d6e7a200001` |
| 属性 | Notify |
| 数据长度 | 20 字节 |
| 更新频率 | 20 Hz |
| 偏移 | 字节 | 类型 | 含义 |
| 0 | 4 | uint32 | 时间戳(ms) |
| 4 | 2 | int16 | 温度(0.01 °C) |
| 6 | 2 | int16 | 加速度 X(mg) |
| 8 | 2 | int16 | 加速度 Y(mg) |
| 10 | 2 | int16 | 加速度 Z(mg) |
| 12 | 4 | float | Roll(°) |
| 16 | 4 | float | Pitch(°) |
六、按键与 LED 交互1. 按键
板载用户按键 B2(PC13)响应:
| 操作 | 功能 |
| 短按 | 切换实时采集模式 ↔ 低功耗监测模式 |
| 长按(3 秒) | 进入深度休眠 |
板载蓝色 LED(PA1)状态:
| 条件 | LED 行为 |
| BLE 广播中(未连接) | 快速闪烁(约 2 Hz) |
| 已连接、实时采集模式 | 常亮 |
| 已连接、低功耗监测模式 | 慢速闪烁(约 0.5 Hz) |
| 深度休眠 | 熄灭 |
七、低功耗模式
低功耗监测模式下执行以下策略:1. 传感器采样率:从实时模式的 104 Hz 降至 12.5 Hz;2. BLE 连接间隔:从实时模式的约 20 ms 提升至约 500 ms,减少射频活动时间;3. BLE 广播间隔(未连接时):从实时模式的 100 ms 调整为 1000 ms(1 s),符合申请方案中"广播间隔 100ms~1s 可调"的要求;4. LED:从常亮改为慢闪。
上述切换在按键事件中通过 `ApplyMode()` 函数统一执行。每次模式变更后通过 UART 输出当前 ODR、广播间隔和连接参数,方便调试。
两种模式下的参数差异如下,Telemetry 数据推送频率的变化在 nRF Connect 中可以直观看到:
| 模式 | 广播间隔(未连接) | BLE 连接间隔 | 传感器 ODR | Telemetry 发送频率 |
| 实时采集 | 100 ms | ~20 ms | 104 Hz | ~20 Hz |
| 低功耗监测 | 1000 ms | ~500 ms | 12.5 Hz | ~2 Hz |
#define CFG_LPM_LEVEL (1U)#define CFG_LPM_STOP1_SUPPORTED (1U)#define CFG_LPM_STOP2_SUPPORTED (0U) /* 本 BLE_Sensor 基线未实现 STOP2 入口 */低功耗模式下,主循环空闲时自动进入 STOP1 深度休眠,按键 EXTI 唤醒;实时模式下限制为 SLEEP,保证数据采集和 BLE 推送不被中断。
八、关键技术点
1. 传感器单位转换
ISM330DHCX 驱动返回值说明:加速度灵敏度约为 0.061 mg/LSB,角速度灵敏度约为 8.750 mdps/LSB。BSP 已自动完成灵敏度乘算,应用层得到的 `GetAxes()` 返回值直接是 mg 和 mdps 单位,进入姿态算法前需手动转换为 g 和 rad/s。
2. Madgwick 初值问题
Madgwick 滤波器从单位四元数(q0=1)冷启动后,约需 0.5~1 秒收敛。该时间内 Roll/Pitch 输出可能会有短暂跳变,连接稳定后即可忽略。
3. Telemetry 独立运行设计
Telemetry 数据发送不依赖 Motion 或 Environmental Notify 是否开启。运动传感器和温度传感器定时器在初始化时即启动,无论手机端是否订阅,传感器数据始终采集并计算姿态。只有当手机端订阅了 Telemetry Notify 时,数据才会通过 BLE 发送。
4. BLE和服务共存
官方 BLE Sensor 服务保持不变,Telemetry 服务作为独立 Service 注册。二者共用同一 BLE Stack 和 GATT 数据库,在 `app_conf.h` 中已为 Telemetry 分配足够的 GATT 属性和缓冲区空间。
九、总结
本项目基于 STM32CubeWBA 官方 BLE_Sensor 工程,完成了从传感器采集、姿态融合、BLE 自定义服务到交互与低功耗模式的完整实现。
我要赚赏金
