MAX30102驱动

news2024/11/24 5:56:17

文章目录

  • 一、引言
  • 二、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.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 (可以同时测量心率和血氧饱和度)

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 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数据

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

九、附录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1835922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟货币投资指南|XEX交易所

什么是虚拟货币&#xff1f; 虚拟货币是一种基于区块链技术的数字资产&#xff0c;具有去中心化、透明性和安全性等特点。比特币&#xff08;BTC&#xff09;、以太坊&#xff08;ETH&#xff09;和莱特币&#xff08;LTC&#xff09;等是目前较为知名的虚拟货币。 虚拟货币投…

降压开关稳压器如何使用串联晶体管

降压开关稳压器是一种开关模式电源电路&#xff0c;旨在有效地将直流电压从较高电压降低到较低电压&#xff0c;即减去或“降压”电源电压&#xff0c;从而降低输出端可用的电压端子无需改变极性。换句话说&#xff0c;降压开关调节器是降压调节器电路&#xff0c;因此例如降压…

生成对抗网络——GAN深度卷积实现(代码+理解)

本篇博客为 上篇博客的 另一个实现版本&#xff0c;训练流程相同&#xff0c;所以只实现代码&#xff0c;感兴趣可以跳转看一下。 生成对抗网络—GAN&#xff08;代码理解&#xff09; http://t.csdnimg.cn/HDfLOhttp://t.csdnimg.cn/HDfLO 目录 一、GAN深度卷积实现 1. 模型…

苍穹外卖---导入接口文档

一、前后端分离开发流程 第一步&#xff1a;定义接口&#xff0c;确定接口的路径、请求方式、传入参数、返回参数。 第二步&#xff1a;前端开发人员和后端开发人员并行开发&#xff0c;同时&#xff0c;也可自测。 第三步&#xff1a;前后端人员进行连调测试。 第四步&…

搭建zookeeper、Kafka集群

搭建zookeeper、Kafka集群 1、绘制kafka的存储结构、副本机制2、搭建zookeeper集群3、搭建kafka集群4、使用kafka创建名为自己姓名汉语拼音的topic5、查看topic的分区和副本策略 1、绘制kafka的存储结构、副本机制 2、搭建zookeeper集群 实验环境准备&#xff1a; 3台服务器&…

界面追踪方法Level Set与VOF在气泡流动模拟的效果比较

对于两相流模拟&#xff0c;模型主要分为两大类&#xff1a;高相分数模型和界面捕捉类模型。当我们关注水中的含气量&#xff08;气泡界面及气泡形状可忽略&#xff09;&#xff0c;则采用高相分数模型&#xff0c;此模型适用于气泡特别多的流动问题。对于有明确边界的流体&…

AI安全水深流急,黄铁军首谈AGI能力与风险分级,2024智源大会圆满落幕

2024年6月15日&#xff0c;为期 2 天的北京智源大会圆满落下帷幕。本次大会围绕大语言模型、多模态模型、Agent、具身智能、数据新基建、AI系统、AI开源、AI for Science、AI安全等人工智能热门技术方向和焦点议题&#xff0c;召开了20平行论坛&#xff0c;共计百场报告。 过去…

Linux top 命令使用教程

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/139775547 文章目录 一、top 是什么二、top的基础语法三、top输出信息解读 一、top 是什么 Linux top 是一个在Linux和其他类 Unix 系统上常用的实时系统监控工具。它提供了一个动态的、交互式的实时…

基于JSP的房屋租赁系统

开头语&#xff1a; 你好&#xff0c;我是专注于计算机科学与技术研究的学长。如果你对房屋租赁系统感兴趣或有相关开发需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJavaBeansServlet 工具&#xff1a;MyEclipse、…

gRPC(Google Remote Procedure Call Protocol)谷歌远程过程调用协议

文章目录 1、gRPC简介2、gRPC核心的设计思路3、gPRC与protobuf关系 1、gRPC简介 gPRC是由google开源的一个高性能的RPC框架。Stubby Google内部的RPC&#xff0c;演化而来的&#xff0c;2015年正式开源。云原生时代是一个RPC标准。 2、gRPC核心的设计思路 网络通信 ---> gPR…

