☰
基于瑞萨MCU的示波法电子血压计电路设计全解析
2026/10/20 17:41:57 网站建设 项目流程

做嵌入式硬件的人,迟早会遇到一个和你扯上关系的需求:一台电子血压计。这东西看着不起眼,但真要基于一颗瑞萨微控制器从头把电路搭起来,远不是“点个灯、测个电压”那么简单。一台基于瑞萨的血压测量仪,核心任务是用袖带充气阻断动脉,再通过压力传感器捕捉袖带压力上叠加的脉搏振荡波,最后换算成收缩压、舒张压和脉率。这套系统里面,微弱信号调理、低噪声ADC、气泵电磁阀的时序控制、数字滤波和特征识别,全都串在同一条链路上,堪称一个非常典型的混合信号小系统。这篇文章就把整个电路实现过程从原理到调试验证拆开讲,包括方案选型、关键电路参数、软件算法要点和实际踩坑记录,适合正在做电子设计课题、嵌入式健康监测项目,或者单纯想完整复刻一台示波法血压计硬件的朋友参考。

1. 方案选型与测量原理拆解

1.1 为什么是示波法

血压测量有两大主流方法:柯氏音法和示波法。柯氏音法就是医生拿着听诊器听袖带放气过程中的血流音,以第一声出现和声音消失作为收缩压和舒张压的判据。这套方法临床价值极高,但落到电子设计上很麻烦:要加拾音探头,做音频放大,还要在嘈杂环境下可靠识别特征音,袖带位置偏一点、手臂动一下、衣服摩擦一下,判读结果就会飘,硬件和算法的复杂度直线上涨。

示波法完全是另一条思路,不需要音频通路。它的物理基础是:袖带充气到完全阻断动脉血流后,以一定速率缓慢放气,此时袖带内的气压会叠加一种小幅脉动——心脏每搏动一次,动脉容积变化就让袖带压力波动几个毫米汞柱。把袖带压力的直流基线滤掉,剩下的就是一串脉搏振荡波。这个振荡波的幅度变化有明确规律:压力从高到低释放的过程中,振荡波幅度先从小到大,到平均压附近达到峰值,再逐渐减小。根据包络线特征,就能反推出收缩压、平均压和舒张压。

从电路角度看,示波法把“听声音”的问题转化成了“测压力波形”的问题,整条信号链就是传感器、放大器、模数转换、数字信号处理,没有精密声学部件,环境适应性好。这也是家用电子血压计普遍采用示波法的根本原因。做DIY复现,示波法同样是打通全链路最容易落地的方向。

1.2 主控芯片与模拟前端的角色分配

主控我选的是瑞萨RA系列里带可编程增益放大器和24位Σ-Δ模数转换器的型号。选它的理由很实际:一颗芯片把模拟前端和数字处理整合在一起,能省掉不少外部电路。血压计是便携设备,板子面积、物料成本、待机功耗都要算计,如果信号调理和ADC全部靠外部芯片堆,地线串扰和电源噪声问题会成倍增长。

RA系列内部PGA支持差分输入和增益配置,可以直接对接桥式压力传感器的低电平差分输出。24位Σ-Δ ADC处理血压信号是绝对够用的,而且Σ-Δ架构自带数字滤波,适当配置采样率和滤波档位后,外部抗混叠电路可以非常精简。MCU的通用GPIO用来点LCD、读按键、控制泵和阀,也正合适。这套方案的待机功耗可以压到微安级,对电池供电的医疗设备来说很重要。

如果不用RA系列,用RL78这类高性价比MCU也是可行的,但通常需要一个外部仪表放大器或者精密运放做信号调理。我的经验是:既然项目目标是做完整的信号链设备,优先选带模拟前端的MCU,焊的电阻电容少了,调板子时地线串扰的问题也能少一大半。

1.3 传感器选型的几个硬指标

压力传感器是整个测量精度的源头,选型重要性比很多人预想的高得多。血压测量时袖带压力范围一般在0到300mmHg,约0到40kPa,所以传感器要选表压型,而不是绝压型。表压型感受的是相对环境大气压的压差,天然匹配“袖带内高于大气压”的物理场景;绝压型测的是绝对气压,会附带当地大气压的偏移,还得手动做额外的零点修正,没有理由给自己加这个负担。

核心指标我重点看三个。第一是满量程输出幅值,常见桥式传感器满量程输出在几十到一百毫伏量级,太小会让后续放大链路压力很大,噪声控制也更难。第二是零点温漂,廉价传感器零点随温度的漂移有时能达到每摄氏度几十微伏等效输入,换算成压力误差可能好几个mmHg,这是廉价方案最容易翻车的地方。第三是封装和气路接口,最好选带标准气嘴或者软管接口的模块,直接和袖带胶管相连,自己拿硅胶管堆接头很容易漏气。

