基于MSP430的心率监测系统:嵌入式DSP与低功耗设计实战

1. 项目概述与核心价值

如果你对嵌入式系统、生物电信号处理或者DIY医疗电子设备感兴趣,那么基于MSP430FG439的心率与心电图监测系统绝对是一个值得深入研究的经典项目。这个项目本质上是一个微型的、电池供电的生物电信号采集与分析平台,它能够从人体体表拾取微弱的心电信号,经过放大、滤波和数字处理后,实时计算出心率并显示在LCD上,甚至可以通过串口将心电图波形发送到电脑上显示。

为什么说它经典且有价值?首先,它完整地呈现了一个生物电信号处理系统的全貌,从最前端的模拟信号调理(用到了仪表放大器、运放),到中间的模数转换(ADC),再到核心的数字信号处理(FIR滤波、QRS波检测算法),最后到结果输出(LCD显示、串口通信)。这几乎是一个教科书式的信号链案例。其次,它基于MSP430FG439这款超低功耗微控制器,完美诠释了如何在资源受限的嵌入式环境中,通过巧妙的算法和硬件设计,实现复杂的实时信号处理任务。整个系统仅用一颗CR2032纽扣电池供电,代码量控制在4KB以内,CPU占用率约1 MIPS,这种极致的优化思路对于开发任何便携式、低功耗设备都具有极高的参考价值。无论是学生用于学习嵌入式DSP,还是工程师用于开发可穿戴健康设备的原型,这个项目都能提供从理论到实践的扎实指导。

2. 系统整体设计与核心思路拆解

2.1 系统架构与信号流

整个系统的设计思路非常清晰,遵循了生物电信号处理的典型流程:采集 -> 放大 -> 滤波 -> 数字化 -> 算法处理 -> 输出。其核心目标是从噪声中提取出幅度仅约1mV的心电信号,并从中准确识别出代表每次心跳的QRS波,进而计算心率。

信号的具体流向是这样的:两个体表电极(通常是左右手)拾取的差分心电信号,首先送入INA321仪表放大器进行初步放大(5倍)。这一步的关键在于利用仪表放大器极高的共模抑制比(CMRR)来抑制人体作为“天线”接收到的50/60Hz工频等共模噪声。放大后的信号进入MSP430FG439片上的运算放大器OA0,进行第二级放大,两级总增益达到500倍。随后,信号通过一个由电阻电容构成的无源低通滤波器(截止频率约34Hz),起到抗混叠和进一步滤除高频噪声的作用。处理后的模拟信号被片内ADC12模块以512Hz的采样率数字化。数字化的样本首先经过一个17阶的低通FIR滤波器(截止频率6Hz)以滤除残留的工频噪声,然后经过一个17阶的高通FIR滤波器(截止频率2Hz)来突出QRS波的快速变化部分。处理后的信号通过与固定阈值比较,检测出QRS波的位置。系统通过统计连续三个QRS波之间的时间间隔,计算出平均心率,并显示在LCD上。同时,滤波后的原始EKG波形数据可以通过片内DAC0还原为模拟信号输出,或者通过UART以115.2kbps的速率发送到PC端用软件显示。

2.2 关键设计决策与背后的考量

为什么选择MSP430FG439?这并非随意选择。FG439是MSP430F4xx系列中的一员,其核心优势在于高度集成和超低功耗。对于这个项目而言,它提供了几个至关重要的片上外设:1.三个运算放大器(OA0, OA1, OA2):可以直接用于构建模拟信号调理电路,无需外置运放,简化了设计,降低了功耗和成本。2.12位ADC(ADC12)和两个12位DAC(DAC12):满足了心电信号采集和重建输出的精度需求。3.充足的Flash和RAM:足以容纳复杂的FIR滤波算法和心率计算程序。4.极低的运行功耗:确保系统能够依靠纽扣电池长时间工作。这些特性使得单一芯片就能完成从模拟前端到数字处理再到输出的绝大部分功能,体现了“片上系统”的设计理念。

为什么采样率定为512Hz?这是一个基于信号特征和奈奎斯特定理的工程权衡。心电信号中变化最快的部分是QRS波群,其持续时间大约在20-40毫秒。为了准确地数字化这个波形,避免失真,采样率必须足够高。根据奈奎斯特定理,采样率至少需要是信号最高频率分量的两倍。心电信号的有效频率成分一般低于100Hz,但为了保留更多细节,通常临床设备采样率在250Hz到500Hz甚至更高。这里选择512Hz,采样周期约为1.95ms,意味着在一个典型的20ms宽的QRS波上可以采集到超过10个样本点,这足以精确描绘其形状,为后续的QRS检测算法提供了可靠的数据基础。同时,512Hz对于MSP430来说也是一个容易产生的频率(可以由32.768kHz的时钟方便地分频得到),且不会给CPU带来过重的处理负担。

