MAX30102 血氧调试笔记

您所在的位置:网站首页 rdy怎么读 MAX30102 血氧调试笔记

MAX30102 血氧调试笔记

2023-08-15 18:13| 来源: 网络整理| 查看: 265

一、血氧测量原理 1.1 PPG波形介绍

血氧饱和度(英语:Oxygen saturation),或称血氧浓度,是指血中氧饱和血红蛋白相对于总血红蛋白(不饱和+饱和)的比例。人体需要并调节血液中的氧气非常精确和特定的平衡。 人体的正常动脉血氧饱和度为95-100%。 如果该水平低于90%,则被认为是低氧血症。

血氧的测量主要分为透射式和反射式。目前的主流是透射式。但是两者原理差不多,都是使用发光二极管(红光RED,红外IR,绿光GREEN和蓝光BLUE等)照射被测部位,然后使用一个光电二极管接收透射/反射的光线,将光信号转换为电信号。然后通过高精度的ADC测量反射回的电流大小,评估血液中的含氧量。

图1 典型PPG 波形

上图是一个典型的PPG波形,即光电二极管接收到原始的光信号波形。波形(由图中间的白色横虚线)可分为两部分:DC signal 和 AC signal,即直流信号和交流信号。

其中直流信号由下到上可分为以下三部分的反射:组织(issue),静脉血(Venous blood)和不跳动的动脉血(Non pulsatile arterial blood)。当然对于不同年龄、性别和肤色等人不同,对应的DC signal 值也会不同。所以后面的血氧计算都是使用相对值。

而 AC signal 交流信号就比较单一:由跳动的动脉血反射得到。其中波峰对应心脏的收缩(Systole),波谷对应心脏舒张(Diastole)。

1.2 心率计算(HR)

通过计算AC signal 两个波峰的时间(图中两条竖着的黑色虚线),我们就能计算出心率,这里不再赘述。至于选择哪个通道的数据(红光或红外),其实都是可以的,一般是使用信号较好的那个通道(通常为红外)。

1.3 灌注指数(PI)

临床上,交流分量与直流分量的幅值之比反映了人体的血流灌注能力,称为血流灌注指数(Perfusion Index,PI)。一般情况下灌注度越高,表明信号质量越好。其表达式为:

PI = AC/DC * 100%

1.4 血氧计算(SpO2)

血压计算公式也比较简单,这里MAX30102是一路红光,一路红外。只分别算出红光的交流除以红光的直流即: ACred/DCred,和红外的交流除以红外的直流分量即:ACired/DCired。然后两者再相除得到R。

得到 R 然后查表即可得到血氧值,也可以通过下面美信拟合的公式计算:

SpO2 = -45.060*R*R + 30.354 *R + 94.845

二、MAX30102传感器原理

由上面的原理我们简化为:将RED/IR 光射向皮肤,透过皮肤组织反射回的光被光敏传感器接受并转换成电信号,再经过AD转换成数字信号。简化过程:光--> 电 --> 数字信号。所以我们需要控制光源LED的电流强度和采样率,光敏传感器的ADC精度(xbit)等。

图2 MAX30102 系统框图

三、MAX30102寄存器配置 3.1 初始化配置

在一般的配置中我们让设备开机直接开始进入SpO2/HR 模式就好(PROX_INT_EN 置 0),设置两个LED的电流都为0x40,然后开启 RDY 中断使能。这样每次数据采集ok就可以中断一次去处理数据。

// 主要寄存器配置参数 MAX30102_Write_Byte(MODE_CONFIG, 0X40); //RESET FIRST am_util_delay_ms(20); MAX30102_Write_Byte(INTERRUPT_ENABLE1, 0xC0); // A_FULL_EN, PPG_RDY_EN set to 1. MAX30102_Write_Byte(INTERRUPT_ENABLE2, 0x02); //TEMP RDY EN 0x02 MAX30102_Write_Byte(FIFO_WR_PTR, 0x00); //recommend to clear first MAX30102_Write_Byte(OVERFLOW_COUNTER, 0x00); //recommend to clear first MAX30102_Write_Byte(FIFO_RE_PTR, 0x00); //recommend to clear first MAX30102_Write_Byte(FIFO_CONFIG, 0x0f); //sample avg = 1, fifo rollover=false, fifo almost full = 17 MAX30102_Write_Byte(MODE_CONFIG, 0x03); //SpO2 mode. RED and IR MAX30102_Write_Byte(SPO2_CONFIG, 0x2B); // SPO2_ADC range = 4096nA, 200Hz, LED pulseWidth (411uS) ,18bit MAX30102_Write_Byte(DIE_TEMP_CONFIG, 0x01); //TEMP_EN set 1. MAX30102_Write_Byte(LED1_PULSE_AMP, 0X40); //Choose value for ~ 13mA for LED1(red) MAX30102_Write_Byte(LED2_PULSE_AMP, 0X40); //Choose value for ~ 13mA for LED2(ir) MAX30102_Read_Byte(INTERRUPT_STATUS1); //clear int flag first.不然可能无法进中断 MAX30102_Read_Byte(INTERRUPT_STATUS2); 3.2 FIFO读取数据

MAX30102 FIFO 的深度为32,每个buf是6个字节(两通道数据,每通道3字节)。我么可以开启 PPG_RDY_EN,这样就能每来一个新的数据,就会中断一次通知我们去取数据。读FIFO_DATA 就会自动清掉中断标志位。

图3 FIFO 寄存器

FIFO相关的寄存器有4个。虽然是显示均可读写(R/W),但是实际上只有 FIFO Read Pointer可以写(应用在读数据出错,往回重读一次的情况)。其他 FIFO 寄存器均为只读。

FIFO Write Pointer:好理解,就是写指针寄存器。保存下一个新数据在 FIFO 中的写地址。每次来一个数据,这个写指针会自动移动一位。Over Flow Counter: 如果32个FIFO深度满了,就会在这里增加1,表示溢出。FIFO Read Pointer:FIFO读指针,始终指向下一个待读取的FIFO地址。如果数据读取后,读地址也会自动增加。FIFO Data Register: 可以简单的理解为 *FIFO_RD_PTR,始终指向下一个数据。

I2C寄存器映射中的FIFO_DATA寄存器指向要从FIFO读取的下一个样本。 FIFO_RD_PTR指向此样本。所以虽然通过连续读 FIFO_DATA 不会使该寄存器自增,但是 FIFO_DATA 寄存器实际是映射到FIFO_RD_PTR,而FIFO_RD_PTR 寄存器始终指向下一个待读取的数据,所以对FIFO_DATA 连续读,是能够实现的。读 FIFO 函数如下:

/***************************************************************************************** * Function Name: MAX30102_Read_FIFO_Data * Description : 通过硬件I2C,读取FIFO中的数据RED, IR. * Arguments : *data:两路电流值大小 * Return Value : none ******************************************************************************************/ void MAX30102_Read_FIFO_Data(uint32_t *data) { uint8_t tmp[6]; MAX30102_Read_Len(FIFO_DATA, tmp, 6); data[0] = ((tmp[0]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3