VM4.3 二次开发04 方案输出结果设置

方案输出结果设置&#xff0c;这个设置是为了在二次开发的上位机软件中显示我们想要的数据&#xff0c;和在二开中如何获取这些结果。 打开方案点下如中的图标。 打开如下图。 再点点红色圈出来的图标&#xff0c;打开参数设置界面。 输出设置可以要输出的数据和参数名称。点上…

【Linux】程序地址空间之动态库的加载

我们先进行一个整体轮廓的了解&#xff0c;随后在深入理解细节。 在动态库加载之前还要说一下程序的加载&#xff0c;因为理解了程序的加载对动态库会有更深的理解。 轮廓&#xff1a; 首先&#xff0c;不管是程序还是动态库刚开始都是在磁盘中的&#xff0c;想要执行对应的可…

隧道代理是什么?怎么运作的?

隧道代理作为网络代理的一种形式&#xff0c;已经在现代互联网世界中扮演着重要的角色。无论是保护隐私、访问受限网站还是实现网络流量的安全传输&#xff0c;隧道代理都发挥着重要作用。在本文中&#xff0c;我们将深入探讨隧道代理的概念、运作方式以及在不同场景中的应用。…

ClickHouse 高性能的列式数据库管理系统

ClickHouse是一个高性能的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;。以下是对ClickHouse的详细介绍&#xff1a; 基本信息&#xff1a; 来源&#xff1a;由俄罗斯的Yandex公司于2016年开源。全称&…

在向量数据库中存储多模态数据,通过文字搜索图片

在向量数据中存储多模态数据&#xff0c;通过文字搜索图片&#xff0c;Chroma 支持文字和图片&#xff0c;通过 OpenClip 模型对文字以及图片做 Embedding。本文通过 Chroma 实现一个文字搜索图片的功能。 OpenClip CLIP&#xff08;Contrastive Language-Image Pretraining&…

Eigen中 Row-Major 和 Column-Major 存储顺序的区别

Eigen中 Row-Major 和 Column-Major 存储顺序的区别 flyfish Eigen::RowMajor 是 Eigen 库中用于指定矩阵存储顺序的一种选项 理解 Row-Major 和 Column-Major 存储顺序的区别&#xff0c;绘制一个单一的图来显示内存中的元素访问顺序,在图中用箭头表示访问顺序. import nu…

【无重复字符的最长子串】

无重复字符的最长字串 一、题目二、解决方法1.暴力解法2.滑动窗口哈希 三、总结1.es6 new set()的用法添加元素add()删除元素delete()判断元素是否存在has 2.滑动窗口和双指针的联系和特点 一、题目 二、解决方法 1.暴力解法 解题思路&#xff1a;使用两层循环逐个生成子字符串…

Ardupilot开源代码之ExpressLRS性能实测方法

Ardupilot开源代码之ExpressLRS性能实测方法 1. 源由2. 测试效果3. 测试配置4. 总结5. 参考资料6. 补充 1. 源由 之前一直在讨论ExpressLRS性能的问题&#xff0c;有理论、模拟、实测。 始终缺乏完整的同一次测试的测试数据集&#xff0c;本章节将介绍如何在Ardupilot上进行获…

聆思CSK6大模型+AI交互多模态开源SDK介绍

视觉语音大模型 AI 开发套件( CSK6-MIX )是围绕 CSK6011A 芯片设计的具备丰富语音图像功能与硬件外设的开发板&#xff0c;采用具备丰富组件生态的 Zephyr RTOS作为操作系统&#xff0c;官方提供了十几种开源SDK&#xff0c;包含大模型语音交互、大模型拍照识图、文生图、人脸识…

spark常见问题

写文章只是为了学习总结或者工作内容备忘&#xff0c;不保证及时性和准确性&#xff0c;看到的权当个参考哈&#xff01; 1. 执行Broadcast大表时&#xff0c;等待超时异常&#xff08;awaitResult&#xff09; 现象&#xff1a;org.apache.spark.SparkException: Exception…