红外心率监测仪(转)

红外心率监测仪

本篇文章记录了如何使用Arduino以及红外光电传感器,通过透射吸收来进行光电容积脉搏波描记法的简易心率监测仪的设计过程,并通过TFT屏幕实时显示结果。

本设计需要编写源代码并搭建必要电路,所以需要掌握一定的电子知识、了解Arduino、使用DMM和一些耐心。

本设计已经了优化,以满足更容易的与身边的商品和家用物品结合使用,并获得理想的效果。

所需材料

1、Arduino Mega 2560
2、1个旧衣架,如“第2步: 传感器”中图片所示
3、1个1.8寸SPI接口128x160 TFT模块
4、2个TL072 FET输入运放
5、1个T121 NPN达林顿三极管
6、3个1N4148二极管
7、1个BZY88C 3v3稳压管
8、1个BPW96B光电晶体管
9、1个TSAL6400 940nm红外5mm LED
10、1个1uF陶瓷电容
11、2个4.7uF电解电容
12、1个22pF陶瓷电容
13、1个22nF陶瓷电容
14、1个10nF陶瓷电容
15、1个50K 10圈电位器
16、3个4K7电阻
17、4个10R电阻
18、2个7R5电阻
19、1个1M0电阻
20、1个3K9电阻
21、2个10K电阻
22、1个100K电阻
23、5个1K电阻
24、1个220R电阻

警告:本文仅供参考,不可在临床或任何其他场合中进行准确的心率监测。

第1步:科学原理

红外心率监测仪 红外心率监测仪

那么什么是光电容积脉搏波描记法呢?

光电容积脉搏波描记法(PPG)是一种简单且低成本的光学技术,可用于检测组织微血管床中的血容量变化。它用于对皮肤表面进行非侵入性测量。

PPG波形包括两个主要成分:与心跳同步的“交流”动脉血流脉动变化和归因于静脉血液、组织、呼吸、交感神经系统活动和体温调节的“直流”元素。参见上图“Variation in light attenuation by tissue”。

我们正是利用这些“交流”信号来提取心跳信息。

光与人体组织的相互作用是相当复杂的,并且涉及;散射、反射和吸收。研究表明,940nm左右的红外光穿透最深,并产生最佳的深层组织血流测量结果。

通过在光敏接收器件(光电二极管/光电三极管)处照射照明源(本设计使用的是红外LED)来实现检测。

传感器的定位有两种方式,反射式或透射式。参见上图“Transmissive and Reflective modes”。透射模式在红外照明下产生最佳效果,本项目正是基于此原理。

第2步:传感器

红外心率监测仪

传感器是用一个旧衣架做成的。我最初用弹簧金属夹将设备固定在指尖,但发现它原来的形状太紧了,阻碍了血液流动。因此,我打开了它,如上所示。然而,一旦我把它打开到足够大的程度,让指尖有良好的血液流动,夹子就无法再固定在一起了。

为了克服这一点,我在钢夹上钻了两个孔,并使用M2.5内六角螺钉将其连接到传感器平台上。注意:由于弹簧由硬化钢制成,我需要先用喷灯加热以软化金属。您可以在上图中看到由此产生的变色。

夹具制作完成后,我在顶部和底部传感器平台上钻了5毫米的孔(你可能会注意到其中一块板上有两个孔,这是因为我最初试图计算Sp02 Max(血氧饱和度最大值)需要不同波长的LED。我很快确定电子设备和信号处理可能超过Instructions的测量范围。以后再说吧)。

完成打孔后,我使用了用于门窗保温的泡沫,为插入的手指提供侧向保护,并减弱任何影响光电三极管的光线。

最后,我将红外LED和光电三极管安装在一块定制切割的通孔板上,用M3螺丝固定在传感器平台上,以便减轻连接的电缆的拉力。

第3步:信号调理

红外心率监测仪红外心率监测仪红外心率监测仪

传感器是用一个旧衣架做成的。我最初用弹簧金属夹将设备固定在指尖,但发现它原来的形状太紧了,阻碍了血液流动。因此,我打开了它,如上所示。然而,一旦我把它打开到足够大的程度,让指尖有良好的血液流动,夹子就无法再固定在一起了。

概述

在设计探测仪的电路时,经历了多次迭代,并尝试了许多类型的探测器。比如光伏电池和跨导原理的光电二极管、反射原理和透射原理检测方法、不同的照明源,包括红色650nm、绿色535nm和红外940nm。

最终决定使用一种具有940nm红外源的光电三极管,它在光谱上匹配得相当好,而且电路原理最简单。

