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(适合远程医疗,但功耗高,需要大电池)。
我建议量产项目用模块化设计——把通信模块做成子板,通过排针连接。这样换通信方式时,只需要改子板,主板不用动。
小结
这一章咱们把系统架构的骨架搭好了。硬件上,前端模拟、主控、通信、电源各司其职;软件上,驱动层、中间件、应用层分层清晰;选型上,性能、成本、供货三者平衡。下一章咱们就要开始画原理图了——嗯,那才是真正动手的时候。
个人经验:做系统架构时,多花一天时间画框图,能省下后面一周的调试时间。别问我怎么知道的——都是血泪教训。