
先声明一下我做的这个便携式心电检测仪属于个人健康监测和学习验证性质的硬件项目不是医疗器械不能用于临床诊断。真正要往医疗级走还得过电磁兼容、电气安全、注册检验那一整套流程那是另一个量级的工作量。但如果你只是想搞懂心电信号怎么采集、怎么处理、怎么在PCB上把微弱信号做好这套方案足够你吃透整个链路。疫情期间大家越来越关注心率、血氧这些指标便携心电ECG检测设备也跟着火了一波。我自己在做的过程里发现市面上很多现成模块方案要么太封闭要么资料太散所以干脆用NeuroSky的BMD101芯片配合立创EDA从原理图开始一路做到PCB打样把整个硬件设计流程完整走了一遍。这篇文章就把我的设计思路、踩坑经历、调试方法全部摊开来讲想让对生物电信号采集和硬件设计感兴趣的朋友少走弯路。1. 项目概述与整体设计思路1.1 需求拆解一台真正能戴出门的心电图机先说说这个项目最初的定位。我要做的不是医院那种12导联心电图机而是一个便携、低功耗、能实时看到心电波形的单导联心电检测设备用来做日常心率监测、运动前后心率变化观察以及学习心电信号处理算法。具体需求拆解下来大概是这几条体积要小最好能做成一个火柴盒大小的模块方便手持或者贴胸使用。供电要用电池最好是锂电池或者纽扣电池整体功耗要低。采集到的心电信号要有足够质量能清晰看到P波、QRS波群、T波而不是一团噪声。数据要能传出去最方便的就是蓝牙手机端直接看波形。整机成本要可控单板物料成本尽量控制在百元以内。带着这些需求去选型就会发现核心难点集中在微弱信号的采集这一环。心电信号在体表只有0.5mV到4mV左右而且混着50Hz工频干扰、肌电噪声、基线漂移要把这东西干净地采出来模拟前端的设计是重头戏。1.2 芯片选型为什么选BMD101而不是ADS1292市面上的心电采集方案其实不少TI的ADS1292被很多人用ADS1292的优点是精度高、可编程增益大、还能同时采集两路信号但问题是它只给到24位ADC和可编程放大器信号调理、滤波、特征提取这些全都得自己做对新手来说门槛偏高。我最后选的是NeuroSky的BMD101这颗芯片在可穿戴心电领域很出名核心卖点是它在内部集成了模拟前端和数字信号处理引擎。这么说吧普通的ECG方案像自己买菜做饭洗菜切菜炒菜全流程都要动手BMD101则像买了一个半成品料理包你只需要把它加热装盘——把电极信号接进来它会把滤波、放大、ADC转换、心率计算这些活全干完最后通过UART把处理好的数字心电图数据输出出来。当然BMD101也有局限比如它只有单导联没有像ADS1292那样的多路同步采集能力精度指标也不算夸张但对于便携监测和个人健康管理场景完全够用。而且它的功耗很低正常运行在毫瓦级别配合一个小锂电池就能续航很久。1.3 工具链选择立创EDA能解决整个硬件流程的问题吗原理图和PCB设计我用的是立创EDA准确说是立创EDA专业版。早些年大家画板子都用Altium Designer破解麻烦、授权贵对个人开发者非常不友好。KiCad是免费开源但刚开始用的时候光是学会怎么管理封装库和符号库就要花不少时间。立创EDA的好处在于它是国产工具全流程在线原理图、PCB、元件库、打样下单全打通。你在原理图里放一个元件BOM表里直接就能对应到嘉立创商城的物料编号PCB画完一键导出Gerber直接上传下单打样整个闭环特别顺畅。对一个人做项目的硬件工程师来说省掉太多对接的琐碎事。当然它也不是没有槽点专业版的某些快捷键逻辑和AD差异比较大刚开始用会有点别扭但熟悉之后效率并不低我后面画板子大部分时间都用它。2. BMD101核心原理与硬件外围电路设计2.1 心电信号到底有多微弱在动手画原理图之前我建议每个人都先搞清楚自己在处理什么信号。心电信号在体表是非常微弱的生物电信号幅度通常只有0.5mV到4mV频率范围主要在0.05Hz到100Hz之间主要能量集中在0.05Hz到40Hz。这里用一个生活化的类比普通音频信号的幅度是伏特级别相当于你在正常聊天时的音量心电信号是毫伏甚至微伏级别相当于一只蚊子在你耳边飞过的声音。要在这么大噪声背景下把蚊子声听清楚关键不是把喇叭声音放大而是要把噪声滤干净。实际采集过程中主要的干扰源有三个50Hz工频干扰来自市电电网通过人体和空间耦合进电极是最常见也最头疼的干扰。肌电噪声肌肉收缩产生的生物电信号频率范围在25Hz到1000Hz主要影响高频段。基线漂移因为呼吸、身体移动、电极与皮肤接触阻抗变化引起的低频漂移通常在0.5Hz以下。理解了这些干扰的特点你就能明白为什么BMD101的方案这么好用——它的内部DSP已经把这些滤波活全部做了硬件上只要保证输入信号质量足够高就行。2.2 BMD101内部到底在做什么BMD101本质上是一颗高度集成的ECG模拟前端芯片内部集成了输入放大器、相关双采样器、16位ADC、数字信号处理器和UART接口。它的工作流程大致是这样的电极从人体采集到的微弱心电信号进入芯片内部。经过前置放大器的放大后进入相关双采样级这一级主要用来消除直流偏置和低频漂移。然后通过ADC数字化送入片内DSP做滤波处理包括工频陷波、带宽滤波、基线校正等。最终输出已经处理好的数字波形数据通过UART发送出来。这里有一个细节很关键BMD101输出的已经是滤波后的数字波形而不是原始未处理的ADC值。这意味着你拿到的数据可以直接用来画波形、算心率不需要再自己写复杂的数字滤波算法。它甚至连心率都有输出不用你再做R波检测。但我要提醒一点虽然芯片替你干了大部分活硬件设计做不好垃圾进垃圾出再强的DSP也救不回来。所以外围电路的质量决定了整个项目的上限。2.3 外围电路设计要点输入保护、滤波、电极接口BMD101的外围电路不算复杂但有三个地方必须认真设计。第一是电源输入。芯片供电范围在2.97V到3.63V之间典型值是3.3V。我用了一颗低压差线性稳压器把锂电池的3.7V稳压到3.3V稳压器前后各加一个10uF和100nF的去耦电容组合确保电源纹波尽量小。电源纹波对微弱信号采集的影响是致命的如果你用示波器看到3.3V上有几十毫伏的纹波那心电波形上大概率会出现对应的周期性干扰。第二是电极输入保护。人体是静电大户尤其是在干燥环境下插拔电极时静电很容易窜进芯片输入端把芯片打坏。我在输入端加了一对低电容TVS管方向对地和对电源同时串联一个1K到10K的限流电阻。电容值要尽量小否则会和高阻电极形成低通滤波把有用信号削掉。第三是电极接口。我用了标准2.0mm间距的PH2.0插座方便外接一次性Ag/AgCl心电电极贴片。贴片电极的优点是接触阻抗低、信号质量好缺点是耗材要花钱。如果只是做原型验证也可以用不锈钢薄片加导电膏凑合。BMD101输入端还需要接偏置电阻网络来提供输入偏置电流回路具体阻值我参考了官方参考设计用的是M欧姆级别的电阻。这里别自作聪明去改参数输入偏置出了问题波形飘得你怀疑人生。2.4 数据输出与整体系统架构BMD101的数据接口是标准的UART默认波特率9600可以通过配置命令改成更高速度。它输出的数据帧格式带同步字和数据长度字段还有16位校验码接收端可以根据校验码判断这一帧数据是否完整。整个系统的架构搭起来就是这样的链路人体 - Ag/AgCl电极 - 输入保护电路 - BMD101 - MCU - 蓝牙模块 - 手机APP这里的MCU我用了一颗低成本的8051内核单片机它的任务很简单通过串口接收BMD101发送的心电数据帧解析出波形数据和心率值然后通过另一个串口转发给蓝牙模块。如果你不想用单片机直接把BMD101的UART接到USB转TTL串口模块也能在电脑上看到数据但蓝牙传输和OLED显示这些功能就得靠MCU来完成。这里有一个细节容易被忽略BMD101的UART电平是3.3V TTL蓝牙模块通常也是3.3V电平两者可以直接对接。但如果你的MCU是5V供电的51单片机串口引脚输出5V电平会超过BMD101的输入电压上限轻则数据乱码重则损坏芯片。这种情况必须加电平转换电路最简单的做法是串一个1K电阻分压或者直接用两颗MOS管做双向电平转换。电源方面我选了一节3.7V锂电池通过LDO稳压到3.3V给整个系统供电。BMD101加MCU加蓝牙模块的整机功耗大约在30mA到50mA配一个300mAh的小电池可以连续工作六七个小时做便携设备完全够了。2.5 低功耗设计的细节考量既然是便携设备低功耗就得认真对待。BMD101本身有低功耗模式可以通过UART命令进入和退出待机电流在微安级别测量模式在毫瓦级别。MCU也要选择带多种低功耗模式型号如果在数据不需要传输时进入睡眠整体功耗还能进一步降低。蓝牙模块的选择也要注意功耗差异。传统蓝牙2.0模块比如HC-05、HC-06便宜但功耗高BLE4.0以上的低功耗蓝牙模块比如HM-10更适合电池供电场景。最后考虑成本和调试方便程度我用的是HC-06后期如果想优化续航再换成BLE模块。3. 立创EDA实操从新建工程到PCB打样3.1 新建工程与元件库准备前面讲完了理论部分现在进入实战环节。先说立创EDA的选型立创EDA有标准版和专业版两个版本。标准版在浏览器里跑上手快但复杂项目会卡专业版是独立客户端功能更强图层管理、布线引擎、规则设置都更接近专业工具。我推荐直接用专业版虽然学习成本稍高但后面做更复杂的项目不用再迁移。新建工程后第一步是准备元件库。立创EDA自带的元件库已经相当齐全BMD101、稳压器LDO、MCU、蓝牙模块、电极插座这些都能直接搜到。有两点要注意搜索型号时尽量用完整型号比如搜BMD101直接找立创商城封装一般自带引脚定义和原理图符号。如果某个元件在库里没有可以用快速创建符号功能自己画花五分钟就能搞定。BMD101如果买不到原厂封装立创EDA里会有对应的封装库直接添加进工程就行。检查一下封装上的焊盘间距打印出来对比实物再下单打样是我一开始被坑过的地方——封装画错一毫米整块板子就废了。3.2 原理图设计模块化分块思考原理图我习惯按功能模块分块画每个模块一个区域这样不仅自己看着清楚后续排查问题也方便。我的原理图分成四个部分电源模块锂电池接口、电源开关、LDO稳压、去耦电容、电源指示灯。BMD101核心模块芯片本体、输入保护电路、电极接口、旁路电容、UART输出。MCU模块芯片最小系统、晶振、复位电路、串口引脚、LED指示。蓝牙模块接口蓝牙模块引脚定义、电源去耦、串口连接。原理图连线的时候有一个原则要牢记模拟信号线和数字信号线尽量不要平行走如果非要交叉就在原理图上用网络标签连接避免信号间的串扰。电源线和地线在原理图上先不细分等画PCB时再统一处理。画完整个原理图之后一定要跑一遍电气规则检查。立创EDA的ERC功能会帮你检查有没有遗漏的连线、引脚是否错误、电源和地是否正确连接。我见过很多新手看到一大片绿色报错就直接忽略这种做法很危险有时候一个未连接的Net就会导致整块板子不工作。3.3 PCB布局布线星型接地是整个项目成败的关键原理图画完只是个开始真正决定这块板子能不能用的是PCB布局布线。BMD101是模拟信号处理芯片对布局布线的敏感度非常高如果没有做好接地设计波形会被噪声淹没得连QRS波都找不着。布局方面我遵循了两个原则。第一个原则是物理分区。把电源、数字、模拟三部分分开布局BMD101所在的模拟区域和蓝牙模块所在RF区域要保持足够距离避免数字噪声耦合进模拟前端。第二个原则是发热元件远离模拟电路虽然整个板子功耗很低发热不大但这个习惯还是值得养成。布线方面最核心的技术要点就是星型接地。这里我仔细讲一下什么叫星型接地为什么它对模拟电路如此重要。星型接地又叫单点接地指整个PCB上所有电路的地线最终都汇聚到唯一一个公共参考点形状像一颗星星的放射线。对于模拟和数字混合电路模拟电路的地和数字电路的地分开走线最后在电源入口处汇合一次。这样可以避免数字电路快速开关产生的大电流在公共地线阻抗上形成压降这个压降会直接叠加到模拟信号上形成噪声。有的朋友可能认为把整块板子都铺满铜地所有地都连在一起就万事大吉我一开始也这么干过。结果就是地线到处是回路模拟地和数字地互相串扰心电波形上的50Hz噪声根本压不下去。后来改成星型接地波形瞬间干净了很多。具体操作上我在BMD101的模拟地附近挖了一个独立的模拟地岛用一根单独的走线连到总电源地MCU、蓝牙模块的数字地通过另一根走线连到总电源地电源电容的地也单独汇总。整个板子就一个地过孔矩阵附近作为唯一汇合点。布线时还要注意几点电源走线尽量宽至少20mil以上信号线尽量短尤其是BMD101到电极接口的输入线越短越好BMD101底下尽量不要走数字信号线。如果你的板子面积允许可以把模拟输入区域用保护环围一圈接模拟地进一步隔离外部干扰。3.4 铺铜、DRC检查与下单打样布线完成后顶层和底层还需要铺地铜。这里有一个常见的疑问既然前面说星型接地为什么还要整板铺铜答案是把整板铺铜作为静电屏蔽和回流参考平面但要注意模拟地岛和数字地岛要保持分开最后单点汇合这跟整板连成一片的铺法是有本质区别的。铺铜完成后跑DRC检查。检查项包括线距、线宽、过孔尺寸、未连接引脚、丝印重叠等。立创EDA的DRC规则可以自定义线的最小间距设为6mil最小线宽设为10mil过孔内外径分别设为0.6mm/0.3mm这是嘉立创常规工艺支持的范围。检查无误后在PCB界面导出Gerber文件再到嘉立创下单页面提交选好板厚、铜厚、颜色基本五天就能收到板子。加上顺丰快递从画完到拿到板子一周左右。4. 硬件调试与信号质量优化4.1 上电检查先别急着看波形板子焊好之后先不要直接上电测信号那样出了问题很难排查。我习惯按照先电源、再静态、后动态的顺序来调试。先用万用表测量电源入口是否短路确认没有短路后上电测量LDO输出电压是否为3.3V同时用示波器看电源纹波纹波最好控制在50mV以内。接着测量BMD101供电引脚的电压确认芯片确实有电。然后是静态检查用放大镜或者手机微距拍摄看一下有没有虚焊、连锡的情况。BMD101是QFN封装引脚间距很小焊接时很容易连锡可以用助焊剂和烙铁拖焊大法或者干脆用热风枪吹上去。4.2 用串口看数据BMD101有没有在干活上电正常之后把BMD101的UART输出连接到USB转TTL模块打开串口调试助手波特率设为9600。然后找两个心电电极贴片贴在左右手腕内侧把电极线接上模块你应该能在串口助手里看到一直在刷的十六进制数据帧。看到数据帧说明BMD101已经在正常工作了。这时候不要急着去解析数据先把数据用串口记录下来存成文件再用Python脚本解析把波形画出来看。这一步能直观看到信号质量到底怎么样。我在调试时用的是Python的matplotlib库串口记录的数据通过解析BMD101的数据帧格式提取出波形数值直接用plot函数画出来。第一次成功看到自己的心电波形时那种感觉还是挺奇妙的一个完整的PQRST波群清清楚楚呈现在屏幕上。4.3 信号质量优化和噪声的斗争如果你的波形像一团乱麻不要慌这是初学者最常见的情况。我整理了一套排查顺序按这个顺序查能解决大部分问题。先看电极接触。皮肤和电极一定要保持良好接触如果用的是干电极可以在皮肤上稍微涂一点导电膏或者用酒精棉片擦拭皮肤去油脂。电极线接触不良会导致典型的50Hz工频干扰波形上全是细密的锯齿状毛刺。再看供电电源。如果整机用USB供电调试适配器电源本身就有很大纹波会直接传导到模拟前端。改用锂电池供电或者用线性稳压电源波形会立刻干净不少。我调试时发现USB电源适配器和直接锂电池供电波形噪声完全是两个级别。最后检查接地环路。如果蓝牙模块、USB转串口模块、电脑之间形成了地环路50Hz干扰会特别严重。最有效的办法是在串口通信线串联一个小磁环或者几十欧姆的电阻断开环路。4.4 通过UART配置命令调节BMD101BMD101支持通过UART命令配置工作参数比较常用的是修改采样率和进入低功耗模式。采样率默认512Hz对于观察QRS波群完全够用如果你想把波形画得更平滑可以配置到1024Hz。但采样率提高也意味着数据量增大MCU处理和蓝牙传输的压力也会增加。配置命令的具体格式在数据手册里有我这里不重复每一个字节的含义只提醒一点发送配置命令之前一定要先确认芯片已经完成初始化否则命令会被忽略。我一开始发命令经常不生效后来发现是上电后等待时间不够芯片还没准备好就发命令了。4.5 加上MCU转发和OLED显示调试好BMD101之后就可以把MCU加进链路里了。MCU的核心逻辑就是初始化两个串口一个串口接收BMD101的数据另一个串口把数据转发给蓝牙模块。与此同时解析出心率值发送到一块0.96寸OLED屏幕显示。需要特别注意的是MCU串口接收数据时要用中断方式不能在主循环里polling接收否则高频率的串口数据会丢失。BMD101的默认采样率是512Hz每秒钟输出的数据帧还不少主循环如果还要刷OLED很容易丢帧。我最后把串口接收放在了中断里接收缓存开的足够大才算把这问题解决。5. 常见问题与排查技巧实录调试过程中踩坑无数我把最有代表性的问题整理成一个速查表方便大家直接对照排查。现象可能原因排查方法串口完全无数据输出BMD101供电异常、芯片虚焊、UART引脚连接错误先量电源电压再检查芯片焊接最后用示波器看UART TX引脚有没有波形波形全是大锯齿状毛刺电极接触不良、电源纹波过大、地环路检查电极和皮肤接触换电池供电断开USB地环路波形基线严重漂移电极与皮肤接触阻抗不稳定、输入偏置电阻异常清洁皮肤用导电膏检查输入回路电阻波形很平看不到QRS波电极位置不对、输入信号太弱、增益设置不当把电极贴到左右手腕内侧或胸口检查信号输入是否正常数据帧校验总是失败波特率不匹配、串口线太长、电平不匹配确认波特率检查线路长度加电平转换电路蓝牙连接不上蓝牙模块未配对、波特率不匹配、供电不足查看蓝牙模块指示灯检查串口波特率测量模块供电电流心率数值明显不准运动干扰太大、电极位置移动、滤波参数不合适静止状态下测试重新紧贴电极检查原始波形质量除了表格里的问题我再分享几个不太容易被想到的坑。第一个坑是串口调试工具自身的问题。有的USB转TTL模块质量很差输出电平不稳定会导致数据错乱。换一个用CP2102或者CH340芯片的模块一般能解决。第二个坑是不要过度相信手指按压电极的方式。因为手指按压力度不可能恒定接触阻抗一直变化波形质量会很差。最可靠的方式还是用一次性心电电极贴片贴到胸前或者手腕内侧加绑带固定。第三个坑是电池电压对信号质量的影响。锂电池从满电4.2V放到3.0VLDO输出电压是恒定的3.3V但因为电池内阻和LDO压差问题电池快没电时电源纹波会明显变大导致信号质量恶化。所以如果波形突然变差先查一下电池电量。6. 后续扩展方向与个人体会6.1 这个项目还能怎么升级硬件验证跑通之后可扩展的方向其实很多。最直接的是把板子缩小BMD101加MCU加蓝牙模块加电池四个主要部分可以通过核心板加扩展板的方式做成多层板体积可以做到比一枚硬币大不了多少。蓝牙部分可以升级成BLE5.0模块进一步降低功耗延长电池续航。手机端用官方SDK或者自己写一个简单的ANCS蓝牙透传APP配合低功耗蓝牙在后台实时接收数据显示波形和心率基本就是一个可穿戴心电手环的原型了。算法层面BMD101虽然直接输出了心率但心电信号的分析远不止心率一个指标。把波形数据拿到PC端做RR间期分析、心率变异性计算可以做疲劳监测、压力评估这类更有价值的应用。6.2 我个人实际操作中的几点体会做这个项目最大的收获不是看到自己的心电波形那一刻的兴奋而是对整个微弱信号采集链路有了真切的理解。以前看书上说模拟地和数字地要单点接地总感觉是玄学但真把自己画的板子焊出来、测数据、对比优化前后波形才知道每一个设计规则的背后都有实打实的物理原因。如果让我给刚入坑硬件设计的朋友提建议第一点是不要怕画板子第一版板子有各种问题太正常了改版本来就是硬件设计的一部分。第二点是立创EDA虽然免费但功能并不弱用它完成从原理图到PCB到打样的全流程对个人开发者的效率提升非常明显。第三点是BMD101这个方案特别适合想入门生物电信号采集的人因为它的集成度帮你屏蔽掉了不少太难的前端设计细节让你先跑通全链路再回头补理论。最后分享一个小技巧调试BMD101时先把整机功耗测出来记下来后续每次改动只要对比功耗变化就能快速判断电路是否异常。我靠这个办法排查出好几次电容短路和芯片没完全进入低功耗模式的问题实测下来比单纯量电压靠谱很多。