供电方面,多数桥式传感器需要恒压或恒流激励,激励源的纹波会直接叠到输出信号上,所以传感器供电必须单独处理。这个细节放到后面电源设计部分展开。

2. 硬件电路设计:从传感器到气路的链路

2.1 压力信号调理电路与增益配置

传感器的输出是差分的,实际幅度只有几十毫伏,不能直接送ADC。信号调理要做两件事:把差分信号放大到ADC量程范围内,同时把高频噪声滤掉。

我以一个满量程40kPa、满量程输出约100mV的桥式表压传感器为例算一下。如果ADC参考电压是2.5V,希望测量端满量程对应大约2V,留出20%过压余量,那么增益就是20倍。RA系列内置PGA的增益档位一般是1、2、4、8、16、32这样跳的,就近选16就够,再用外部电阻分压微调;如果增益档里没有合适的,可以选8档,然后通过后端一个有源放大电路补足。外部运放方案则按仪表放大器的经典增益公式计算增益电阻,以常见架构为例,20倍增益对应的设定电阻大约2.49kΩ,选标准电阻值即可。

低通滤波的截止频率我给的是20Hz左右。脉搏振荡波的主要能量在1到3Hz,袖带压力基线变化在0.5到2Hz,20Hz足够保留信号成分,同时能压掉一部分工频干扰和电机噪声。RC取值可以这样配:10kΩ串联电阻加820nF对地电容,算出来截止频率约19.4Hz;如果驱动能力有富余,用1kΩ加8.2nF也能得到同样截止频率,但抗加载能力更好。放在MCU内部PGA输出端和ADC输入引脚之间的一阶RC,通常就够了。

有一点必须提醒:传感器输出是差分信号,尽量保持差分接入,不要在某端直接接地变成单端。桥式传感器的共模电压通常在供电电压一半附近,单端化会引入共模噪声,尤其气泵启动瞬间,地上的一点毛刺都会变成测量误差。

2.2 气泵和电磁阀驱动与过压保护

血压计的气路核心是两个执行器:充气泵和电磁阀。充气泵一般是个小隔膜泵,直流电机驱动,电流可能到500mA甚至1A。驱动电路我用一颗低压NMOS,栅极通过10kΩ下拉电阻接MCU的GPIO,漏极接泵的负极,泵的正极接电源,泵两端反并联一颗肖特基二极管吸收关断尖峰。选MOS管时注意持续电流和导通电阻,导通电阻太大会发热,压降也会影响泵的启动性能。

电磁阀分两种作用:测量过程中的慢速放气阀和测量结束后的快速泄气阀。慢速放气阀需要能精确控制放气速率,可以通过PWM调占空比实现;快速泄气阀直接全开就行。两者都选常闭型,断电自动关断,这样即使系统死机也不会出现持续放气导致重复测量的情况。电磁阀同样是感性负载,必须加续流二极管,否则关断瞬间的反向尖峰可能直接打坏驱动管或者MCU引脚,这个坑很多人踩过。

安全保护是三层的。硬件上用机械泄压阀做过压保险;软件上MCU实时监测袖带压力,一旦超过260mmHg就立刻开快速泄气阀并停泵;再配合看门狗,防止程序跑飞导致气泵一直工作停不下来。医疗相关设备,冗余保护怎么强调都不过分,哪怕只是DIY验证板,也应该把安全习惯培养起来。

2.3 显示、按键、电源和PCB布局

显示方案我建议用段码LCD,这是便携医疗设备最常见的方案,阳光下可读性好,功耗低,部分MCU还能直接驱动段码LCD,省掉外部驱动芯片。如果用数码管就需要额外的译码驱动,板子复杂一截;点阵OLED显示效果好但功耗偏高,而且温度特性不如LCD稳定,做产品要权衡。我自己复刻时用的是段码LCD加两个按键:一个启动/停止,一个切换用户,按键软件消抖即可。

电源是整个系统最容易出问题的地方。我的做法是:电池电压先进入一级LDO得到稳定的系统主电压,然后传感器激励和MCU模拟参考分别做独立处理。传感器激励用一颗低噪声LDO单独供电,参考电压优先用MCU内部带缓冲的基准,外部再配好去耦电容。

这里要强调一个布局原则:气泵、电磁阀这种大电流开关负载,绝对不能和传感器、运放共用电源走线。我见过一版设计,泵的正极直接从LDO输出拉出来,传感器也从同一个LDO取电,泵一启动瞬间压降直接让测量曲线抖成毛刺。这种问题不是换个大电容就能解决的,要在布局阶段就把模拟域和功率域分开。模拟电路下方尽量不走数字信号线,尤其是PWM驱动线;传感器放在板边靠近气嘴的位置,泵和阀放到板的另一侧,中间用地平面做隔离。