为什么采用FIR滤波器而非IIR滤波器?在数字滤波器的选择上,项目采用了有限脉冲响应滤波器。这主要基于FIR滤波器的几个突出优点:1.线性相位:这是最关键的一点。线性相位意味着滤波器对所有频率成分的延迟是相同的,不会导致波形失真。对于心电信号这种诊断性波形,保持波形的形状(特别是各波形的相对位置和形态)至关重要,IIR滤波器的非线性相位可能会扭曲P波、T波等。2.绝对稳定:FIR滤波器没有反馈回路,其极点全部位于原点,因此永远是稳定的,没有IIR滤波器可能存在的潜在不稳定风险。3.易于实现:虽然要达到相同的滤波效果,FIR滤波器通常需要更高的阶数(更多抽头),从而带来更大的计算量,但得益于MSP430的硬件乘法器和优化的汇编乘法子程序,以及滤波器系数的对称性(可减少近一半乘法运算),实时处理17阶的FIR滤波器是可行的。这种在计算资源和信号保真度之间的取舍,在这个项目中是明智的。

3. 硬件电路设计与核心细节解析

3.1 模拟前端放大电路:从噪声中提取微伏信号

模拟前端是整个系统成败的第一关。心电信号极其微弱(约1mV),且淹没在强大的环境噪声中,尤其是50/60Hz的工频干扰,其幅度可能远大于心电信号本身。因此,前端电路的设计核心是高增益、高共模抑制比和低噪声

第一级:仪表放大器(INA321)项目选用INA321作为第一级放大,这是一个精妙的决策。INA321是一款微功耗、单电源供电的仪表放大器。其电路连接如图所示,两个电极信号分别通过100kΩ和2MΩ的电阻网络进入INA321的输入端。这里的2MΩ电阻与芯片内部反馈网络共同决定了增益。INA321在此处提供固定的5倍增益。为什么第一级增益不高?因为过高的增益会同时放大噪声,并可能使后续电路因直流偏移而饱和。5倍的增益是一个稳健的起点,它先将信号提升到一个更容易处理的水平,同时依靠其高达94dB的共模抑制比,将两个电极上共有的工频噪声大幅抑制掉。这是对抗环境共模干扰的第一道也是最有效的防线。

第二级:运放放大与抗混叠滤波(OA0)经过INA321放大后的信号,被送入MSP430片内的运算放大器OA0进行第二级放大。OA0被配置为同相放大器,其增益由反馈电阻(1MΩ)和输入电阻(10kΩ)决定,达到了100倍。至此,总模拟增益达到5 * 100 = 500倍,将1mV的信号放大到约0.5V,进入了ADC的理想输入范围。

在OA0的反馈回路上,并联了一个4.7nF的电容。这个RC网络构成了一个一阶低通滤波器,其截止频率f_c = 1/(2πRC) ≈ 1/(2 * 3.14 * 1e6 * 4.7e-9) ≈ 34Hz。这个滤波器扮演了两个角色:1.抗混叠滤波器:在ADC采样(512Hz)之前,必须滤除高于奈奎斯特频率(256Hz)的信号成分,防止高频噪声混叠到低频段,污染有效信号。34Hz的截止频率虽然看起来保守,但它能有效滤除大部分肌肉噪声(EMG)和环境高频噪声。2.进一步抑制工频噪声:50/60Hz的工频噪声虽然被INA321抑制了大部分,但仍有残留。这个34Hz的低通滤波器能对其进行进一步的衰减。

3.2 基线漂移抑制与偏置电路

基线漂移问题由于电极与皮肤之间的接触电阻会随着人的呼吸、轻微移动甚至出汗而变化,这会导致放大后的信号产生缓慢的直流电平漂移,即“基线漂移”。在示波器上看,就是整个心电波形上下起伏,严重时会淹没有用的信号甚至使放大器饱和。

模拟解决方案:积分器反馈(OA1)项目中巧妙地使用第二个片内运放OA1构建了一个模拟积分器来解决这个问题。OA1连接在OA0的输出和INA321的参考引脚之间。其工作原理是:积分器对OA0输出信号中的低频成分(主要是漂移)进行积分,产生一个校正电压反馈回INA321的参考端。如果输出信号的直流电平升高,积分器输出一个负向的校正电压,将其拉低,反之亦然。这样就形成了一个负反馈环路,自动稳定输出的直流工作点,有效抑制了基线漂移。这是一种经典而高效的模拟处理技术。

