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值

心率测量原理

心率 测量是基于血液容积随时间变化来进行光学检测。手指中血液随心脏律动 ,从而改变组织对光的吸收率。这种变化可以通过检测反射光的强度变化来捕捉。

  1. 光学脉搏波(PPG):当心脏跳动时,血液流量增加,导致组织对光的吸收增加,反射光的强度减少。相反,在心脏舒张时,血液流量减少,反射光的强度增加。通过分析红光或红外光的反射信号强度变化,形成光学脉搏波(PPG)信号。
  2. 心率计算: 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的使用体验

未来的改进方向和潜在应用

九、附录

参考文献和资源链接

数据手册和库文档链接

相关推荐
纳米软件16 分钟前
IGBT模块测试项目集合——纳米软件
单片机·嵌入式硬件·模块测试
乖乖是干饭王3 小时前
Linux 内核 Kbuild 中的 ld 调用机制
linux·c·makefile
单片机系统设计5 小时前
基于STM32的智能台灯系统/智能书桌
stm32·单片机·嵌入式硬件·毕业设计·智能家居
F133168929575 小时前
5030A 芯片 24V 转 5V 15A 大电流快充选型
网络·单片机·嵌入式硬件·物联网·汽车
恒锐丰小吕5 小时前
无锡黑锋 HF4004 低噪声电荷泵DC-DC转换器技术解析
嵌入式硬件·硬件工程
星一工作室5 小时前
STM32项目分享:基于单片机的智能宠物玩具的设计
stm32·单片机·嵌入式硬件
up向上up6 小时前
基于51单片机数字频率计仿真设计
单片机·嵌入式硬件·51单片机
SystickInt7 小时前
32 RTC实时时钟-独立定时器
stm32·单片机·嵌入式硬件
三佛科技-187366133977 小时前
智能豆芽机单片机方案开发
单片机·嵌入式硬件
就是蠢啊7 小时前
51单片机——ADC数模转换实验
单片机·嵌入式硬件·51单片机