2、系统架构设计:整体硬件框图、软件分层架构与关键器件选型策略

好,咱们正式开始第二章。系统架构设计,说白了就是给整个监护仪画一张“施工蓝图”。你想想看,盖房子总得先有图纸吧?做医疗设备更是如此。我见过不少新手工程师,上来就焊板子、调代码,结果做到一半发现引脚不够用,或者电源纹波太大,最后只能推倒重来。嗯,这章咱们就把地基打牢。

2.1 整体硬件框图:四大功能模块

一个嵌入式心电监护仪,硬件上可以拆成四大块:前端模拟主控通信电源。我个人习惯先画一个顶层框图,再逐层细化。

核心架构图(文字描述)

人体电极 → [前端模拟] → [主控MCU] → [通信模块] → 上位机/云端
                ↑                    ↓
              [电源管理]        [存储/显示]

2.1.1 前端模拟:信号的第一道关卡

心电信号有多微弱?大概只有0.5mV到4mV,还夹杂着各种肌电干扰、工频噪声。前端模拟电路的任务就是:放大、滤波、抬升。我在项目中遇到过最头疼的问题就是共模干扰——明明信号源没问题,示波器上一看全是50Hz的毛刺。后来加了右腿驱动电路,才把共模抑制比提上去。

  • 仪表放大器:比如AD8232、ADS1292,负责差分放大。
  • 滤波网络:0.05Hz~100Hz带通滤波器,滤除基线漂移和高频噪声。
  • 电平抬升:因为心电信号是双极性的,而ADC只能采集正电压,需要把信号抬升到1.65V(以3.3V系统为例)。

2.1.2 主控:大脑与心脏

主控芯片的选择直接决定了系统性能。我建议优先考虑ARM Cortex-M4/M7内核的MCU,比如STM32F4系列或国产的GD32F4系列。为什么?因为心电算法需要做FFT、数字滤波,M4带DSP指令集,算力刚好够用。

  • ADC采样率:至少250Hz,推荐500Hz以上。
  • RAM:至少64KB,用于存储原始数据和算法中间变量。
  • 外设接口:SPI(连ADC)、I2C(连传感器)、UART(连蓝牙/WiFi)。

避坑指南:我曾经选了一款低功耗MCU,结果发现它的ADC采样率只有100Hz,根本达不到心电检测标准。嗯,从那以后我选型第一件事就是看ADC规格。

2.1.3 通信:数据怎么传出去?

监护仪的数据最终要传到医生手里。通信方式取决于应用场景:

通信方式 适用场景 典型芯片
蓝牙BLE 个人便携、手机APP nRF52832、CC2541
WiFi 病房联网、云端上传 ESP32、ESP8266
有线USB 医院固定设备、高速传输 CH340、FT232

我个人习惯在量产项目中留一个备用串口,万一无线通信出问题,还能用有线方式调试。

2.1.4 电源:稳定是王道

医疗设备对电源纹波要求极高。模拟前端如果供电不干净,信号质量直接报废。我建议采用两级电源架构

  • 一级:锂电池或USB输入,通过DC-DC降压到3.3V(效率高)。
  • 二级:3.3V经过LDO稳压到3.0V或1.8V(纹波低,专供模拟电路)。

常用的LDO有AMS1117-3.3、TPS7A47等。注意:模拟地和数字地要单点连接,否则地环路会引入噪声。

2.2 软件分层架构:驱动层、中间件、应用层

软件架构我习惯分三层。你想想看,如果所有代码都揉在main函数里,后期维护就是噩梦。我见过一个项目,光一个中断服务函数就写了2000行,改一个bug要翻半天。

2.2.1 驱动层:和硬件打交道

驱动层直接操作寄存器,负责初始化外设、收发数据。比如:

// SPI驱动示例(伪代码)
void SPI_Init(void) {
    // 配置GPIO、时钟、波特率
    SPI1->CR1 |= SPI_CR1_SPE;  // 使能SPI
}