偏置电路:DAC1的应用MSP430FG439的DAC1在这里被用作一个精密的电压源,为整个放大链路提供中点偏置电压。在单电源(3V)供电系统中,运放需要在一个合适的直流电平上处理交流信号,通常这个电平是电源电压的一半(1.5V)。DAC1输出一个稳定的1.5V电压,通过一个820Ω的电阻连接到OA1的输入端,为整个系统建立了稳定的共模电压基准。文档中提到,DAC1也可用于实现数字基线漂移消除,即通过软件算法检测基线漂移,然后动态调整DAC1的输出进行补偿,但这在当前的实现中未被使用,展示了该硬件设计的扩展潜力。

实操心得:前端电路的稳定性在实际焊接和调试前端电路时,有几点需要特别注意。首先,电源去耦至关重要。必须在INA321和MCU的电源引脚附近放置0.1μF的陶瓷电容,以滤除电源噪声,否则噪声会直接耦合到高增益的放大器中。其次,电极引线应使用屏蔽线,并将屏蔽层单点接地(通常在板端),以防止引线引入额外干扰。最后,接触电阻是影响信号质量的最大变量。即使电路设计完美,如果电极与皮肤接触不良,信号也会充满噪声。除了文档提到的涂抹保湿剂,使用专用的心电电极片(带有导电凝胶)会比直接手指接触获得稳定得多的信号。

4. 数字信号处理算法与软件实现

4.1 数字滤波器的设计与实现

经过ADC采样后,我们得到的是512Hz采样率下的离散心电数据序列。虽然模拟前端已经做了大量滤波,但数字域滤波是进一步净化信号、提取特征的关键。

低通FIR滤波器:滤除工频噪声残余第一个数字滤波器是一个17抽头(17阶)的线性相位低通FIR滤波器。其通带上限为6Hz,阻带下限为30Hz。这意味着,6Hz以下的心电信号成分(包含主要的P波、QRS波、T波能量)会被保留,而30Hz以上的噪声(主要是残留的50/60Hz工频及其谐波)会被强烈抑制。选择6Hz作为通带边缘,是因为正常心电信号的主要能量集中在0.5Hz到40Hz之间,但为了更有效地抑制工频,这里采取了比较严格的低通设置。滤波器的系数经过了缩放,在滤波的同时还提供了一定的增益,使得经过整个链路的信号总增益超过1000倍。

高通FIR滤波器(QRS增强)第二个数字滤波器是一个17抽头的高通FIR滤波器,截止频率为2Hz。它的目的不是滤波,而是特征提取。心电图中,QRS波群是变化最快、斜率最大的部分,其频率成分较高。而基线漂移、P波和T波属于低频或变化较缓的部分。这个高通滤波器会衰减掉这些低频成分,同时保留并相对增强QRS波对应的高频成分。经过此滤波器后,输出信号中QRS波会表现为明显的尖峰脉冲,而P波和T波则变得非常微弱,这极大地简化了后续的检测逻辑。

FIR滤波器的优化实现在资源紧张的MCU上实时运行两个17阶的FIR滤波器是一个挑战。项目采用了两个关键优化:1.利用系数对称性:设计的FIR滤波器具有线性相位,其系数是偶对称或奇对称的。这意味着计算每个输出点时,几乎一半的乘法运算可以通过将对称位置的数据相加后再与系数相乘来完成,从而将乘法次数减少近一半。2.使用汇编语言乘法子程序:C语言中的标准乘法库函数可能效率不高。项目专门编写了一个16位有符号数的汇编乘法子程序mul16,并被C主程序调用。这充分利用了MSP430的硬件乘法器,显著提升了卷积运算的速度,确保了在512Hz采样率下能够实时完成所有滤波计算。

4.2 QRS波检测与心率计算算法

