#嵌入式

基于 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

创新点

  1. MCU 端 AI 推理:在 Cortex-M33 上部署 1D-CNN,直接从原始波形学习分类,而非传统人工特征提取
  2. 纯 C 实现神经网络:无外部依赖(无 TensorFlow Lite Micro 运行时),Conv1D/MaxPool/Dense/Softmax 全部手写,模型可完全替换
  3. 双屏同步展示:TFT 本地显示 + PC 端实时看板,适合答辩和演示
  4. 完整信号处理链:从模拟采集、数字滤波、峰值检测、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 → 重新编译烧录

演示建议

  1. 正常静息:展示稳定的脉搏波形 + "AI Normal 90%+" 分类
  2. 运动后:BPM 上升 + AI 自动切换为 "Elevated"
  3. 传感器位移:波形变形 + AI 识别为 "Low Signal"(证明模型不是胡乱输出)
  4. PC 看板:投屏展示实时波形 + AI 分类概率柱状图,评委不用凑近看小屏