#嵌入式
基于 RA6M5 与 TinyML 的智能脉搏监测系统
本项目以瑞萨 RA6M5 (R7FA6M5BH3CFC, Cortex-M33 @200MHz) 为核心,设计了一套边缘 AI 脉搏监测系统。系统通过 PPG 光电传感器实时采集脉搏波形,在 MCU 端运行 1D-CNN 神经网络对心律状态进行实时分类,结果在 TFT 屏幕和 PC 看板同步展示。
关键词:RA6M5、TinyML、1D-CNN、PPG 脉搏波、HRV 心率变异性、边缘推理
系统架构
┌─────────────────────────────────────────────────────────┐
│ 硬件层 │
│ HKG-07B PPG 传感器 ──→ ADC (P001, 12bit, 200Hz) │
│ ST7796S TFT (320×480) ──→ SPI (GPIO bit-bang) │
│ USB-TTL ──→ UART (P512, 115200) ──→ PC 看板 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 软件层 │
│ 数据采集 → 数字滤波 → 峰值检测 → BPM/IBI 计算 │
│ │ │
│ └──→ 1D-CNN 推理 (128点波形 → 4分类) │
│ │ │
│ └──→ TFT 显示 + UART 输出 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ AI 模型 │
│ 输入: 128点原始ADC波形 │
│ Conv1D(16,K5) → MaxPool(4) → Conv1D(8,K3) → MaxPool(4)│
│ → Flatten → Dense(16) → Dense(4) → Softmax │
│ 输出: Normal / Elevated / Irregular / Low Signal │
└─────────────────────────────────────────────────────────┘
硬件设计
| 组件 | 型号/参数 | 接口 |
|---|---|---|
| 主控 | R7FA6M5BH3CFC (Cortex-M33, 200MHz) | — |
| PPG 传感器 | HKG-07B 反射式光电 | ADC P001 |
| TFT 屏幕 | 4.0" ST7796S 320×480 SPI | P203 MOSI, P204 SCK |
| 串口输出 | SCI4 UART 115200bps | P512 TX |
| 开发环境 | e2 studio + FSP 6.4.0 + GCC ARM 13.2 | — |
引脚分配
| 引脚 | 功能 | 说明 |
|---|---|---|
| P001 | ADC AN01 | PPG 传感器模拟输入 |
| P111 | GPIO 输出 | TFT RESET |
| P203 | GPIO 输出 | TFT MOSI (软件 SPI) |
| P204 | GPIO 输出 | TFT SCK (软件 SPI) |
| P301 | GPIO 输出 | TFT CS |
| P302 | GPIO 输出 | TFT DC (数据/命令) |
| P303 | GPIO 输出 | TFT LED 背光 |
| P512 | SCI4 TXD | UART 数据输出 |
软件设计
信号处理流水线
原始 ADC (200Hz, 12bit)
│
▼ 5点移动平均滤波
去噪信号
│
▼ 动态阈值跟踪 (自适应 max/min)
包络信号
│
▼ 上升沿阈值穿越检测
峰值检测 → IBI 计算
│
├──→ BPM (中值滤波平滑)
├──→ 趋势记录 (5分钟, 1Hz)
└──→ UART 导出 (HR + IBI + WAVE)
心率变异性 (HRV) 特征
从 32 拍滑动窗口提取:
| 特征 | 含义 | 用途 |
|---|---|---|
| Mean HR | 平均心率 | 基础指标 |
| SDNN | IBI 标准差 | 总 HRV 水平 |
| RMSSD | 连续差均方根 | 副交感神经活性 |
| pNN50 | >50ms 差值比例 | 短程 HRV |
| IBI Range | 最大最小区间差 | 心律稳定性 |
TFT UI 布局
┌──────────────────────────┐
│ Pulse Wave Monitor │ 标题栏 (蓝底)
├──────────────────────────┤
│ │
│ ▁▂▃▄▅▆▇█▇▆▅▄▃▂▁ │ 实时波形 (190px)
│ │
├──────────────────────────┤
│ 72 BPM Normal │ 心率 + 状态 (100px)
│ IBI: 833ms │
│ AI Normal 85% │ AI 分类结果
├──────────────────────────┤
│ ▂▃▅▆█▆▅▃▂▃▅▆█▆▅▃ │ 5分钟趋势 (78px)
├──────────────────────────┤
│ Sensor: HKG-07B | ... │ 状态栏 (58px)
└──────────────────────────┘
TinyML 模型
为什么用 AI?
传统 PPG 算法只能给出 BPM 数值,无法判断心律模式。1D-CNN 从原始波形中学习特征,能区分:
- 正常心律 (Normal):规则间隔、典型 PPG 形态
- 心率偏高 (Elevated):间隔缩短、幅度降低
- 心律不齐 (Irregular):间隔不规则、波形变形
- 信号弱 (Low Signal):噪声主导、无可识别脉搏
这四类问题无法用 if-else 规则穷举,因为波形形态受个体差异、传感器位置、环境光等因素影响极大。
为什么在 MCU 上跑?
| 对比维度 | MCU 边缘推理 | 云端/PC 推理 |
|---|---|---|
| 延迟 | < 5ms | > 100ms (网络) |
| 隐私 | 数据不出设备 | 上传到服务器 |
| 离线可用 | ✓ | ✗ |
| 功耗 | mW 级 | W 级 |
| 成本 | 无额外成本 | 需要联网模块 |
模型规格
| 参数 | 值 |
|---|---|
| 架构 | 1D-CNN (Conv×2 + Dense×2) |
| 输入 | 128 点原始 ADC 波形 |
| 输出 | 4 分类 + 置信度 |
| 参数量 | ~1,500 个 float (6 KB) |
| 推理时间 | < 5ms (RA6M5 @200MHz) |
| 推理频率 | 1 Hz |
| 训练框架 | TensorFlow/Keras → C 语言部署 |
模型部署流程
1. 采集数据 2. 训练 3. 部署
┌──────────┐ ┌──────────────┐ ┌──────────────┐
│ 串口采集 │ ──→ │ Python 训练 │ ──→ │ C 数组替换 │
│ 4类 PPG │ │ train_model │ │ ai_model.c │
│ 波形数据 │ │ .py │ │ 重新编译烧录 │
└──────────┘ └──────────────┘ └──────────────┘
技术指标
| 指标 | 数值 |
|---|---|
| MCU 主频 | 200 MHz (Cortex-M33) |
| ADC 采样率 | 200 Hz, 12-bit |
| 心率检测范围 | 40-200 BPM |
| IBI 检测范围 | 300-1500 ms |
| 波形缓冲区 | 256 点 (1.28 秒) |
| 趋势记录 | 300 点 (5 分钟) |
| 软件 SPI 速率 | ~2 MHz |
| 全屏刷新 | ~300 ms |
| AI 推理 | < 5 ms / 次 |
| UART 输出 | 115200 bps, 1 Hz |
创新点
- MCU 端 AI 推理:在 Cortex-M33 上部署 1D-CNN,直接从原始波形学习分类,而非传统人工特征提取
- 纯 C 实现神经网络:无外部依赖(无 TensorFlow Lite Micro 运行时),Conv1D/MaxPool/Dense/Softmax 全部手写,模型可完全替换
- 双屏同步展示:TFT 本地显示 + PC 端实时看板,适合答辩和演示
- 完整信号处理链:从模拟采集、数字滤波、峰值检测、HRV 分析到 AI 分类的全链路闭环
文件结构
JZC/
├── src/
│ ├── hal_entry.c # 主程序
│ ├── tft_driver.h/c # ST7796S TFT 驱动 (软件 SPI)
│ ├── pulse_sensor.h/c # 脉搏传感器驱动 + 信号处理
│ ├── ai_model.h/c # 1D-CNN 模型 (纯 C)
│ └── ai_features.h/c # HRV 特征提取 (备用)
├── ra_gen/ # FSP 生成代码
├── ra_cfg/ # FSP 配置头文件
├── configuration.xml # FSP 工程配置
├── dashboard.py # PC 端实时可视化看板
├── train_model.py # AI 模型训练脚本
├── AI_使用说明.md # AI 模块详细使用说明
└── 项目介绍.md # 本文档
快速开始
1. 编译烧录
e2 studio 打开 JZC 工程 → Build Project → 串口烧录
2. PC 看板
pip install pyserial matplotlib numpy
python dashboard.py COM4
3. 训练 AI 模型(可选)
pip install tensorflow numpy
python train_model.py
# 复制输出的 C 数组到 ai_model.c → 重新编译烧录
演示建议
- 正常静息:展示稳定的脉搏波形 + "AI Normal 90%+" 分类
- 运动后:BPM 上升 + AI 自动切换为 "Elevated"
- 传感器位移:波形变形 + AI 识别为 "Low Signal"(证明模型不是胡乱输出)
- PC 看板:投屏展示实时波形 + AI 分类概率柱状图,评委不用凑近看小屏