经过高通滤波后,信号中主要剩下QRS波对应的脉冲。检测算法变得直观而高效:

  1. 阈值比较:每个采样点的高通滤波器输出值会与一个预设的固定阈值进行比较。当信号值超过阈值时,认为检测到一个潜在的QRS波。
  2. 消抖处理:为了避免因噪声毛刺或T波导致误触发,算法设置了一个128个采样点的“不应期”或“消抖窗口”。一旦检测到一个QRS波,会启动一个计数器(代码中的counter),在接下来的128个采样点(约250ms)内,即使有信号超过阈值,也会被忽略。因为正常心率下,两次心跳的间隔远大于250ms。这有效防止了将单个QRS波识别为多次。
  3. 心率计算:算法采用三拍平均法来提高心率显示的稳定性。它使用一个变量pulseperiod来累计连续三个QRS波之间的采样点数。每当在非不应期内检测到一个有效的QRS波,pulseperiod就累加自上一个有效波以来经历的采样点数。当累计到第三个波时,利用公式进行计算:心率(次/分钟) = 92160 / pulseperiod这个公式的推导过程是:pulseperiod是三个心跳周期的总采样点数。采样间隔是 1/512 秒。所以三个心跳的总时间是pulseperiod / 512秒。平均每个心跳的周期是(pulseperiod / 512) / 3秒。那么每分钟的心跳次数就是60 / [ (pulseperiod / 512) / 3 ] = (60 * 512 * 3) / pulseperiod = 92160 / pulseperiod。计算完成后,pulseperiod被清零,为下一个三拍平均做准备。这种方法平滑了因呼吸或偶然心律失常导致的瞬时波动,使显示的心率值更稳定。

4.3 软件架构与资源管理

项目的软件用C语言编写,在IAR Embedded Workbench Kickstart Edition(免费版)中开发。代码结构清晰,主要包含三个功能略有差异的C源文件,用户可以根据需要选择编译:

  • Heart rate.c:仅实现心率计算和LCD显示。
  • Heart rate with DAC output.c:在心率计算基础上,增加通过DAC0输出模拟EKG波形功能。
  • Heart rate with EKG Demo.c:最完整的版本,包含心率计算、LCD显示和通过UART向PC发送EKG数字波形数据的功能。

整个项目对资源的占用控制得极好:代码内存仅1168字节,数据内存225字节,常量内存64字节。这完全在IAR Kickstart免费版的4KB代码限制之内,为学习者提供了零成本的软件环境。CPU主频通过FLL(锁频环)设置为2.097152 MHz,而整个EKG处理程序(包括ADC采样、两个FIR滤波、QRS检测和心率计算)仅消耗约1 MIPS的带宽,CPU利用率不足50%,这为系统进入低功耗模式留下了充足的空间。在实际产品中,可以让CPU在采样间隔内进入低功耗模式,从而进一步降低平均功耗,延长电池寿命。

注意事项:阈值的选择与自适应文档中提到使用“固定阈值”,这在实验室环境下是可行的。但在实际应用中,由于不同人的心电信号幅度差异、电极接触情况变化,固定阈值可能导致漏检或误检。一个更健壮的实现是采用自适应阈值算法。例如,可以动态地跟踪信号的平均值(或中值)和峰值,将阈值设置为“平均值 + 0.5 * (峰值 - 平均值)”之类的动态值。这需要更复杂的软件逻辑,但能显著提升系统在不同使用者和不同使用场景下的鲁棒性。

5. 系统调试、测试与性能优化

5.1 硬件组装与信号质量调试

拿到PCB并焊接好所有元件后,第一步是进行静态测试。在不连接电极的情况下,用万用表测量关键点的电压:INA321的输出、OA0的输出、DAC1的输出(应为1.5V左右)、以及MCU的电源电压。确保所有电压都在正常范围内。

接下来是动态测试,这是最考验耐心的部分。按照文档说明,将板子上的两个方形焊盘作为电极,分别用左右手拇指和食指按住。此时应注意:必须确保手指只接触电极焊盘,不要触碰到PCB上其他任何走线或元件,否则会引入干扰甚至短路。最好的握持方式是捏住电路板的两侧边缘。对于皮肤干燥的用户,信号可能非常微弱且噪声大,在手指上涂抹少许水或导电凝胶(如超声耦合剂)可以显著降低接触阻抗,改善信号质量。

上电后,观察LCD显示的心率数值。在静止状态下,一个健康成年人的心率应在60-100 BPM之间规律跳动。同时,如果你连接了DAC0输出到示波器,应该能看到清晰、稳定的心电波形,其特征是规律的P-QRS-T波序列,基线平稳。如果看不到波形或波形噪声极大,请按以下步骤排查:

  1. 检查电源:用示波器探头查看3V电源轨上是否有明显的噪声或纹波。
  2. 检查放大链路:用信号发生器(或简单的函数发生器)在输入端注入一个频率为1-2Hz、幅度为几毫伏的正弦波或方波,用示波器逐级检查INA321输出、OA0输出,看增益是否符合设计(总共约500倍),波形是否失真。
  3. 检查接触:这是最常见的问题。尝试用湿布擦拭电极区域和手指,确保接触良好。
  4. 环境干扰:远离电脑显示器、手机、电源适配器等强干扰源进行测试。

5.2 PC端波形显示与数据分析

