当前位置: 首页 > news >正文

MAX30102驱动

文章目录

  • 一、引言
  • 二、MAX30102传感器概述
    • 2.1 模块原理
      • 血氧饱和度(SpO2)测量原理
      • 心率测量原理
    • 2.2 模块工作流程
  • 三、硬件连接
  • 四、驱动程序
    • 4.1 FIFO介绍
    • 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值

心率测量原理

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

  1. 光学脉搏波(PPG):当心脏跳动时,血液流量增加,导致组织对光的吸收增加,反射光的强度减少。相反,在心脏舒张时,血液流量减少,反射光的强度增加。通过分析红光或红外光的反射信号强度变化,形成光学脉搏波(PPG)信号。
  2. 心率计算: PPG信号中每个峰值对应一次心跳,通过计算一段时间内的峰值数,可以得出心率(BPM,次/分钟)。

具体步骤如下:

发光: 红光和红外光LED交替发光,穿透皮肤和血管。
接收: 光电二极管接收反射回来的光信号。
信号处理: 反射信号经过环境光消除、模数转换和数字滤波处理。
PPG信号提取: 从处理后的信号中提取出光学脉搏波(PPG)信号。
峰值检测: 检测PPG信号中的峰值,计算峰值之间的时间间隔。
心率计算: 根据峰值间隔时间,计算心率(BPM)。

2.2 模块工作流程

这个架构图展示了MAX30102传感器将光信号转换为数字数据,并通过I2C接口传输给外部设备,用于心率和血氧饱和度测量。

在这里插入图片描述

红光LED(660nm)和红外LED(880nm)用于发射光束穿过人体组织。光通过人体组织后部分被吸收,部分被反射,反射回来的光被光电二极管检测到。将从光电二极管接收到的模拟信号转换为数字信号。这里有两个ADC,一个是红光信号,一个是红外光信号。对从ADC采集的数字信号进行处理,去除噪声,得到更精确的数据,然后把数据等待通过I2C接口发送给外部微控制器。

三、硬件连接

MAX30102:VCC<->3.3VGND<->GNDSCL<->PB7SDA<->PB8INT<->PB9
0.96inch OLED :VCC<->3.3VGND<->GNDSCL<->PC13SDA<->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 (可以同时测量心率和血氧饱和度)

max30102_Bus_Write(REG_MODE_CONFIG,0x03);//0x03(011) for SpO2 mode

在这里插入图片描述

测量量程,采样率,功率(AD采样精度)的配置

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

在这里插入图片描述

	max30102_Bus_Write(REG_LED1_PA,0x24);   	//Choose value for ~ 7mA for LED1 0xe0 0x24max30102_Bus_Write(REG_LED2_PA,0x24);   	// Choose value for ~ 7mA for LED2 0xe0 0x24max30102_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数据

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的使用体验
未来的改进方向和潜在应用

九、附录

参考文献和资源链接
数据手册和库文档链接

相关文章:

  • 【ajax基础03】常用ajax请求方法和数据提交以及axios错误处理
  • Java23种设计模式(二)
  • MySQL系列-语法说明以及基本操作(二)
  • 力扣爆刷第153天之TOP100五连刷(相交、翻转、排序链表、螺旋矩阵、锯齿二叉树)
  • IPython 使用技巧整理
  • Linux系统之mtr命令的基本使用
  • 超多细节—app图标拖动排序实现详解
  • 简析:分账系统
  • 测试testing06182
  • 暑期计划打卡清单表怎么写 暑期待办计划清单
  • 干G货,性能测试基本方法和原则,
  • shell命令(进程管理和用户管理)
  • 【多线程】线程状态
  • redis击穿问题使用锁实现方案
  • 零散的面试题
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 07.Android之多媒体问题
  • CSS实用技巧
  • dva中组件的懒加载
  • gops —— Go 程序诊断分析工具
  • Python学习之路13-记分
  • React-flux杂记
  • use Google search engine
  • 关于 Cirru Editor 存储格式
  • ------- 计算机网络基础
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 七牛云假注销小指南
  • 区块链共识机制优缺点对比都是什么
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用agvtool更改app version/build
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Android开发者必备:推荐一款助力开发的开源APP
  • hi-nginx-1.3.4编译安装
  • 阿里云服务器如何修改远程端口?
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (二)c52学习之旅-简单了解单片机
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三)uboot源码分析
  • (三十五)大数据实战——Superset可视化平台搭建
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • *** 2003
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net FrameWork简介,数组,枚举
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net中的Queue和Stack
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)
  • [C++]四种方式求解最大子序列求和问题
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽
  • [Head First设计模式]策略模式