正如上面提到的,光电三极管和红外源的选择是最重要的(与电路图完全一致),因为这也是获得的最好的匹配结果。

校准

校准电路时,需确认已经打开+5V电源,T1被“关闭”,传感器被屏蔽,不受任何光线的影响。调整R4,直到IC2B的输出尽可能接近2.5V。

注意事项

1、使用同轴电缆连接光电三极管,以减少信号损耗和噪音
2、确保光电二极管的发射极和集电极之间没有残留助焊剂,因为这会导致信号衰减
3、使用高容量电池或良好的线性PSU作为电源(无噪音,非开关电源)
4、调试模拟信号时与Arduino断开,处理器的高速时钟噪声会在信号路径中引起噪声
5、导线要尽可能的短
6、尽可能遮盖淘光源和传感器
7、手指的松紧要适合,太紧会阻塞血液流动并减弱读数

第4步:Arduino软件设计

红外心率监测仪

设备启动后,软件打开红外Led,提醒用户需要靠近设备,并将在10秒内开始测试。这样就给了用户将手指放置在传感器中的时间。

在测距过程中,软件读取ADC的结果10000次,每次读取短暂暂停1mS。这用于记录原始采样信号的最大和最小极限值。

这些最大值和最小值用于确定动态触发点,以检测心跳中的急剧上升边缘,从而能够对脉冲之间的周期进行计时,从而计算BPM。

如上文所示,把滞后引入低电平触发器,可以避免由于高采样率而导致的重复触发。

高电平触发点iPulseTriggerLevelHigh为峰值的90%(上图中的绿色星形),低电平触发点为iPulseTiggerLevelLow为峰值的70%(上图中为蓝色星形)。

然后,软件进入一个无限循环,在ulElapsedTime规定的时间(约1mS或1000Hz)后采集信号样本。ulElapsedTime可以通过更改#define SAMPLE_PERIOD_uS进行调整。

时间延迟是非阻塞的,因此可以用来执行其他后台任务。

一旦从ADC读取心跳的样本,就缩放该值以适合波形窗口。此缩放缩放范围是0-5v=>0-1023=>0-100。

我故意注释掉了波形窗口的自动缩放,因为我发现当我打开它时,波形每次都非常适合窗口,正如你所期望的那样。在这样做的过程中,你丢失了很多重要信息,比如当我的手指很冷或在传感器中位置不好时,因此脉冲输出水平很低。我觉得保留这些信息更有用。尽管我确实提供了一个可变的fAmplificationFactor(第171行,设置为2.1),如果你的电子和设计水平产生的信号不如我设计的灵敏,它可以用来缩放你的信号。

然后,代码确定这是否是一个上升沿(请参阅上图中的逻辑)。如果是并且没有检测到下降沿,则将时间存储在ulPulseCurrentTime中。然而,如果是并且已经检测到下降沿,这意味着经过的时间是脉冲之间的时间段。

然后,软件计算BPM(如上图所示),并在必要时调整millis()函数调用。

新的脉冲速率顺序存储在滚动窗口缓冲区阵列lBPMArray[]中,并计算所有样本的平均值。将新计算的BPM与旧BPM进行比较。如果存在差异,则使用新值更新显示。从而减少TFT更新开销。

在代码开发过程中,我注意到不能为范围为50…200的BPM优化TFT的单次扫描速率。因此,当脉冲速率超过100BPM时,iSampleCountMax会动态变化,这样屏幕就不会变得过于拥挤,脉冲的形状仍然清晰。

如果由于某种原因,波形对于显示器来说太大,则软件会对波形进行剪辑,并用最新的ADC采样更新屏幕,并在波形窗口中绘制。

通过在绘图位置之前“动态”写一条垂直黑线,首先删除先前绘制的值。

滚动平均值

心率是通过获取脉冲之间周期的连续更新滚动平均值来计算的。可以通过修改#define MAX_BPM_ARRAY_SIZE的值来调整滚动平均值的长度。时间越长,更新越慢,但近似值越好(假设手指在传感器中保持稳定)。

为了用初始值对平均值进行种子设定,阵列lBPMArray[]在启动时以60BPM的心率作为预加载值。

dettek

声明:该文观点仅代表作者本人,我们只提供信息存储空间服务。
我来说两句
加载中~
相关阅读

锂电池和锂亚电池

2024-02-15    阅读  

STM32和51单片机的区别

小编 · 2024-01-31 16:48:04

锂亚电池

2023-04-28    阅读  

IPEX几代接口的区别

小编 · 2024-01-31 16:48:04

智能井盖

小编 · 2024-01-31 16:48:04