资讯详情

基于单片机的智能电子血压计设计:从原理到样机实现

📅 2026/11/5 18:26:07 | 华诺云谱 👁 阅读
基于单片机的智能电子血压计设计:从原理到样机实现
简介这份资料面向嵌入式开发初学者与医疗电子爱好者系统讲解基于单片机的智能电子血压计从原理到落地的完整设计路径帮助读者理解示波法测量血压的技术实现。压缩包共303个文件、约6.74MB以C源码、头文件与编译中间文件为主辅以汇编启动代码、hex烧录文件、工程配置及一份配套APP安装包覆盖固件开发与上位机联调所需。内容围绕设计概要、工作原理说明、硬件选型压力传感器、气泵气阀、LCD与蓝牙模块、固件源码解析及APP数据管理展开读者可据此掌握袖带压力采集、血压算法计算与蓝牙通信的实现思路。目前已有987人学习适合作为课程设计或产品原型的参考蓝本。1. 从一块万用表和一台样机说起智能电子血压计设计到底要交什么带过几届课设和毕设之后我发现一个规律选“智能电子血压计”这个题的人往往是被它的“看起来简单”骗进来的。一个袖带、一个气泵、一块单片机、一个液晶屏原理图翻两页就画完了可真正把样机做出来、把数据跑稳、把报告写完整中间隔着的是一整套设计资料。这份资料要解决的不是“血压计是什么”而是“从原理图到能演示的样机中间每一步该怎么做、参数怎么定、误差怎么收”。它适合两类人一类是要交单片机课程设计或毕业设计的学生需要一套结构完整、能照着搭的方案另一类是从业者要快速出一版可交付的血压测量模块方案需要现成的模块划分和验收口径。示波器抓不到波形、气泵一启动屏幕就花屏、测出来的数值每次都不一样这些坑我基本都踩过下面按需求、设计、实现、验收的顺序把整套东西摊开讲。2. 需求与选型为什么是“单片机 示波法”这条路线2.1 先把功能需求钉死别一上来就画图电子血压计这个题最容易翻车的地方是需求没定清楚就开始画原理图画到一半发现要加语音播报、要存历史数据、要蓝牙上传板子推倒重来。我一般会先拉一张功能需求表把“必须有”和“可以砍”分开这样后面选型和画板才有边界。需求项指标要求优先级说明血压测量范围0299 mmHg必须覆盖正常与高血压区间压力测量误差±3 mmHg 以内必须静态压力校准后的目标心率测量范围40200 次/分必须与脉搏波同步提取加压方式气泵自动加压至预设值必须约 180 mmHg 起测显示收缩压/舒张压/心率三值必须段码或点阵液晶存储最近 30 组测量记录可选外挂 EEPROM报警超限声光提示可选蜂鸣器 LED通信串口上传上位机可选调试与答辩演示用这张表的作用是给后面的选型定调。比如“±3 mmHg”这一条直接决定了压力传感器不能用几块钱的电阻式方案得选带温度补偿的集成压力传感器而“自动加压”决定了必须有气泵驱动电路和过压保护不能只靠软件判断。需求表里“可选”的那几项答辩时是加分项但不要为了它们牺牲核心测量的稳定性这是我见过最多的本末倒置。2.2 主控与传感器的选型逻辑主控这块课程设计场景下 51 内核和 STM32 都是常见选择。51 的优势是资料多、上手快、指导老师熟悉缺点是 ADC 精度和运算能力有限做滤波和包络提取时比较吃力STM32 这类 Cortex-M 内核自带 12 位 ADC、定时器资源丰富跑示波法的包络算法更从容。我的建议是如果题目只要求“能测、能显示”51 够用如果要求“测量稳定、有算法处理、能存数据”直接上 STM32别在 51 上硬扛后期调算法的时间成本远高于换芯片的成本。传感器是这套方案的核心。示波法测血压本质是给袖带加压后缓慢放气同时采集袖带内的压力波动这个波动里叠加着心脏搏动带来的微小振荡也就是脉搏波。压力传感器要同时满足两点量程覆盖 0300 mmHg分辨率能分辨出 1 mmHg 以下的压力变化。常用的集成压力传感器内部带惠斯通电桥和温度补偿输出模拟电压接单片机 ADC 即可。选型时重点看三个参数量程、灵敏度mV/mmHg 量级、以及是否内置补偿。没有温度补偿的传感器冬天和夏天测出来的基线会漂这是玄学问题其实是温漂。气路部分需要气泵、电磁阀或泄气阀、袖带和一段软管。气泵选微型直流隔膜泵工作电压与系统电源一致泄气阀用常闭电磁阀断电时保持袖带压力测量结束再打开放气。这里有个血泪经验气泵和电磁阀都是感性负载启动瞬间电流冲击大如果和单片机共用一路电源且滤波没做好屏幕花屏、ADC 读数跳变都是家常便饭后面电源章节会专门讲怎么处理。2.3 技术路线对比示波法为什么是唯一现实选择血压测量有听诊法柯氏音法和示波法两条路。听诊法靠麦克风或压力传感器识别柯氏音的出现和消失对应收缩压和舒张压原理直观但对麦克风灵敏度、环境噪声、袖带位置极其敏感做成自动设备难度很高。示波法则是采集袖带压力振荡波的包络通过包络的幅度变化反推收缩压和舒张压抗干扰能力强适合单片机自动处理市面上绝大多数电子血压计走的都是这条路。示波法的关键在包络提取。放气过程中每个心动周期会在袖带压力上叠加一个振荡波振荡幅度随袖带压力变化在平均压附近达到最大。工程上的做法是以固定采样率采集压力信号用带通滤波去掉直流分量和呼吸基线漂移得到振荡波再对振荡波做峰值检测得到每个周期的幅度序列这个序列就是包络。收缩压和舒张压通常取包络幅度达到最大值某个比例经验系数在 0.50.7 之间时对应的袖带压力。这个系数不是拍脑袋不同厂商有不同标定课程设计里用 0.6 左右作为初值再用标准血压模拟器或对比测量去修正是常规做法。提示包络比例系数直接决定测量结果的系统偏差答辩时如果被问到“你的系数怎么来的”要能说清楚是参考经验值加实测修正而不是随便填的。3. 总体架构设计四个模块与一条信号链3.1 系统分层感知、控制、处理、交互整套系统我习惯拆成四层感知层是压力传感器和信号调理电路负责把袖带压力变成单片机 ADC 能读的电压控制层是气泵和电磁阀的驱动电路负责加压、保压、放气的时序处理层是单片机内部的采样、滤波、包络提取和血压计算交互层是液晶显示、按键、蜂鸣器和可选的串口上传。四层之间靠明确的接口衔接画框图时把每层的输入输出标清楚后面写报告和答辩都能直接用。信号链是这样的袖带压力 → 压力传感器 → 差分放大/滤波 → ADC → 数字滤波 → 振荡波提取 → 包络计算 → 血压值 → 显示。这条链上任何一环出问题最终数值都会飘。比如前置滤波没做好50 Hz 工频干扰混进来包络就会毛刺丛生ADC 参考电压不稳压力读数整体偏移。所以架构设计阶段就要把每一环的指标分配下去而不是等出了问题再回头找。3.2 硬件模块划分与关键接口硬件上按功能分块画原理图比一张大图好维护得多。我一般分成电源模块、传感器与调理模块、气泵阀驱动模块、主控最小系统、人机交互模块五块。电源模块负责把电池或适配器电压稳到 3.3 V 和 5 V 两路传感器和单片机走 3.3 V气泵走 5 V 或直接走电池电压两路之间用磁珠或电感隔离。传感器输出接一个 RC 低通加运放跟随再进 ADC这个跟随器的作用是提高输入阻抗避免 ADC 采样时把传感器输出拉偏。气泵和电磁阀的驱动不能用单片机 IO 直接推必须经过三极管或 MOS 管并且在线圈两端反并联续流二极管否则断电瞬间的反电动势会把驱动管击穿。这个二极管省掉的代价是烧管子我见过不止一次。驱动电路和主控之间最好加光耦或至少加限流电阻把感性负载的干扰挡在单片机外面。模块核心器件接口关键指标电源稳压芯片 滤波3.3 V / 5 V 输出纹波小于 20 mV传感调理集成压力传感器 运放模拟电压 → ADC量程 0300 mmHg气泵阀驱动MOS 管 续流二极管GPIO 控制支持 PWM 调速主控单片机最小系统ADC/GPIO/UART采样率不低于 100 Hz交互液晶 按键 蜂鸣器并口或串口刷新不闪烁采样率这一项要特别说。示波法要提取的是脉搏波正常心率下振荡频率在 13 Hz理论上采样率几十赫兹就够但为了做数字滤波和峰值定位实际取 100200 Hz 更稳妥。采样率太低峰值位置会偏包络就不准采样率太高单片机存储和运算压力大51 上尤其明显。100 Hz 是个平衡点STM32 上可以放到 200 Hz。3.3 软件状态机加压、保压、放气、计算软件的主干是一个状态机这是整套方案里最值得抄的部分。血压测量的时序性很强什么时候开泵、什么时候关泵、什么时候开始采样、什么时候算结果顺序错了测量就废了。状态机大致分五个状态待机、加压、保压、放气测量、结果处理。加压阶段气泵开启同时监测袖带压力到达预设值比如 180 mmHg或检测到压力上升变缓时停止保压阶段短暂稳定让压力读数收敛放气测量阶段电磁阀以固定速率放气同时以 100 Hz 采集压力信号这是核心数据段放气结束后进入结果处理做滤波、包络提取和血压计算最后显示并回到待机。每个状态设置超时保护比如加压超过 30 秒还没到预设值强制停止并报错防止气路漏气时气泵一直转。typedef enum { STATE_IDLE 0, STATE_INFLATE, STATE_HOLD, STATE_DEFLATE, STATE_COMPUTE } bp_state_t; bp_state_t bp_fsm(bp_state_t cur, uint16_t pressure, uint32_t tick_ms) { static uint32_t state_enter_ms 0; switch (cur) { case STATE_IDLE: if (start_flag) { pump_on(); state_enter_ms tick_ms; return STATE_INFLATE; } break; case STATE_INFLATE: /* 到达预设压力或超时则转入保压 */ if (pressure TARGET_PRESSURE || (tick_ms - state_enter_ms) 30000) { pump_off(); state_enter_ms tick_ms; return STATE_HOLD; } break; case STATE_HOLD: if ((tick_ms - state_enter_ms) 500) { valve_open(); state_enter_ms tick_ms; return STATE_DEFLATE; } break; case STATE_DEFLATE: /* 放气到低于阈值采样结束 */ if (pressure DEFLATE_END_PRESSURE) { valve_close(); return STATE_COMPUTE; } break; case STATE_COMPUTE: bp_calculate(); return STATE_IDLE; } return cur; }这段状态机的关键在几个常量和超时。TARGET_PRESSURE是加压目标一般取比预期收缩压高 3040 mmHg默认 180 mmHg 对多数人够用但对高血压人群可能不够工程上可以做成两段加压先加到 180若包络还没出现明显峰值再补压到 200。DEFLATE_END_PRESSURE是放气终点通常取 4050 mmHg低于这个值包络已经衰减完继续采没意义。超时保护是后悔药气路漏气、袖带没绑好时没有超时机制气泵会一直转既费电又危险。4. 关键模块实现从采样到血压值的每一步4.1 压力信号采集与数字滤波ADC 采样看起来简单坑却不少。首先是参考电压如果用单片机内部参考精度和稳定性都一般压力读数会有几个 mmHg 的漂移条件允许的话用外部基准或者至少在软件里做一次零点校准——每次开机时读取当前环境压力作为零点后续读数减去这个零点。其次是采样时序ADC 采样要和气泵 PWM 错开否则 PWM 的开关噪声会串进采样结果表现为读数周期性跳动。数字滤波分两级。第一级是滑动平均去掉高频噪声窗口取 510 个点对应 50100 ms不影响脉搏波的低频成分。第二级是带通滤波目的是把直流压力分量和呼吸引起的慢漂移去掉只留下 0.55 Hz 的振荡波。工程上常用一阶或二阶巴特沃斯带通用差分方程实现计算量小51 也能跑。/* 二阶带通滤波中心频率约 2 Hz采样率 100 Hz */ static float b0 0.0675f, b1 0.0f, b2 -0.0675f; static float a1 -1.8249f, a2 0.8649f; static float x1 0, x2 0, y1 0, y2 0; float bandpass(float x) { float y b0 * x b1 * x1 b2 * x2 - a1 * y1 - a2 * y2; x2 x1; x1 x; y2 y1; y1 y; return y; }这几个系数是按 100 Hz 采样率、通带约 0.55 Hz 设计的实际使用时可以用工具生成后直接填进来。滤波后的信号就是振荡波它的幅度包络才是我们要的东西。这里要注意滤波会带来相位延迟包络峰值的位置会稍微后移做血压计算时如果对时间对齐要求高需要补偿这个延迟课程设计层面影响不大但答辩时能提一句会显得考虑周全。4.2 包络提取与收缩压/舒张压计算包络提取的常用做法是峰值检测在滤波后的振荡波上找局部极大值记录每个峰值的幅度和对应时刻的袖带压力。峰值检测要设两个门限一个幅度门限去掉噪声引起的小峰一个时间门限保证两个峰之间至少间隔 300 ms对应心率 200 次/分避免一个心动周期被误检成两个。得到峰值序列后找幅度最大的那个峰它对应的袖带压力就是平均压的近似。然后从最大峰向两侧找幅度下降到最大幅度某个比例时对应的压力就是收缩压和舒张压。收缩压在最大峰之前压力较高一侧舒张压在之后。比例系数前面说过取 0.6 左右起步实测修正。#define RATIO_SYS 0.60f #define RATIO_DIA 0.70f void bp_calculate(void) { int max_idx find_max_peak(); float max_amp peak_amp[max_idx]; int sys_idx max_idx, dia_idx max_idx; /* 向高压侧找收缩压 */ while (sys_idx 0 peak_amp[sys_idx] max_amp * RATIO_SYS) sys_idx--; /* 向低压侧找舒张压 */ while (dia_idx peak_count - 1 peak_amp[dia_idx] max_amp * RATIO_DIA) dia_idx; sys_pressure peak_pressure[sys_idx]; dia_pressure peak_pressure[dia_idx]; heart_rate 60.0f / avg_peak_interval; }收缩压和舒张压用不同的比例系数是因为包络在两侧的衰减不对称这是示波法的固有特性不是随便设的。心率由相邻峰的平均时间间隔换算间隔单位是秒60 除以间隔就是次/分。这段代码里没有做异常处理实际工程中要加如果找不到足够的峰或者算出的收缩压小于舒张压直接判为测量失败提示重新测量而不是硬输出一个错值。测量失败比测错更可接受这是医疗类设备的基本态度。4.3 气泵阀时序控制与过压保护气泵和电磁阀的控制看似只是开关 IO实际时序要求很细。加压速率不能太快太快会让袖带压力冲过目标值也会让被测者不适一般控制在每秒 510 mmHg。用 PWM 控制气泵转速可以实现软启动避免启动瞬间电流冲击。放气速率同样要稳示波法要求放气过程线性、缓慢典型速率是每秒 23 mmHg太快包络采样点不够太慢测量时间过长。过压保护是必须做的安全设计分软件和硬件两层。软件层在加压状态里持续比较压力值超过 220 mmHg 立即关泵开阀硬件层可以加一个压力开关或独立比较器软件失效时直接切断气泵电源。课程设计里硬件保护可以简化但软件保护一定要有而且要在报告里写清楚这是答辩时体现工程思维的加分点。void pump_control(uint8_t duty) { if (duty 100) duty 100; set_pwm_duty(duty); /* 0100 对应占空比 */ } void safety_check(uint16_t pressure) { if (pressure OVER_PRESSURE_LIMIT) { /* 220 mmHg */ pump_control(0); valve_open(); fault_flag FAULT_OVER_PRESSURE; } }PWM 占空比和实际加压速率的关系需要实测标定不同气泵、不同袖带容积下差别很大。我的做法是先给固定占空比跑一次记录压力上升曲线算出速率再反推需要的占空比。这个标定过程要写进报告说明参数不是拍脑袋定的。4.4 显示、存储与串口上传显示部分段码液晶便宜、驱动简单适合只显示三组数字点阵液晶能显示波形和提示语答辩演示效果更好但驱动代码量大。如果要做包络波形显示点阵屏是更好的选择把采样到的振荡波按列画出来评委一眼就能看懂你在做什么。按键至少两个测量启动和记录查询。蜂鸣器用于测量开始、结束和超限提示。存储用外挂 EEPROM 或单片机内部 Flash 模拟存最近 30 组记录每条记录包含收缩压、舒张压、心率和一个时间戳如果加了 RTC。存储格式要定好比如每条 8 字节前两字节收缩压、两字节舒张压、一字节心率、三字节时间或序号读写时按固定偏移操作避免结构体对齐带来的麻烦。串口上传主要用于调试和答辩演示。定义一个简单的帧格式比如帧头 0xAA、长度、数据、校验和上位机收到后解析显示。这个功能在调试阶段价值很大可以把原始压力波形传到电脑上看比盯着小屏幕猜问题高效得多。5. 避坑与排查那些让样机“时好时坏”的细节5.1 现象屏幕花屏、ADC 读数乱跳原因基本都指向电源和地。气泵、电磁阀启动瞬间拉大电流如果它们和单片机共用一条地线且走线细地电位会被抬起来单片机的参考地跟着动ADC 读数自然跳液晶也可能因为复位不彻底而花屏。解决分三步气泵和阀的电源单独走线从电源入口直接拉过去不要经过单片机区域数字地和功率地单点连接连接点放在电源入口附近气泵两端并联一个几百微法的电解电容吸收启动冲击。做完这三步大部分花屏和跳变会消失。5.2 现象每次测量结果差十几个 mmHg先排除袖带绑法和测量姿势这两项对结果影响很大袖带位置偏高或偏低、测量时说话都能造成 10 mmHg 以上的偏差。排除之后看包络如果包络峰值不明显或者有多个相近的峰说明滤波参数或峰值检测门限有问题。常见原因是带通滤波的通带设得太宽把呼吸基线也放进来了或者峰值检测的时间门限太小把噪声峰当成了脉搏峰。调窄通带、加大时间门限重新看包络形状正常应该是一个明显的单峰。5.3 现象加压到一半就停或者气泵一直转前者多半是压力上升速率判断逻辑太激进压力稍有波动就误判为“到顶”把速率判断的窗口拉长、加一点迟滞就能解决。后者是超时保护没生效或者气路漏气先检查袖带接口和软管有没有折住再看超时计数的单位是不是写错了——用毫秒计数却按秒比较这种低级错误我见过。气路漏气时压力上不去状态机卡在加压态没有超时就会一直转所以超时保护不是可选项。5.4 现象静态压力准但血压值整体偏高或偏低这是系统偏差出在包络比例系数上。静态压力可以用标准压力计校准但收缩压舒张压的比例系数没有标准件就只能靠对比测量。做法是找几组用商用血压计测过的数据和自己的样机同时测算偏差然后微调比例系数。注意不要用一组数据调到底至少三组不同血压水平的数据取折中。另外要确认对比测量是同一时间、同一姿势否则调出来的系数没有意义。5.5 现象答辩演示时死机或复位现场演示和实验室环境最大的差别是电源和干扰。如果用电池供电检查电池电量气泵启动时电压跌落可能导致单片机欠压复位如果用适配器检查适配器纹波。还有一个容易被忽略的点演示前没有做完整的冷启动测试代码里某个初始化顺序在热复位时正常、冷启动时异常。我的习惯是每次改完代码断电再上电跑一遍完整测量流程这个习惯救过好几次场。6. 验收与答辩怎么证明这套血压计是“能用的”验收这件事我一般分三层来做层层递进答辩时也按这个顺序讲评委听起来逻辑清楚。第一层是功能验收逐项对照需求表能不能自动加压、能不能显示三个值、按键和蜂鸣器是否正常、存储记录能不能查。这一层用一张检查表每项打勾现场演示一遍完整测量流程从开机到出结果不超过 60 秒。第二层是精度验收静态压力用标准压力计或经过校准的压力表对比在 0、50、100、150、200 mmHg 几个点各测三次记录偏差要求都在 ±3 mmHg 以内血压值用商用血压计做对比测量同一受试者、同一时间段、同一姿势测三组取平均偏差控制在 ±8 mmHg 以内算合格这个口径比医疗器械标准宽松但对课设和毕设是合理的。第三层是稳定性验收连续测 10 次看结果离散程度如果某次明显偏离要能解释原因比如袖带松动或受试者移动。答辩时的技巧核心是“用数据说话用波形佐证”。把原始压力波形、滤波后的振荡波、包络曲线三张图放在一页 PPT 上讲清楚每一步做了什么、参数怎么定的比念代码有效得多。评委常问的问题集中在三处比例系数怎么来的、误差怎么控制、安全保护做了什么提前把这三块的答案准备好。还有一个细节演示时把测量过程完整走一遍不要只放录好的视频现场跑出来的结果哪怕有偏差只要你能解释偏差来源反而比完美数据更可信。验收项方法合格标准静态压力标准压力计对比5 个压力点偏差 ±3 mmHg 内血压值商用血压计对比3 组偏差 ±8 mmHg 内重复性连续测量 10 次离散度小于 10 mmHg过压保护人为触发超压3 秒内停泵开阀测量时长计时60 秒内出结果从那以后我每次带这类项目都会在答辩前一周强制走一遍完整的冷启动加对比测量流程把数据记在本子上而不是等到现场才第一次跑。血压计这个题代码能跑通只是及格线数据稳得住、偏差说得清才算真正交付。希望这套结构能帮到你照着搭、照着验少走几个我走过的弯路。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