uint8_t SPI_ReadByte(void) {
    while(!(SPI1->SR & SPI_SR_RXNE));  // 等待接收
    return SPI1->DR;
}

驱动层要尽量硬件无关化。比如写一个“SPI_ReadByte”函数,上层调用时不用关心底层是STM32还是GD32。

2.2.2 中间件:承上启下

中间件是软件的灵魂。它把驱动层的原始数据加工成有意义的信息。比如:

  • 数字滤波算法:去除工频干扰(50Hz陷波器)、基线漂移(高通滤波)。
  • 心率计算:通过R波检测算法(如Pan-Tompkins)算出瞬时心率。
  • 数据缓存:用环形缓冲区存储10秒的心电波形,供应用层随时读取。

注意:中间件不要直接调用驱动函数。应该通过回调函数或消息队列传递数据。这样换硬件时,只需要改驱动层,中间件不用动。

2.2.3 应用层:用户看得见的部分

应用层负责界面显示、报警逻辑、数据上传。比如:

  • 当心率超过120bpm时,触发声光报警。
  • 每5秒通过蓝牙发送一次心电数据包。
  • 在OLED屏幕上绘制实时波形。

应用层代码要尽量轻量化,复杂的计算交给中间件。我曾经把FFT算法写在应用层,结果界面卡得不行——后来移到中间件,用DMA传输数据,流畅多了。

2.3 关键器件选型策略

选型是门学问。我总结了一个“三看原则”:看性能、看成本、看供货。尤其是医疗设备,芯片停产是致命打击。

2.3.1 模拟前端芯片

型号 通道数 分辨率 特点
AD8232 1 模拟输出 集成右腿驱动,适合单导联
ADS1292 2 24位Δ-Σ 内置PGA,适合多导联
MAX30003 1 19位 超低功耗,适合穿戴设备

我个人偏好ADS1292,因为它内置了导联脱落检测,省掉了外部比较器。不过要注意,它的封装是QFN,手工焊接有点难度。

2.3.2 主控MCU

  • STM32F407VGT6:Cortex-M4,1MB Flash,192KB RAM,带DSP和FPU。适合算法复杂的项目。
  • GD32F450:国产替代,性能接近,价格便宜30%。但要注意它的ADC精度略低。
  • ESP32-S3:如果项目需要WiFi/BLE双模,可以直接用ESP32,省掉外部通信芯片。

警告:不要为了省钱选太冷门的MCU。我曾经选了一款台湾的芯片,结果开发工具链不完善,一个bug调了三天。后来换成STM32,半天搞定。

2.3.3 电源芯片

  • DC-DC:TPS5430(3A输出,效率90%以上),适合给数字电路供电。
  • LDO:TPS7A47(超低噪声,1μVrms),专供模拟前端。
  • 电池管理:TP4056(充电管理),BQ25890(带路径管理,适合边充边用)。

嗯,这里要注意:LDO的压差不能太大。比如输入3.3V,输出3.0V,压差0.3V,很多LDO在这个压差下无法正常工作。我建议选低压差LDO,比如XC6206系列。

2.3.4 通信模块

  • 蓝牙:nRF52832(性能强,但需要自己写协议栈),或者直接买BLE透传模块(如HC-08,省事)。
  • WiFi:ESP8266(便宜,但稳定性一般),ESP32(自带MCU,可以做预处理)。
  • 4G:SIM7600CE(适合远程医疗,但功耗高,需要大电池)。

我建议量产项目用模块化设计——把通信模块做成子板,通过排针连接。这样换通信方式时,只需要改子板,主板不用动。

小结

这一章咱们把系统架构的骨架搭好了。硬件上,前端模拟、主控、通信、电源各司其职;软件上,驱动层、中间件、应用层分层清晰;选型上,性能、成本、供货三者平衡。下一章咱们就要开始画原理图了——嗯,那才是真正动手的时候。

个人经验:做系统架构时,多花一天时间画框图,能省下后面一周的调试时间。别问我怎么知道的——都是血泪教训。