3. 软件与算法:把压力曲线变成血压数字

硬件只解决了信号采集问题,真正决定血压计好不好用的是软件。这一层我从状态机、信号处理、血压判定三个维度展开。

3.1 测量状态机设计

测量流程是一个清晰的状态机:空闲、充气、稳定、放气测量、快速泄压、计算显示。用C语言来描述大概是这样的骨架:

typedef enum { IDLE, PUMP_UP, STABLE, RELEASE_MEASURE, QUICK_RELEASE, CALC_DONE } measure_state_t; void measure_task(void) { switch (state) { case IDLE: if (start_btn_pressed()) { cuff_pressure = 0; state = PUMP_UP; } break; case PUMP_UP: pump_on(); if (cuff_pressure >= target_press) { pump_off(); state = STABLE; } break; case STABLE: delay_ms(500); release_valve_set(RELEASE_PWM); state = RELEASE_MEASURE; break; case RELEASE_MEASURE: if (pressure_drop_rate() > 3.0f) { release_valve_set(after_pwm); } buffer_append(timestamp, cuff_pressure); if (cuff_pressure < STOP_PRESSURE) { release_valve_full(); state = CALC_DONE; } break; case CALC_DONE: calc_blood_pressure(); show_result(); state = IDLE; break; } }

目标压力怎么定?常规做法是预判收缩压加30到40mmHg,比如默认充到160mmHg,如果用户上次测量的收缩压高,就按上次值加40mmHg作为目标。放气速率要压在2到3mmHg/s,这是测量精度的关键。放气太快,单位时间内采集的振荡波样本太少,包络细节丢失;放气太慢,用户体验差,而且静脉充血会改变振荡波特征。实际中可以通过PWM阀开度的闭环调节来维持速率,简单做法是每100ms计算一次压降速率,根据偏差调整占空比。

3.2 振荡波提取与去噪

ADC拿到的是原始袖带压力曲线,它由两部分叠成:缓慢下降的基线(袖带压力本身)和叠加在基线之上的脉搏振荡波。提取振荡波的方法通常是估计基线,再从原始信号中减掉:

振荡波 = 原始压力 - 基线估计

基线估计可以用滑动窗口均值或者截止频率约0.3Hz的低通滤波器。窗口宽度一般取1秒左右,太宽会让基线跟不上下压的斜坡,太窄又会把脉搏分量吸进去。减掉基线后,再用一个带通或高通滤波去掉直流成分和呼吸干扰,得到干净的振荡波形。

采样率建议设在500Hz到1kHz,放气过程大概持续30到40秒,全程能攒下上万点数据,信息量完全够。虽然MCU里的Σ-Δ ADC支持很高的过采样率,但没必要盲目拉高,信号本身频带也就20Hz上下,设太高反而容易把数字开关噪声混进来。我实测下来500Hz足够稳定。

3.3 血压判定参数与校准

有了振荡波包络线,下一步是找特征点。先检测每个脉搏波的峰值,相邻峰值间隔下限设在0.3秒左右,对应心率上限200次/分,避免把毛刺噪声当心跳。峰值序列再做三点平滑,得到幅度包络。

包络最大值对应的袖带压力就是平均压MAP,这个指标最稳定,受算法比例系数影响最小。收缩压和舒张压的判定基于幅度比例法:在包络上升沿找幅度首次达到峰值幅度某一比例的位置,对应收缩压;在下降沿找幅度降低到峰值幅度某一比例的位置,对应舒张压。

这里有个所有示波法血压计都绕不开的问题:比例系数到底取多少。不同厂商的算法差异非常大,常见收缩压比例在0.45到0.7之间,舒张压比例在0.5到0.85之间。这个系数不是拍脑袋定的,需要和标准听诊法做大量对照校准。DIY阶段最现实的校准方式,是拿一台经过了临床验证的上臂式电子血压计做参照,多测几组,根据偏差方向微调系数。收缩压偏高就调低收缩压比例系数,偏低就调高,每次调整后重新做对照。

心率可以从振荡波峰值间隔直接算出来,连续几次间隔取平均,再换算成每分钟次数。如果检测到间隔波动过大,比如心律不齐,界面最好提示测量结果可能受影响,而不是硬算一个看似精确的数字。

4. 调试实录:常见故障、排查与精度校准

4.1 按故障现象快速定位的速查表

实际调试过程中,我整理过一张故障定位表,大部分问题都能对号入座:

