
从去年开始一直有读者问我能不能做一个既练手又实用的单片机项目最好不是流水灯、温湿度计这种玩过就吃灰的东西。我认真想了很久推荐最多的是基于STM32或51单片机的智能血压表设计。原因很简单它把传感器采集、信号滤波、算法判定、外设驱动、人机交互全部串起来了做完之后既能给家里老人测血压又能把嵌入式开发的整套流程练一遍性价比很高。这篇文章把我实际做这个项目的过程拆开来讲包括方案选型、核心原理、硬件电路、代码实现和踩坑记录不管你是刚接触51单片机的新手还是想从51过渡到STM32的进阶玩家都能直接照着做出来。1. 项目整体设计与方案选型1.1 智能血压表的核心需求解析很多人第一次接触血压表设计容易把它理解成用一个传感器测压力然后显示数字。真正动手做之后才会发现这里面的难点根本不是测压力而是如何在充气、放气的动态过程中从压力信号里提取出动脉搏动信息并据此判断收缩压和舒张压。从功能拆解来看一套完整的智能血压表至少包含这几个部分气泵负责给袖带充气电磁阀或者慢速放气阀负责控制放气速度气压传感器负责把袖带内的压力转换成电信号单片机负责采集、滤波和算法判定显示屏负责展示结果按键负责启动测量和切换功能。如果对数据管理有更高要求还可以加上蓝牙模块把测量记录同步到手机App里。这个项目为什么值得做因为它是一个典型的闭环系统从模拟信号采集到数字信号处理再从算法判定到外设控制每个环节都有明确的功能验证标准。你做完之后可以拿自己的手臂实测把结果和水银血压计或电子血压计对照这就是最直观的功能验收。这种做出来能用、测出来能比较的项目非常有助于建立对嵌入式系统的整体认知。1.2 方案选型STM32和51单片机怎么选选型是这个项目的第一步也是很多人纠结的地方。我的建议很直接如果预算允许优先选STM32如果你想用最少的成本验证原理51单片机也完全可以做只是性能和扩展性会受限。先看51单片机方案。传统51单片机以STC89C52为代表主频12MHz没有硬件ADC也没有I2C硬件外设。它的优势在于上手门槛低、资料多、开发环境简单网上随便搜就能找到海量例程。但正因为内部资源太少你需要在外围电路上补齐很多芯片测压传感器如果输出模拟电压你需要外接ADC芯片如ADC0832或者PCF8591如果要显示中文信息多半得用带字库的LCD1602或者OLED模块通过软件模拟I2C驱动。整个系统做下来51单片机本身不贵但外围芯片和调试时间上去了整体成本优势并没有想象中那么大。再看STM32方案。以STM32F103C8T6为例72MHz主频内置12位ADC、硬件I2C、多个定时器处理示波法血压算法需要的采样和滤波运算完全没有压力。它的开发环境虽然比51复杂一些但只要按照标准流程配置Keil、安装芯片包也没有多难。从长远看STM32学到的东西可以平移到后续更多项目上比如电机控制、FreeRTOS、物联网终端扩展性比51强很多。我把两种方案的对比整理成了一张表方便你根据自身情况选型。对比项51单片机方案STM32方案代表芯片STC89C52RCSTM32F103C8T6主频12MHz72MHzADC无需外接ADC芯片内置12位ADC多通道I2C需软件模拟硬件I2C也支持软件模拟数据处理能力一般适合简单滤波强适合实时采样和算法开发难度低中等整体成本低但外围成本高稍高但集成度高扩展空间有限大可加蓝牙、WiFi、屏幕如果你家里有51单片机开发板我建议你先用51把整个系统的原理跑通验证传感器选型和算法可行性。之后再换到STM32上做完整版本你会发现很多代码逻辑是可以平移的只是外设接口的配置方式不同罢了。这篇文章后面的内容我会以STM32方案为主线讲解同时点出51方案下需要调整的地方。1.3 功能规划与工作流程设计动工之前先把系统工作流程设计清楚后面写代码、调硬件就不会乱了。智能血压表的核心工作流程我把它概括成充气、放气、分析、显示四个阶段。按下测量键之后气泵开始给袖带充气。充气过程中单片机通过ADC持续采集气压传感器输出的电压值同时判断袖带压力是否达到了预设的目标压力。这个目标压力一般设定为收缩压的估计值再加上30到40mmHg比如估计收缩压120mmHg就充到160mmHg左右。实际产品为了简化通常会默认充到180mmHg或者按用户上一次的测量结果动态调整。充气达到目标值后气泵停止电磁阀开始慢速放气。放气速度很关键一般控制在每秒3到5mmHg放气太快会让振荡波信号丢失细节放气太慢则延长测量时间用户体验差。在放气过程中单片机不断采样从袖带压力信号里提取叠加在静态压力之上的微弱搏动振荡波同时记录当前袖带压力值。放气到一定程度通常是低于预估舒张压以后系统判断振荡波包络线已经完整出现关闭电磁阀迅速泄掉袖带中的残余气体。然后单片机对采集到的数据处理通过幅度比例法计算收缩压和舒张压最后把结果和测量时间一起显示在屏上。整个流程写清楚之后你会发现每个模块的任务边界非常明确采集模块管数据算法模块管判断控制模块管气泵和电磁阀显示模块管结果输出。这种模块化的思路不仅是这个项目的核心也是以后做任何嵌入式项目的通用方法论。2. 测压原理、传感器选型与关键参数2.1 示波法测血压的基本原理血压测量原理是整个项目的灵魂如果你只是按照网上的例程把气压值读出来却不能理解它如何转化为收缩压和舒张压那这个项目做出来也只是照猫画虎。目前电子血压计主流的技术是示波法也叫做振荡法。它的原理说起来并不复杂袖带充气到一定程度就会完全压迫动脉阻断血流。随后缓慢放气袖带压力逐渐下降当袖带压力降到收缩压附近时动脉血管开始有少量血液通过血管壁的振动就会传递到袖带内引起袖带气压的微小波动。这个波动的幅度先是逐渐增大在平均压附近达到峰值然后又逐渐减小直到袖带压力降到舒张压以下血管完全恢复通畅波动消失。关键在于从传感器读取到的袖带气压信号里包含了一个随放气逐渐下降的直流分量以及叠加在直流分量上的、由动脉搏动引起的交流分量。我们需要先把这两种分量分离开来。直流分量就是每个采样时刻的袖带静态压力交流分量就是振荡波。分离出振荡波之后按照测量时刻对应的袖带压力值可以画出一条振荡波幅度随袖带压力变化的包络线。包络线的最高点对应的袖带压力就是平均压。收缩压和舒张压怎么确定业界通行的方法是幅度比例法找到包络线峰值幅度Amax然后从包络线上升沿找到幅度等于某个比例如0.5倍Amax的点该点对应的袖带压力作为收缩压从下降沿找到幅度等于另一个比例如0.75倍Amax的点该点对应的压力作为舒张压。不同厂家的算法略有差异比例系数一般在0.45到0.57和0.69到0.8之间。理解了这个原理你就会明白为什么这个项目的算法部分不能随便糊弄。采样率不足会丢失振荡波的关键起伏滤波不干净则会把呼吸干扰和袖带摩擦噪声当作搏动波这些都会直接导致测量结果不准。2.2 气压传感器怎么选从模拟输出到数字输出传感器选型决定了电路复杂度和算法处理方式。目前适合DIY血压计的气压传感器主要有两类一类是模拟电压输出另一类是数字I2C输出。模拟输出的典型代表是MPXV5050GP量程0到50kPa也就是大约0到375mmHg输出0.2到4.7V的模拟电压可以直接接入STM32的ADC引脚。它内部集成了信号调理电路不需要额外放大使用比较方便。缺点是需要占用一个ADC通道而且对电源纹波比较敏感如果供电质量不好输出噪声会比较大。数字输出的典型代表是XGZP6847系列这是国产MEMS压力传感器量程常见的有-100kPa到100kPa内部集成24位ADC和I2C接口可以直接输出数字气压值分辨率和稳定性都比模拟方案高一截。使用这种传感器单片机只需要用I2C读取它的寄存器值再按数据手册的公式换算成真实气压即可。它的优势是抗干扰能力强数据是数字量不容易受线路噪声影响劣势是需要自己写一段I2C驱动代码对新手来说多一道坎。从我实测经验看如果你选STM32方案我更推荐XGZP6847这类数字传感器。虽然驱动代码多写几十行但数据质量好后面算法调起来省心。如果你是51方案而且对I2C不熟可以先从模拟传感器和独立ADC芯片起步原理更直观调试也更容易。2.3 气泵、电磁阀与气路设计气泵和电磁阀属于执行部件也是很多人会忽略的细节。气泵选择上要注意两个参数额定电压和最大压力。DIY项目里常用3.3V到5V的微型气泵比如从血压计拆机件或者网上买现成的气泵模块都能满足需求。关键是气泵的堵转压力要能超过200mmHg否则加到一半就打不上气了。电磁阀的作用是控制放气。有两种常见方案一种是充气用气泵、放气用电磁阀的有源方案电磁阀不通电时密封通电后打开实现放气另一种是慢速放气阀的无源方案气路中直接串联一个固定节流孔充气结束后靠袖带内的压力自然缓慢放气。有源方案控制更精确因为单片机可以主动控制放气开始和结束的时机代价是电路多一个驱动管无源方案结构简单但放气速度不可调不同袖带松紧程度下测量一致性稍差。气路连接也不容忽视。所有气管接头必须密封良好漏气的直接后果是充气慢、放气曲线不均匀、振荡波信号畸变。我建议使用气动接头加硅胶软管接头处可以缠一点生料带增强密封实测下来比直接插管稳定很多。2.4 关键参数采样率、目标压力与安全阈值算法能跑起来的前提是参数设置合理。我把几个我验证过的关键参数列出来。采样率示波法血压测量中振荡波的主要频率成分在1到4Hz之间按照采样定理留出余量建议ADC对气压信号的采样率做到100Hz以上。我用的是STM32内置ADC配合定时器1ms中断等效采样率1000Hz对后续数字滤波和峰值提取来说非常充裕。用51单片机也能做但要注意主频低100Hz采样加运算已经接近它的极限代码要尽量精简。目标充气压力建议设置为高于收缩压预估值的30到40mmHg。如果用户不知道自己的血压范围默认目标值可以设为170到180mmHg宁可多充一点也不能充不够。但这就要求后级必须有安全泄压机制。安全阈值这是非常重要的保护参数。系统必须设置一个绝对安全压力比如250mmHg一旦检测到袖带压力超过这个值立即关闭气泵、打开电磁阀泄压。这不是可选项是必须项。因为如果气泵控制电路故障或者程序跑飞袖带持续充气可能造成危险这一条安全保护逻辑一定要写在代码里。3. 硬件电路设计与接线实操3.1 系统架构与硬件模块划分硬件电路设计遵循模块化原则按功能把系统拆成几个独立的单元单片机最小系统、气压采集单元、气泵驱动单元、电磁阀驱动单元、显示单元、按键输入单元、供电单元。每个单元在原理图上独立画调试时也独立验证这样排查问题会容易得多。单片机最小系统以STM32F103C8T6为例包含晶振电路、复位电路、BOOT配置和电源去耦电容。这些内容资料很多我重点说一下容易被忽略的电源部分。整个系统里有气泵这种大电流负载工作时瞬间电流可能达到几百毫安甚至安培级如果和单片机共用一条细走线供电气压传感器和ADC的参考电压会跟着气泵启停剧烈波动直接体现为测量数据跳动。为了避免这个问题我的做法是采用星型供电5V电源进来之后先经过一个10uF电解电容和0.1uF瓷片电容滤波然后分成两路一路直接驱动气泵和电磁阀另一路经过LDO稳压到3.3V给单片机、传感器和屏幕供电。两条供电回路在电源入口处才汇合这样气泵的大电流不会串到模拟采集部分。3.2 气泵驱动电路三极管与MOS管的取舍气泵和电磁阀都是感性负载驱动电路的核心是两点足够的驱动电流和续流保护。如果气泵额定电流在500mA以内用S8050三极管加基极限流电阻就能驱动。但三极管在饱和导通时依然有几百毫伏的压降气泵两端实际电压会低于电源电压转速和压力都会打折扣。更推荐的方案是直接用AO3400这类N沟道MOS管导通电阻只有几十毫欧压降几乎可以忽略。单片机GPIO输出3.3V高电平就可以直接驱动它的栅极不需要额外的电平转换电路。无论用三极管还是MOS管都必须在气泵或电磁阀两端反向并联一个续流二极管比如1N4148或者1N5819。这个二极管的作用是给感性负载断电时产生的反向电动势提供泄放回路如果没有它反向电压可能击穿驱动管或者干扰单片机复位。这个细节特别重要我第一次做的时候忘了画续流二极管结果气泵一停单片机就复位排查了很久才找到原因。驱动电磁阀时同样的思路GPIO接一个MOS管或者三极管电磁阀并联续流二极管。电压等级注意匹配5V电磁阀就用5V电源3.3V电磁阀可以少一个电平转换的顾虑。3.3 显示与按键电路设计显示模块我建议选0.96寸OLEDI2C接口原因是接线少、体积小、显示信息足够。血压测量的结果包括收缩压、舒张压、心率必要时还能显示测量时间一屏四行文字刚好放下。OLED供电3.3V直接和单片机共用电源即可。按键电路方面测量键是必备的。我外加了两个按键一个用于切换显示模式比如查看历史记录另一个用于预留功能扩展。按键不要直接接GPIO就算完建议在固件里启用内部上拉电阻并在代码里做消抖处理。更稳妥的做法是在每个按键引脚加一个1uF电容到地硬件消抖这样按下去的信号会更干净。3.4 硬件接线对照表与上电检查清单为了让新手少走弯路我把常用接线整理成一张表。这里以STM32F103C8T6小板加XGZP6847传感器、0.96寸I2C OLED为例。模块引脚接到STM32引脚XGZP6847传感器VCC3V3XGZP6847传感器GNDGNDXGZP6847传感器SCLPB6硬件I2C1XGZP6847传感器SDAPB7硬件I2C1OLED模块VCC3V3OLED模块GNDGNDOLED模块SCLPB6与传感器共用I2C总线OLED模块SDAPB7气泵驱动输入MOSFET栅极控制PA1电磁阀驱动输入MOSFET栅极控制PA2测量按键开关一端PA0另一端接GND注意XGZP6847和OLED都挂在同一组I2C总线上I2C协议本身支持一总线上挂多个设备只要设备地址不冲突就行。我在项目里实测传感器地址和OLED地址不同可以共存不需要额外处理。上电检查是必不可少的一步。我建议按顺序做先不插气泵和电磁阀单独给单片机上电用万用表确认3.3V和5V电压正常然后下载一个简单的闪烁灯程序确认最小系统工作正常再用I2C扫描程序确认OLED和传感器都能响应最后再接执行器件。这样分步处理即使出了问题也能快速定位到底哪一块没有工作。4. 软件框架与血压算法实现4.1 软件结构怎么划分软件和硬件一样必须模块化。我建议的代码结构分为三层底层驱动、算法处理、应用逻辑。底层驱动包括I2C读写、OLED显示、GPIO控制、ADC采样算法处理包含滑动平均滤波、振荡波包络提取、血压计算应用逻辑负责按键状态机、测量流程控制和结果展示。主循环的思路是上电初始化外设进入主循环后扫描按键状态空闲时显示待机界面按下测量键后状态机从空闲切换到充气阶段充气达到目标值后进入放气分析阶段完成算法后将结果写入显示缓冲区回到空闲状态。如果使用51单片机底层驱动的实现方式要调整比如I2C要改成软件模拟ADC要改成外接芯片的读写时序但整体的三层结构不用变。这也是我建议先设计好架构再写代码的原因不管平台怎么换逻辑框架是通用的。4.2 充气阶段的气压采集与控制代码充气阶段要同时做两件事读取气压值判断是否达到目标压力控制气泵通断。我这里用定时器中断做1ms周期采样在中断里只负责把ADC值存到环形缓冲区主循环负责控制逻辑避免在中断里做复杂运算。用STM32的Hal库写起来很直观。初始化ADC和定时器后在定时器中断回调里读取ADC转换值并存入数组。气压换算的公式从传感器数据手册获取XGZP6847这类数字传感器则是通过I2C读取24位原始值再按照手册给的公式转换为kPa最后乘7.5006换算成mmHg。读取气压值这一步是后续一切算法的基础务必用数字滤波把毛刺处理掉再使用。充气阶段的控制逻辑更简单读取当前气压如果还没到目标值把气泵控制引脚置高让它继续打气到了目标值把引脚拉低、关闭气泵同时打开电磁阀开始放气。这里要加一个超时保护如果充气持续超过15秒还没达到目标压力说明气路漏气或者袖带漏气系统应该停止充气并报错防止气泵长时间空转烧毁。4.3 放气阶段的滑动平均滤波与振荡波提取放气阶段是整个软件最核心的部分。从传感器读取到的袖带压力信号包含直流分量和微弱的振荡波。提取振荡波有两种思路一种是高通滤波把直流分量滤掉另一种是记录基线然后做差值。我用的方法是后者实现简单而且实时性高。具体做法是维护一个滑动窗口窗口长度取10到20个采样点每个周期计算窗口内数据的平均值作为当前基线。因为放气速度是每秒3到5mmHg袖带压力的直流分量在短时间窗口内近似线性变化取平均可以有效消掉直流趋势剩下的差值分量虽然包含了振荡波也包含了压力传感器本身的噪声。所以还要再做一次滑动平均滤波窗口长度取5个采样点把高频噪声压下去。经过这两步处理得到的波形就比较干净了能够看到明显的振荡波峰。滤波之后每次检测到振荡波的波峰就记录下这个波峰的幅度以及对应的袖带压力值。持续记录直到放气结束就能得到完整的振荡波包络线数据。注意实时检测波峰需要一个简单的阈值判断幅度超过之前记录的峰值的一定比例才认为是有效波峰这样可以滤掉放气初期小幅抖动造成的假峰。4.4 血压计算幅度比例法的落地实现有了完整的包络线数据计算血压就变得直接了。先把所有振荡波峰幅度找出来取最大值记为Amax这个值对应的袖带压力就是平均压。然后从上升沿找最早幅度达到0.5倍Amax的点记录该点对应的压力为收缩压从下降沿找一个幅度降到约0.75倍Amax的点记录为舒张压。这里有一个工程细节要注意如果包络线上升沿的0.5倍点找不到比如起始振荡幅度就已经超过0.5倍Amax常见原因是袖带初压太高或者充气量不够我处理的办法是取包络线起点的压力值作为收缩压估算值。下降沿同理。要做到精确实测时多次对比水银血压计结果适当微调比例系数。我在我的设备上调试的结果是收缩压取0.5、舒张压取0.72效果比较好但不同人群、不同袖带会有差异建议你做完后用自己的测量数据做几次校准。心率计算是附加功能实现不难统计两次相邻波峰之间的时间间隔换算成每分钟的搏动次数即可。注意心率结果要和血压值一起显示毕竟心率是血压计的一个重要辅助指标。4.5 51单片机平台移植要点如果你想先用51单片机做一版有几个地方必须做适配。首先是没有硬件I2C读写XGZP6847传感器需要软件模拟I2C时序。其次是ADC采集需要外接芯片读回的是并行或串行的数字量编程模型和STM32的ADC有区别。第三是51单片机的性能有限100Hz采样加滤波加实时处理已经比较紧张我建议把采样率降到50Hz算法里减少不必要的浮点运算多使用定点计算因为51系列特别是标准8051内核的浮点运算非常慢。外接ADC的时序相对简单比如ADC0832这类8位芯片通过CLK、DO、DI三个引脚控制时序读回来的数据是8位分辨率和精度比STM32内置12位ADC低不少但对演示这个项目原理来说已经够了。我最初用51加外接ADC做了一版虽然数据波动明显一些但整体流程能跑通对理解原理帮助很大。4.6 OLED显示与数据管理结果显示逻辑不算复杂但有一个细节值得说在测量过程中OLED不要反复刷新同一条数据那样会造成明显闪烁。我的建议是先把所有需要显示的内容拼接到一个显示缓冲区用一次显示刷新函数把整帧数据写上去。测量过程中只刷新当前工作的状态字段比如充气中测量中完成等测量结束后再更新血压和心率的具体数值。如果你的项目预留了存储功能比如保存最近几次测量记录可以外接一个EEPROM芯片在I2C总线上和传感器、OLED共存。记录内容包括测量时间、收缩压、舒张压、心率上电后从EEPROM读出历史记录按键切换查看。这个功能扩展起来难度不大但对体验提升明显有兴趣可以加上。5. 从画板到联调的完整实操流程5.1 开发环境搭建Keil、芯片包与工程配置工欲善其事必先利其器。写代码前先把环境搭好。如果你用STM32F103需要安装Keil MDK以及对应的STM32F1芯片支持包。Keil5现在支持C51和ARM两种内核如果你手头既有51开发板又有STM32板子两个版本可以共存安装时注意区分安装路径即可。芯片包安装有个常见坑下载支持包后双击并不能直接安装需要在Keil的Pack Installer里导入。建议直接使用Pack Installer在线下载或者从官网下载离线包后通过Pack Installer的File菜单导入。安装完成后新建工程在Device里能搜到STM32F103C8完成这一步骤才算环境就绪。如果你是51方案Keil C51版本不需要额外装芯片包新建工程时直接选Atmel的AT89C52或者STC系列即可STC芯片还要单独装一个STC-ISP下载工具烧录方式也简单串口就能搞定。5.2 首次上电调试分模块验证的实操步骤最快出问题的阶段就是首次上电。我的建议是绝对不要在没验证过底层驱动的情况下直接跑完整代码否则出了问题你根本不知道是该查传感器还是查气泵还是查屏幕。我的调试顺序是这样的第一步只下载一个GPIO控制程序让单片机控制OLED点亮确认I2C总线没有问题。可以先用通用的I2C扫描函数看看总线上挂载了几个设备。如果扫描不到传感器检查接线顺序和上拉电阻是否到位I2C总线必须接上拉电阻一般是4.7k欧姆。第二步单独读取气压传感器数据把传感器放在桌面上串口打印当前气压值正常应该接近当地大气压标准大气压约760mmHg。如果数值偏差很大检查换算公式有没有处理符号位XGZP6847的数据手册标注的是带符号24位值。第三步验证气泵和电磁阀驱动用按键控制GPIO动作听声音看气路是否通畅同时读取气压值确认充气后压力上升正常。第四步再接上完整的测量代码这时候大部分底层问题已经排查完毕剩下的就是算法调试了。5.3 整机联调与标准血压计的校准对比整机联调的目标不是让数值和电子血压计完全一致而是让趋势一致、误差在可接受范围内。校准的方法很简单先让被测者静坐5分钟然后用你的设备和一台经过验证的电子血压计或者水银血压计间隔1分钟在同一侧手臂先后测量记录两边的收缩压和舒张压对比差值。我实测的效果是多数情况下收缩压误差在正负5到8mmHg以内舒张压误差稍大一些在正负6到8mmHg左右。如果误差系统性偏大优先检查放气速度是不是太慢或者太快其次是调整幅度比例法中的系数。如果测量结果波动大多半是振荡波提取不干净回去优化滤波窗口长度。另外袖带的佩戴位置也有讲究不能太松也不能把气管压住袖带下缘应该位于肘窝上方2到3厘米处这些细节都会影响最终数值。6. 常见问题与排查技巧实录6.1 高频问题速查表现象可能原因解决方法充气时气压不升气泵不转或气路漏气检查驱动管基极/栅极电压检查气管接头密封性气压值跳动剧烈电源纹波过大气泵单独供电模拟部分加LDO和滤波电容气压值始终为负或异常大传感器换算公式符号处理错误对照数据手册检查符号位和换算系数测量结果偏高袖带佩戴过松或放气速度太快重新规范佩戴调整电磁阀放气速度测量结果偏低袖带放气速度太慢或目标压力过低适当提高目标压力优化放气阀显示正常但按键无响应按键消抖处理不当检查GPIO上下拉配置和软件消抖逻辑气泵一启动单片机就复位无续流二极管或电源压降过大气泵两端并联续流二极管加强电源滤波振荡波提取后噪声很大滤波窗口太短增加滑动平均窗口长度必要时加低通滤波6.2 几个值得单独说一说的坑第一个坑是气泵续流。这是我实际踩过的也是很多新手容易忽略的。气泵断电瞬间会产生反向电动势如果不加续流二极管轻则干扰ADC数据重则重启单片机。所以一定记得驱动电路里画续流二极管不是可选项是必须项。第二个坑是放气速度。某次我为了加快测量速度把电磁阀开得比较大放气速度到了每秒8mmHg左右结果采样数据完整但计算出来的舒张压偏低而且波动明显。后来我查阅资料加上实测对比把放气速度控制在每秒3到5mmHg数据稳定多了。这个速度不是拍脑袋定的放气太快时血压下降速度大于动脉脉搏波变化速度会导致振荡波幅度采样不充分进而影响算法判断。第三个坑是很多人拿到数字气压传感器后直接把I2C读取的原始值当气压用忘了换算公式。不同型号传感器的换算公式完全不同甚至同一型号不同量程的系数也不一样一定要仔细看数据手册。我在调试XGZP6847时一开始把24位数据当作无符号数处理结果气压值一直比正常值高出好几倍排查了半小时才发现是符号位的问题。6.3 提升测量稳定性的三个调试建议调试到最后你会发现设备能不能稳定工作往往取决于几个细节。第一个建议是ADC采样数据一定要做二级滤波先做滑动平均消除毛刺再做低通滤波提取振荡波。只做一次滤波很难同时兼顾这两点。第二个建议是为气泵启动瞬间的电流冲击预留软件延时启动气泵后等100到200毫秒再开始采数据避免电流冲击干扰采样。第三个建议是测量前的提示和测量后的延时释放比如测量结束后保持电磁阀开启几百毫秒确保袖带完全泄气避免用户取下袖带时感到不适。这个项目做到最后你收获的不只是一台能显示血压的仪器更重要的是把嵌入式开发从传感器读取到算法处理再到外设控制的完整链路打通了。如果你用的是51单片机做第一版我非常建议做完之后换STM32再做一遍同样的功能两个平台写下来你会对硬件抽象、外设配置和代码结构有完全不一样的理解。搭建好开发环境、跑通第一版、再完成校准对比这套流程下来你已经有了独立完成一个中等复杂度嵌入式项目的能力。