文章目录
- 一、引言
- 二、MAX30102传感器概述
-
- [2.1 模块原理](#2.1 模块原理)
- [2.2 模块工作流程](#2.2 模块工作流程)
- 三、硬件连接
- 四、驱动程序
-
- [4.1 FIFO介绍](#4.1 FIFO介绍)
- [4.2 max30102寄存器配置](#4.2 max30102寄存器配置)
- 五、数据采集与处理
- 六、示例项目
- 七、故障排除
- 八、结论
- 九、附录
一、引言
本次设计主要使用STM32F103C8T6作为主控,0.96寸OLED 显示(四针IIC),MAX30102采集心率血氧 。
为了让读者更好地理解MAX30102的驱动 ,我们将通过一个详细的示例项目展示如何使用该传感器进行心率和血氧测量。示例项目将包含完整的硬件连接 步骤、代码实现 和数据处理方法,帮助读者快速上手。
二、MAX30102传感器概述
2.1 模块原理
血氧饱和度(SpO2)测量原理
血氧饱和度 是指血液中氧合血红蛋白(HbO2)占总血红蛋白(包括氧合血红蛋白和脱氧血红蛋白)的比例 。不同波长的光对氧合血红蛋白和脱氧血红蛋白的吸收率 不同,通过测量反射光的强度可以推算出血氧饱和度。
- 红光(660nm): 氧合血红蛋白(HbO2)和脱氧血红蛋白(Hb)对红光的吸收率不同。脱氧血红蛋白对红光吸收较强,而氧合血红蛋白对红光吸收较弱。
- 红外光(880nm): 氧合血红蛋白和脱氧血红蛋白对红外光的吸收率差异较小,但红外光的穿透力较强,可以更深层次地检测血液。
通过比较这两种波长光的吸收情况,能够计算出血液中氧合血红蛋白的比例,即血氧饱和度(SpO2)。具体公式如下:
SpO 2 = HbO 2 HbO 2 + Hb \text{SpO}_2 = \frac{\text{HbO}_2}{\text{HbO}_2 + \text{Hb}} SpO2=HbO2+HbHbO2
通过采集红光和红外光的反射信号,利用比值和校准曲线计算出SpO2值
心率测量原理
心率 测量是基于血液容积随时间变化来进行光学检测。手指中血液随心脏律动 ,从而改变组织对光的吸收率。这种变化可以通过检测反射光的强度变化来捕捉。
- 光学脉搏波(PPG):当心脏跳动时,血液流量增加,导致组织对光的吸收增加,反射光的强度减少。相反,在心脏舒张时,血液流量减少,反射光的强度增加。通过分析红光或红外光的反射信号强度变化,形成光学脉搏波(PPG)信号。
- 心率计算: PPG信号中每个峰值对应一次心跳,通过计算一段时间内的峰值数,可以得出心率(BPM,次/分钟)。
具体步骤如下:
发光: 红光和红外光LED交替发光,穿透皮肤和血管。
接收: 光电二极管接收反射回来的光信号。
信号处理: 反射信号经过环境光消除、模数转换和数字滤波处理。
PPG信号提取: 从处理后的信号中提取出光学脉搏波(PPG)信号。
峰值检测: 检测PPG信号中的峰值,计算峰值之间的时间间隔。
心率计算: 根据峰值间隔时间,计算心率(BPM)。
2.2 模块工作流程
这个架构图展示了MAX30102传感器将光信号转换为数字数据,并通过I2C接口传输给外部设备,用于心率和血氧饱和度测量。
红光LED(660nm)和红外LED(880nm)用于发射光束穿过人体组织。光通过人体组织后部分被吸收,部分被反射,反射回来的光被光电二极管 检测到。将从光电二极管接收到的模拟信号转换为数字信号 。这里有两个ADC ,一个是红光信号,一个是红外光信号。对从ADC采集的数字信号进行处理,去除噪声,得到更精确的数据,然后把数据等待通过I2C接口发送给外部微控制器。
三、硬件连接
cpp
MAX30102:
VCC<->3.3V
GND<->GND
SCL<->PB7
SDA<->PB8
INT<->PB9
0.96inch OLED :
VCC<->3.3V
GND<->GND
SCL<->PC13
SDA<->PC14
四、驱动程序
IIC通信原理在之前的文章已经介绍过,本小节主要介绍MAX30102如何通过IIC驱动。
4.1 FIFO介绍
MAX30102可通过寄存器 进行配置,ADC输出数据存储在32深度的数据缓存器(FIFO) 。FIFO 允许MAX30102连接到共享总线上的微控制器或处理器,所以ADC数据不会从MAX30102 的寄存器中读取。
MAX30102 的 FIFO 有 32 个 3 字节的样本位置,也就是说,它的 FIFO 深度是 32。每个样本包含红光和红外光的数据,每个数据占用 3 个字节,所以一个完整的样本占用 6 个字节(红光数据的3个字节 + 红外光数据的3个字节)。
由于每个样本由两个数据通道组成,因此每个样本有6个字节的数据,因此 FIFO 中总共可以存储 192 个字节的数据。
4.2 max30102寄存器配置
通常设置为 SpO2 mode (可以同时测量心率和血氧饱和度)
cpp
max30102_Bus_Write(REG_MODE_CONFIG,0x03);//0x03(011) for SpO2 mode
测量量程,采样率,功率(AD采样精度)的配置
cpp
max30102_Bus_Write(REG_SPO2_CONFIG,0x27);//0x27(001 001 11)
//SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), LED pulseWidth (411uS)
小灯的驱动电流幅度控制,红光LED1 和红外光LED2 的电流配置为约 7mA
Pilot LED 的电流配置为约 25mA
cpp
max30102_Bus_Write(REG_LED1_PA,0x24);
//Choose value for ~ 7mA for LED1 0xe0 0x24
max30102_Bus_Write(REG_LED2_PA,0x24);
// Choose value for ~ 7mA for LED2 0xe0 0x24
max30102_Bus_Write(REG_PILOT_PA,0x7f);
// Choose value for ~ 25mA for Pilot LED
每当读取中断状态寄存器 或读取触发中断的寄存器时,中断都会被清除。
中断使能:可以配置 MAX30102 的中断,在数据准备好时通知微控制器,提高数据读取的实时性和效率。
FIFO读取数据:
设置读指针:将 FIFO 读指针设为开始读取的位置。
读取数据:从 FIFO 数据寄存器连续读取 6 个字节(3 个字节红光数据 + 3 个字节红外光数据)。
更新读指针:读取完成后,读指针自动更新到下一个位置。
这里的aun_ir_buffer和aun_red_buffer就是原始adc数据
cpp
max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);//从MAX30102读数据
//红色三字节数字,红外三字节数据
aun_ir_buffer[i] = (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2]; // Combine values to get the actual number
aun_red_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];
五、数据采集与处理
后续内容待补充
数据处理算法(如心率和血氧饱和度的计算)
六、示例项目
一个完整的示例项目,展示如何使用MAX30102进行心率和血氧测量
提供详细的代码解释
演示结果和测试
七、故障排除
常见问题及解决方案
数据读取异常的处理方法
硬件连接问题排查
八、结论
总结MAX30102的使用体验
未来的改进方向和潜在应用
九、附录
参考文献和资源链接
数据手册和库文档链接