拓冰建站拓冰建站
首页 / 资讯中心 / 正文

心电采集系统全栈实现:从硬件电路到C语言算法的完整工程解析

简介本资源是一套完整的心电采集系统开发套件面向电子工程师、医疗设备开发者及嵌入式爱好者解决从硬件设计到软件实现的全流程开发需求。压缩包共111个文件包含Altium Designer格式的PCB工程与原理图.pcbdoc、.schdoc、C语言编写的单片机控制程序.c/.h文件、上位机通信与数据显示源码、以及整机结构与电源管理等系统级设计资料其中.c/.h文件构成核心嵌入式逻辑.pcbdoc与.schdoc支持直接编辑与复用.hex/.bin为可烧录固件整体2.98MB便于快速部署学习。已有637人下载学习资源覆盖信号调理电路设计、AD采样配置、数字滤波算法实现、USB/UART通信协议处理等关键环节目录结构清晰含MKL25Z4系列MCU专用启动文件system_MKL25Z4.c、串口驱动MKL_uart.c及USB底层模块usb.c具备强工程落地性与教学参考价值。1. 项目概述从零到一的心电采集系统全栈实现最近在整理过往的项目资料翻出了一个压箱底的“宝贝”——一个完整的单导联心电采集系统项目包。这个项目包很有意思它不是一个简单的代码片段或者原理图而是一个从硬件到软件、从设计到生产的完整工程集合文件名叫“心电采集 ,PCB工程原理图,硬件电路,源程序C语言,整机方案.zip”。这个名字本身就透露着一种“硬核”和“完整”的气息包含了PCB工程文件、原理图、硬件电路设计、用C语言编写的源程序以及整机装配方案。对于想深入理解生物电信号采集尤其是心电信号采集全流程的硬件工程师、嵌入式开发者或者生物医学工程专业的学生来说这无疑是一个绝佳的学习和参考案例。心电信号是人体最重要的生理信号之一其幅度微弱通常为0.5-5mV频率低0.05-100Hz且极易受到工频干扰、肌电干扰、基线漂移等噪声的影响。因此一个可靠的心电采集系统远不止是“放大信号”那么简单。它需要前端模拟电路进行高精度、高共模抑制比的放大与滤波需要模数转换器进行精准采样需要微控制器进行数字信号处理与算法实现还需要严谨的PCB布局布线来保障信号完整性最后通过整机结构设计来确保使用的安全与舒适。这个项目包恰恰覆盖了所有这些环节。接下来我将以这个项目包为蓝本结合我多年的硬件开发经验为你深度拆解一个心电采集系统的完整实现路径分享其中的核心设计思想、关键参数计算、以及那些在数据手册和教科书里不会写的“踩坑”经验。2. 硬件电路设计微弱信号放大的艺术与挑战心电采集硬件电路的核心任务是将微伏级的心电信号从强噪声背景中“干净”地提取出来并放大到适合模数转换器采样的电平。这通常由一个多级放大滤波电路完成。2.1 前置放大与右腿驱动电路共模抑制是关键第一级也是最重要的一级是仪表放大器构成的前置放大级。这里不能使用普通的运放必须选择高输入阻抗、低偏置电流、低噪声、高共模抑制比的仪表放大器。项目中很可能使用了像AD620、INA128或AD8221这类经典芯片。这一级的增益不宜过高通常设置在10倍左右主要目的是在不引入过大噪声的前提下初步提升信号电平并利用其极高的共模抑制比初步抑制50/60Hz的工频干扰。注意仪表放大器的共模抑制比会随着增益升高而下降数据手册给出的典型值往往是在特定增益下测得的。在实际布线中如果反馈电阻不匹配会严重劣化实际的CMRR。因此务必使用高精度、低温漂的电阻并且PCB上这部分的走线要尽可能对称。紧随其后的是右腿驱动电路。这是一个非常巧妙且必要的设计。人体的体表可以看作一个接收各种电磁干扰的天线这些干扰以共模信号的形式同时出现在所有采集电极上。右腿驱动电路通过一个运放将采集到的共模信号反相放大后通过一个限流电阻反馈到人体的右腿参考电极上形成一个负反馈环路。这个环路的作用是主动将人体的共模电压“钳位”到系统地从而极大地增强系统对工频等共模干扰的抑制能力。反馈电阻和电容的取值需要仔细计算以确保环路稳定不会产生振荡。2.2 高通滤波与主放大级隔离直流与提升增益经过前置放大后信号中仍然包含由电极-皮肤接触电位差引起的缓慢变化的直流偏移可达几百毫伏这被称为基线漂移。一个截止频率在0.05Hz到0.5Hz的高通滤波器通常是一阶或二阶有源滤波必须被引入以隔除这些直流和极低频成分防止后续电路饱和。这个滤波器的设计需要权衡截止频率过低漂移滤除不干净过高则会损失心电信号中有用的低频成分如ST段。滤除直流漂移后信号进入主放大级。这一级通常由一到两级同相或反相放大电路构成将信号放大到ADC的满量程范围附近例如将0.5-5mV的心电信号放大到0-3.3V。总增益的计算需要从前到后统筹假设ADC参考电压为3.3V需要测量的最大心电信号为5mV考虑到一定的裕量总电压增益大约需要500-600倍。前置级10倍主放大级就需要50-60倍。增益分配的原则是将大部分增益放在噪声较低的后期。2.3 低通滤波与抗混叠滤波为数字化做好准备放大后的信号必须经过低通滤波。这里有两个目的一是限制信号带宽滤除高频噪声如肌电干扰、射频干扰二是作为抗混叠滤波器防止高于奈奎斯特频率采样频率的一半的信号混叠到有效频带内。对于心电信号上限频率通常设为100-150Hz就足够了。一个截止频率在100Hz左右的二阶或四阶巴特沃斯低通滤波器是常见选择因为它能提供较平坦的通带和足够的阻带衰减。至此模拟信号调理链路完成。一个典型的链路可能是输入保护 - 仪表放大器 (G10) - 高通滤波器 (fc0.5Hz) - 主放大器 (G50) - 低通滤波器 (fc100Hz) - 输出驱动/电平移位。项目中原理图里的每一个电阻、电容值都承载着上述的频响与增益设计思想。3. PCB设计要点当模拟微弱信号遇见数字噪声心电采集板的PCB设计是决定项目成败的“隐形战场”。糟糕的布局布线会让再优秀的电路设计功亏一篑。3.1 电源与地平面处理隔离与退耦的艺术首先必须将模拟部分和数字部分微控制器、数字接口的电源完全隔离。使用磁珠或0欧电阻将模拟电源和数字电源在单点连接。模拟地和数字地也同样处理采用“单点接地”或“分区接地”策略避免数字地线上的噪声电流污染敏感的模拟地。在芯片的每个电源引脚附近都必须放置退耦电容。通常是一个10uF的钽电容或电解电容搭配一个0.1uF的陶瓷电容。大电容负责低频段储能小电容负责提供高频电流并抑制电源线上的尖峰噪声。这些电容必须尽可能靠近芯片引脚过孔要直接打在电容焊盘和电源/地平面之间回路面积要最小化。3.2 模拟信号走线规则像保护艺术品一样对于心电输入信号线必须视为“神圣不可侵犯”。要采用差分走线并严格等长、等距、平行紧靠走在完整的模拟地平面之上。这能最大化利用差分信号的共模抑制能力。绝对要避免输入信号线跨过电源分割槽或数字区域也要远离时钟线、高速数据线等噪声源。仪表放大器周围的电阻网络其对称性至关重要。在布局上这几个电阻应紧靠放大器放置并且采用对称的布局和完全相同的走线长度与宽度以保持寄生参数一致。反馈路径要短而直接。3.3 层叠设计与Gerber输出对于这类混合信号板至少需要4层板顶层信号/元件、电源层、地层、底层信号。完整的电源和地平面能为高频信号提供低阻抗回流路径并起到良好的屏蔽作用。在项目中提供的Gerber文件里你可以清晰地看到各层的铜皮分布、走线宽度、安全间距等信息。通过Gerber文件转PCB文件工具虽然通常不可逆但有些高级软件可以尝试导入可以学习原设计者的布局思路。实操心得在投板前务必用DRC设计规则检查和ERC电气规则检查功能彻底检查一遍。特别是要检查模拟地和数字地的连接点是否唯一电源网络是否有未连接的引脚以及所有封装的引脚顺序是否正确。我曾因为一个运放封装引脚顺序画反原理图符号和PCB封装不对应导致整批板子需要飞线修改损失惨重。4. 微控制器与C语言程序架构硬件将模拟心电信号转换为电压而软件则负责将其数字化并提取出有价值的信息。项目中的源程序通常围绕一颗微控制器展开比如STM32F103系列。4.1 ADC采样与数据缓冲区管理程序的第一步是配置ADC。对于心电信号采样率通常设置在250Hz到500Hz之间就足够了满足奈奎斯特定理。需要配置ADC为连续扫描模式并使用DMA将采样数据直接搬运到内存中的环形缓冲区。这样可以解放CPU避免因频繁进入中断而影响其他任务。C语言程序中会定义一个足够大的数组作为环形缓冲区。DMA的写指针和应用程序的读指针需要小心地同步访问通常通过关中断或使用原子操作来防止冲突。数据流的稳定是后续所有处理的基础。#define ECG_BUFFER_SIZE 1024 volatile uint16_t ecg_raw_buffer[ECG_BUFFER_SIZE]; volatile uint32_t dma_write_index 0; uint32_t app_read_index 0; // 在DMA半传输/传输完成中断中更新 dma_write_index void DMA1_Channel1_IRQHandler(void) { if(DMA_GetITStatus(DMA1_IT_HT1)) { dma_write_index ECG_BUFFER_SIZE / 2; DMA_ClearITPendingBit(DMA1_IT_HT1); } if(DMA_GetITStatus(DMA1_IT_TC1)) { dma_write_index ECG_BUFFER_SIZE; DMA_ClearITPendingBit(DMA1_IT_TC1); } } // 应用程序中安全读取数据 int get_ecg_samples(int16_t *output, int requested_len) { uint32_t current_write; int available; // 短暂关中断或使用原子操作获取瞬时写指针 __disable_irq(); current_write dma_write_index; __enable_irq(); // 计算可读数据量处理环形缓冲区折返 if(current_write app_read_index) { available current_write - app_read_index; } else { available (ECG_BUFFER_SIZE - app_read_index) current_write; } available (available requested_len) ? requested_len : available; // ... 拷贝数据到output更新app_read_index ... return available; }4.2 数字滤波算法的C语言实现尽管模拟电路已经做了滤波数字域仍需进一步处理以提升信号质量。最常见的包括工频陷波采用自适应滤波或固定系数的50Hz/60Hz陷波器进一步消除电源干扰。一个二阶IIR陷波器是常用且高效的选择。基线漂移校正虽然模拟高通滤波已处理大部分但数字域可以做得更精细。可以采用移动平均或中值滤波来估计动态基线然后从原始信号中减去。低通平滑一个截止频率稍低于模拟低通滤波器的数字低通滤波器可以进一步平滑信号。这些滤波器的实现需要特别注意定点运算的精度和溢出问题。对于没有硬件浮点单元的MCU通常使用Q格式定点数运算。// 一个简单的移动平均滤波器实现用于基线估计 #define BASELINE_WINDOW 50 // 对应约0.2秒250Hz采样率 int32_t baseline_buffer[BASELINE_WINDOW]; int baseline_index 0; int32_t baseline_sum 0; int32_t update_baseline(int32_t new_sample) { // 减去即将被移出的旧值加上新值 baseline_sum baseline_sum - baseline_buffer[baseline_index] new_sample; baseline_buffer[baseline_index] new_sample; baseline_index (baseline_index 1) % BASELINE_WINDOW; // 返回当前基线估计值平均值 return baseline_sum / BASELINE_WINDOW; }4.3 QRS波检测与心率计算算法这是心电处理算法的核心。经典的算法如Pan-Tompkins算法在嵌入式资源受限环境下依然非常有效。它通过一系列带通滤波、微分、平方、移动窗口积分等步骤将QRS复合波心电图中最高大的波群增强而抑制P波、T波和其他噪声。在C语言中实现该算法需要仔细优化每个步骤避免浮点运算使用查表法代替乘除。算法输出每个QRS波的位置R峰点两个R峰之间的间隔就是RR间期由此可以计算瞬时心率60 / RR间期(秒)。// 简化的R峰检测状态机概念示例 typedef struct { int threshold; int peak_value; int last_sample; int rising_edge; int peak_count; } QRS_Detector; int detect_qrs(QRS_Detector *det, int filtered_sample) { // 简单的阈值比较法实际中要复杂得多 if (filtered_sample det-threshold det-last_sample det-threshold) { // 检测到上升沿 det-rising_edge 1; det-peak_value filtered_sample; } else if (det-rising_edge filtered_sample det-last_sample) { // 上升后首次出现下降认为是峰值点 det-rising_edge 0; if (det-peak_value det-threshold * 1.5) { // 确认是有效峰值 det-threshold 0.875 * det-threshold 0.125 * det-peak_value; // 动态更新阈值 return 1; // 返回检测到R峰 } } else if (det-rising_edge filtered_sample det-peak_value) { // 更新峰值 det-peak_value filtered_sample; } det-last_sample filtered_sample; return 0; }程序架构上通常会采用一个主循环里面顺序调用数据获取、数字滤波、QRS检测、心率计算和数据发送到串口、蓝牙或屏幕等函数模块。良好的模块化设计便于调试和功能扩展。5. 整机集成与测试验证当PCB板焊接完毕程序也烧录成功后并不意味着项目结束。整机集成与系统级测试是确保产品可靠性的最后一道关卡。5.1 结构设计与电极连接心电采集设备需要与人体皮肤接触因此结构设计必须考虑安全、舒适和电气隔离。通常采用塑料外壳内部PCB板需要良好固定避免振动。电极连接器通常是 snap connector要可靠线缆要柔软且带有屏蔽层屏蔽层单端接设备地。导联线本身是引入干扰的重要途径。使用屏蔽线并将屏蔽层在设备端良好接地能有效抑制辐射干扰。电极的选择也很关键一次性氯化银电极具有阻抗低、极化电压小的优点是医疗测量的首选。5.2 系统上电测试与故障排查首次上电必须谨慎。建议按以下步骤空载检查不接电极用万用表测量各关键点电压运放电源、参考电压、输出静态电平是否正常。信号注入测试使用函数发生器模拟一个0.5Hz-100Hz幅度几毫伏的正弦波从输入端注入。用示波器逐级观察波形验证增益和滤波特性是否符合设计。这是检验模拟链路是否正常工作的最直接方法。共模抑制比测试在输入端注入一个较大的共模信号例如1Vpp 50Hz测量输出端该信号的幅度。计算CMRR 20 * log10(共模输入电压 / 共模输出电压) 差分增益(dB)。一个合格的心电前置放大器CMRR至少应达到80dB以上。噪声测试将输入端短路到地通过一个模拟皮肤阻抗的电阻网络如51kΩ电阻并联47nF电容用示波器或ADC采集输出观察本底噪声。折算到输入端噪声应控制在几个微伏以内。5.3 真人实测与算法调优最后也是最关键的一步是进行真人实测。让测试者静坐连接好电极通常为右手-左手-右腿三导联开始采集。你会立刻面临真实世界的挑战基线漂移随着呼吸和身体微动基线会缓慢起伏。需要观察数字基线校正算法的效果必要时调整参数。工频干扰尽管有硬件和软件滤波50Hz干扰可能依然可见。检查接地是否良好设备是否远离强电线路右腿驱动电路是否工作。运动伪影测试者轻微移动手臂会导致巨大的突发噪声。这需要在QRS检测算法中增加抗干扰逻辑例如在检测到异常大幅度信号时暂时提高检测阈值或标记该段数据无效。心率计算稳定性观察实时计算出的心率值是否稳定在噪声干扰下是否会出现跳变。可能需要引入心率平滑算法如对连续多个RR间期取中值或平均值。在这个阶段需要反复调整软件中的滤波器参数、检测阈值和逻辑直到在大多数使用场景下都能稳定、准确地检测出心率。这个过程没有捷径需要大量的数据积累和耐心调试。6. 从工程文件到产品化的思考这个项目包提供了一个绝佳的起点但要从一个实验室工程走向一个可靠的产品还有很长的路要走。电磁兼容与安规认证如果作为医疗器械或健康设备销售必须通过严格的EMC电磁兼容测试和安规认证如IEC 60601-1。这意味着需要在设计之初就考虑ESD静电防护、浪涌防护、辐射发射与抗扰度等。PCB上可能需要添加TVS管、气体放电管、共模电感等保护器件结构上可能需要金属屏蔽罩。低功耗设计对于便携式或可穿戴设备功耗至关重要。可以选用低功耗运放和MCU优化采样率和处理算法在无信号时让MCU进入休眠模式通过硬件中断唤醒。用户交互与数据呈现增加OLED显示屏实时显示心电波形和心率添加蓝牙模块将数据发送到手机APP进行更复杂的分析和记录。这些都会增加软件的复杂度和功耗需要权衡。生产与测试批量生产时需要制作治具对每一块板进行快速的功能测试例如通过治具注入标准心电信号检验输出是否在允许误差范围内。回过头来看这个“心电采集 ,PCB工程原理图,硬件电路,源程序C语言,整机方案.zip”它不仅仅是一堆文件更是一个完整的知识载体涵盖了模拟电路设计、数字信号处理、嵌入式编程和系统集成等多个领域的交叉知识。通过亲手复现、调试甚至改进这样一个项目你对生物信号采集系统的理解将会从书本上的公式跃升为实实在在的工程经验。无论你是想入门生物医学电子还是希望巩固自己的硬件系统设计能力这都是一次极具价值的实践旅程。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门