要直观地观察心电波形,可以使用项目提供的PC端软件scope.exe。这需要一个RS-232电平转换器(如MAX3232芯片模块)连接在开发板的UART TX引脚(P2.4/UTXD0)和电脑的串口(或USB转串口)之间。串口参数设置为:波特率115200,8位数据位,无校验,1位停止位。

在电脑上运行scope.exe,它就会以波形图的形式实时显示从板子发送过来的心电数据。这个可视化工具对于调试至关重要。你可以清晰地看到原始信号中的噪声、滤波后的效果、以及QRS检测算法是否准确地标记了每个R波峰值。通过观察波形,你可以判断滤波器的参数是否需要调整(例如,如果P波和T波过于微弱,可能需要调整高通滤波器的截止频率),或者阈值设置是否合适。

5.3 功耗测量与优化策略

作为一个以纽扣电池供电为设计目标的项目,功耗是需要密切关注的核心指标。MSP430FG439本身具有出色的低功耗特性。你可以通过以下方法测量和优化:

  1. 测量总电流:在电池和板子的电源跳线之间串联一个万用表(电流档),测量系统在不同工作状态下的电流。正常运行时,由于CPU持续运行在2MHz左右处理数据,电流可能在几百微安到1毫安左右。
  2. 启用低功耗模式:当前的示例代码可能让CPU全速运行。一个重要的优化点是利用Timer_A定时触发ADC采样。在ADC采样转换期间,CPU被唤醒工作;在两次采样之间的空闲时间里(约2ms),CPU可以进入LPM3等低功耗模式。这样可以将平均电流降低到100微安以下。CR2032纽扣电池的容量约为220mAh,如果平均电流为100μA,理论续航时间可达220mAh / 0.1mA = 2200小时,超过90天。
  3. 外设管理:不使用的片内外设(如多余的定时器、看门狗、未用的IO口等)应被关闭。LCD显示模块的功耗也可能占大头,可以考虑让心率值每隔几秒刷新一次,而不是持续刷新。

6. 项目扩展与进阶思考

这个基础项目为我们打开了一扇门,在此基础上可以进行许多有意义的扩展,使其更接近一个实用的产品原型。

扩展一:增加SD卡存储与离线分析添加一个SPI接口的微型SD卡模块,成本很低。可以修改软件,将滤波后的心电波形数据以CSV或二进制格式定时存储到SD卡中。例如,每5分钟存储一段30秒的数据。这样,用户就可以将SD卡插入电脑,用MATLAB或Python进行更深入的离线分析,如心率变异性分析、心律失常筛查等,为项目增加数据记录和回顾功能。

扩展二:实现蓝牙传输与手机APP显示用HC-05或HM-10这类低功耗蓝牙模块替换掉RS-232电平转换器。修改代码,将心率和波形数据通过蓝牙发送到智能手机。在手机上开发一个简单的APP(可以用MIT App Inventor或React Native快速原型)来接收并实时绘制心电图、显示心率、甚至进行简单的报警(如心率过高/过低)。这立刻将系统升级为一个现代化的可穿戴设备原型。

扩展三:算法升级与更多生理参数提取当前的QRS检测算法相对简单。可以研究并实现更鲁棒的算法,如Pan-Tompkins算法,该算法综合使用了带通滤波、微分、平方、移动窗口积分等多个步骤,对噪声和基线漂移的容忍度更高,是业界经典。更进一步,可以尝试从心电波形中自动识别P波和T波,计算PR间期、QT间期等更多临床参数,虽然这在MCU上实现挑战很大,但可以作为算法研究的课题。

扩展四:多导联与呼吸监测标准临床心电图使用多个导联。可以设计一个扩展板,增加电极数量,利用MSP430的多路ADC,尝试采集简单的双导联(如I导联和II导联)信号。此外,心电信号中的呼吸也会引起微小的基线周期变化(称为呼吸波),可以通过数字信号处理技术提取出呼吸频率,实现一机多能。

这个基于MSP430FG439的心率与心电图监测项目,麻雀虽小,五脏俱全。它不仅仅是一份电路图和代码,更是一个完整的、教学意义极强的嵌入式生物信号处理案例。从模拟电路的精巧设计,到数字滤波算法的嵌入式实现,再到低功耗的系统考量,每一个环节都体现了嵌入式硬件工程师和软件工程师需要掌握的核心技能。无论你是想深入学习模拟电路设计,还是想钻研嵌入式DSP算法,或是单纯地想做出一个能“看见”自己心跳的酷炫项目,它都是一个绝佳的起点。在实际动手复现的过程中,你会遇到噪声、漂移、软件bug等各种问题,而解决这些问题的过程,正是经验积累和能力提升的快速通道。