故障现象主要原因排查思路
充气后压力数值纹丝不动传感器接线错误、ADC通道配置错误、气路漏气先查传感器输出端静态电压是否在其供电电压一半附近,再查ADC读取数值是否随压力变化
充气很慢或达不到目标压力泵供电不足、泵体老化、气路漏气测泵两端电压在启动瞬间是否跌落,保压测试看压力下降速率
放气速度不可控电磁阀驱动占空比异常、阀口堵塞、密封圈破损示波器看MOS管栅极波形,查PWM配置,拆阀检查密封面
测量值明显偏高放气速率过快、袖带位置过松、算法收缩压比例系数偏大确认放气速率在2到3mmHg/s,规范佩戴方式和袖带尺寸,重新做对照校准
测量值明显偏低袖带尺寸偏小、算法比例系数偏小、参考电压漂移验证袖带型号匹配,检查基准电压是否稳定,调整系数
电池供电时数值跳动电机启动瞬间拉低电源、模拟域和功率域未隔离示波器观测传感器供电纹波,重点查地线布局和LDO输出
显示屏花屏LCD软排线接触不良、逻辑电平不匹配、驱动初始化顺序错误检查电平转换电路,按手册核对初始化时序

这七类问题基本覆盖了我自己调试过程中九成以上的故障场景。

4.2 静态标定与动态对照

静态标定是第一步。用标准气压源(没有的话可以用水银血压计和一个三通接头)给传感器施加已知压力,记录ADC输出码值,做两点标定得到“码值-压力mmHg”的线性关系。桥式传感器的线性度通常不错,两端标定后中间误差一般能做到千分级以下,对血压测量来说完全够。

动态对照是第二步。给传感器盒加装袖带,找几组不同血压状态的人做对比测量:一边是标准电子血压计,一边是自己的板子。注意记录的不只是收缩压和舒张压,还有MAP,因为MAP受算法系数影响最小,是校验整个信号链是否正常的最佳指标。如果MAP准确但收缩压、舒张压偏差大,问题在比例系数;如果MAP本身偏差大,问题大概率在传感器标定或者放气速率上。这个诊断逻辑能少走很多弯路。

4.3 机械气路问题排查

电子问题都好查,真正让我头疼的是气路。硅胶管接口、电磁阀密封圈、袖带气嘴,任何一处微漏都会让放气曲线不平滑,振荡波提取错乱。

排查方法很土但很有效:把袖带充到150mmHg,关闭所有阀门,观察1分钟压力下降量。正常情况下降应该小于2mmHg/分钟,超过这个值就说明有慢漏气,拿肥皂水刷接头就能看到冒泡点。还有一个容易被忽略的地方是电磁阀内部密封圈,放气阀频繁开关几十次后密封面容易粘上异物,压力维持不住,表现出来就是测值忽高忽低。定期拆开清洁或者直接换新阀,是调试阶段最省心的做法。

5. 踩坑心得与后续扩展方向

5.1 让我返工最多的几个细节

第一个坑是ADC采样率。我最早把Σ-Δ ADC配置到了4kHz,想着数据越多越好,结果数字开关噪声和采样时钟谐波全混进来了,波形反而更脏。后来把输出率降到500Hz,配合内部数字滤波,波形干净得多。Σ-Δ ADC的过采样是有代价的,不是越高越好。

第二个坑是传感器供电。有一版为了省一颗LDO,直接让传感器VDD和MCU参考串在一起,结果每次泵一启动,测值就漂好几个mmHg。后来改成独立低噪声LDO加外部基准,问题一次解决。传感器激励是模拟链路的生命线,不能省。

第三个坑是气泵振动。泵工作时的机械振动会直接传导到传感器和袖带,产生慢变的伪振荡波。软件上解决的办法是等泵完全停稳再开始测量,比如充气到位后加400到500ms的稳定延时;硬件上也可以在泵和PCB之间加一层软性缓冲垫,影响更直接。

5.2 从单次测量到健康终端的扩展

这套板子如果想继续往深处做,扩展方向很明确。第一是加通信:MCU的串口资源丰富,外接一颗蓝牙模块做UART透传,把测量结果同步到手机APP,血压数据的电子化记录就完整了。第二是加存储:把每次测量的时间戳和结果写进外部Flash或EEPROM,就能做长期趋势分析。第三是改造成动态血压监测:真正做24小时动态血压的话,定时充放气的策略比单次测量复杂很多,夜间测量的泵噪和袖带舒适度也要重新设计,算法上还要处理运动伪迹。

最后再强调一次:这类自制设备没有经过医疗注册和临床验证,数据只能用于技术验证和教学演示,不能用来做诊断依据或者指导用药。搞电子健康设备的人,这点一定要拎清。测量的最终目的是服务健康,不是制造一个看起来精确的数字。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询