搞这个设计用时大约一周,中途遇到好多问题,查找资料乱七八糟,始终没有解决问题,只能自己慢慢的啃资料,本文章主要记录设计过程及记录遇到的问题,做个记录同时帮助有需要的朋友。

目前该设计已成功读取计算出血氧及心率数据,算法还需完善,程序中用的arm_math库,需要配置及安装及相应的库文件,具体安装配置,请查看博客文章

STM32F0系列单片机使用ARM_math_billjiang2008的博客-CSDN博客

安装arm_math库主要是算法的应用,如果使用其他算法,可略过。

程序仿真如下图所示:

没有优化,占用空间 Code=11436 RO-data = 448 RW-data=52 ZI-data = 3164

这个空间,我认为STM32F030F4P6就可以了 (我没有测试),我使用的是STM32F030C8T6。

一、项目过程主要使用了2种方式读取MAX30102 FIFO的数据

第一种:中断方式  ----本文主要介绍中断读取数据

第二种:定时器方式  ----定时读取FIFO数据   后续介绍

二、硬件接线:使用模拟IIC读取

SCL --- PA12

SDA --- PA11

INT --- PC15 (配置为外部中断,上拉)

三、下面主要介绍MAX30102相关知识

MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块(芯片)。 它集成了一个660nm红光LED、880nm红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。 可通过软件关断模块,待机电流为零,实现电源始终维持供电状态,可运用于低功耗产品中。

MAX30102采用一个1.8V电源和一个独立的3.3V用于内部LED的电源,标准的I2C兼容的通信接口。 市面很多都将MAX30102芯片集成在一个PCB模块上,内部增加一个1.8V和3.3V LDO稳压电路,可对模块单独供5.0V电源,方便开发者进行开发。

芯片内部框图

从框图看,芯片可分为两部分,一部分为模拟信号采集电路,通过RED和IR灯发出特定波长的光,采集人体反射回来的光,经过PD管将光信号转化为电信号,最终通过18bit ADC转换器转化为数字信号。

第二部分为数字处理电路,将ADC转换出来的原始数据进行滤波处理后放置于缓冲区内; 单片机通过IIC接口读写芯片内部寄存器,读取出相应的数据;

2. 模块电路

芯片内部有3.3V-5.0V的LED电源和1.8V的逻辑电源,所以模块带有两路稳压电路,将5V电源分别转化为3.3V和1.8V;由于LED驱动电源的供电范围为3.3V-5.0V,3.3V稳压电路可省去。

由于MAX30102的逻辑电路的IIC通信电平为1.8V,这与我们常用的51单片机和STM32单片机的引脚电平不匹配。

这里有个解决方法,因为MAX30102的SDA、SCL、INT引脚为开漏,(加上拉电阻)

可以将模块上的R1、R2、R3电阻去掉,对于51单片机来说,在SDA、SCL、INT引脚上分别加一个4.7-10k电阻上拉至5V;对于STM32单片机,只需要将相应的控制引脚配置为上拉模式即可。

3、寄存器

寄存器0X00-0X01

当中断被触发时,MAX30102将中断引脚拉入低状态,直到中断被清除。

A_FULL: FIFO快满标志

在SpO2和HR模式下,当FIFO写指针有一定数量的剩余空闲空间时,这个中断就会触发。触发器编号可以由FIFO_A_FULL[3:0]寄存器设置。通过读取中断状态1寄存器(Ox00)来清除中断。PPG_RDY:新的FIFO数据就绪

在SpO2和HR模式下,当数据FIFO中有一个新的样本时,这个中断就会触发。通过读取中断状态1寄存器(Ox00)或读取FIFO_DATA寄存器来清除中断。

ALC_OVF:环境光消除溢出

当SpO2/HR光电二极管的环境光抵消功能达到其最大限制时,这种中断就会触发,因此,环境光正在影响ADC的输出。通过读取中断状态1寄存器(Ox00)来清除中断。

PROX_INT:接近阈值触发接近性中断

在接近性阈值达到时触发,SpO2/HR模式已经开始。这让主机处理器知道开始运行SpO2/HR算法并收集数据。通过读取中断状态1寄存器(Ox00)来清除中断。

PWR_RDY:电源就绪标志

在上电或停电后,当电源电压VpD从低于欠压锁定(UVLO)电压转换到高于UVLO电压时,将触发电源就绪中断,以发出模块已上电并准备收集数据的信号。

DIE_TEMP_RDY:内部温度就绪标志

当内部晶片温度转换完成时,这个中断被触发,这样处理器就可以读取温度数据寄存器。通过读取中断状态2寄存器(Ox01)或TFRAC寄存器(0x20)来清除中断。

当读取中断状态寄存器或读取触发中断的寄存器时,中断将被清除。例如,如果SpO2传感器由于完成转换而触发中断,读取FIFO数据寄存器或中断寄存器清除中断引脚(返回正常的HIGH状态)。这也将中断状态寄存器中的所有位清除为零。

除电源就绪中断外,每个硬件中断源都可以在MAX30102 IC内的软件寄存器中禁用。电源就绪中断不能禁用,因为模块的数字状态在断电条件(低电源电压)时被重置,默认条件是所有中断都被禁用。此外,重要的是让系统知道已经发生了停电情况,并因此重置模块内的数据。

为了正常操作,未使用的位应始终设置为零。

FIFO写指针

FIFO写指针指向MAX30102写入下一个示例的位置。这个指针向前推进每个样品推向先进先出。当MODE[2:0]为010、011或111时,也可以通过I2C接口进行修改。

FIFO溢出计数器

当FIFO满时,样品不会推送到FIFO,样品丢失。OVF_cOUNTER计算丢失的样本数量。它在OxF处饱和。当一个完整的样本从FIFO“弹出”(即,删除旧的FIFO数据并向下移动样本)(当读指针前进时),OVF_cOUNTER被重置为零。

FIFO读指针

FIFO读指针指向处理器通过2C接口从FIFO中获取下一个样本的位置。每次从FIFO弹出一个样本时,都会向前推进。处理器还可以在读取样本后写入该指针,以便在出现数据通信错误时从FIFO中重新读取样本。

FIFO数据寄存器循环FIFO深度为32,最多可容纳32个数据样本。样本大小取决于配置为活动的LED通道(也称为通道)的数量。由于每个通道信号存储为一个3字节的数据信号,因此FIFO宽度可以是3字节或6字节。

12C寄存器映射中的FIFO_DATA寄存器指向要从FIFO读取的下一个样本。FIFO_RD_PTR指向这个示例。读取FIFO_DATA寄存器时,不会自动增加I2C寄存器地址。连续读取这个寄存器,一遍又一遍地读取同一个地址。每个样本每个通道有3个字节的数据(例如,RED有3个字节,IR有3个字节,等等)。

FIFO寄存器(Ox04-Ox07)都可以写入和读取,但在实际操作中只应该写入FIFO_RD_PTR寄存器。其余的由MAX30102自动递增或填充数据。当开始新的SpO2或心率转换时,建议首先将FIFO_WR_PTR、OVF_coUNTER和FIFO_RD_PTR寄存器清除到全零(Ox00),以确保FIFO为空并处于已知状态。在一个突发读入I2C事务中读取MAX30102寄存器时,寄存器地址指针通常会增加,以便发送的下一个字节的数据来自下一个寄存器,等等。这方面的例外是FIFO数据寄存器,寄存器OxO7。当读取这个寄存器时,地址指针不递增,但是FIFO_RD_PTR递增。因此,发送数据的下一个字节表示FIFO中可用数据的下一个字节。

进入和退出接近模式(当PROX_INT_EN=1时)通过设置写指针和读指针相等来清空FIFO。

从FIFO读取数据,通常从12C接口读取寄存器会自动增加寄存器地址指针,这样所有的寄存器都可以在没有12C启动事件的情况下以突发方式读取。在MAX30102中,这适用于除FIFO_DATA寄存器(寄存器Ox07)之外的所有寄存器。读取FIFO_DATA寄存器不会自动增加寄存器地址。突发读取这个寄存器从同一个地址反复读取数据。每个示例包含多个字节的数据,因此应该从这个寄存器读取多个字节(在同一个事务中)以获得一个完整的示例。另一个例外是OxFF。在OxFF寄存器之后读取更多字节不会将地址指针向前推进到Ox00,读取的数据没有意义。

FIFO数据结构,数据FIFO由32个样本存储库组成,可以存储IR和Red ADC数据。由于每个样本由两个通道的数据组成,每个样本有6个字节的数据,因此在FIFO中可以存储192个字节的数据。FIFO数据左对齐如下图所示;换句话说,无论ADC分辨率设置如何,MSB位始终处于第17位数据位置。有关FIFO数据结构的可视化表示,请参见下图。

FIFO数据每个通道包含3个字节FIFO 数据是左对齐的,这意味着无论ADC分辨率设置如何,MSB总是在相同的位置。FIFO DATA[18] ~[23]未使用。表2显示了每组字节的结构(包含每个通道的18位ADC数据输出)。在SpO2模式下,每个数据样本包含两个数据三元组(每个数据三元组3个字节),要读取一个样本,需要对每个字节执行I2C读取命令。因此,以SpO2模式读取一个样本,需要6个I2C字节读取。

FIFO读指针,在读取每个样本的第一个字节后自动递增。写/读指针写/读指针用于控制FIFO中的数据流。每当一个新样本被添加到FIFO时,写指针递增。每次从FIFO读取样本时,读指针都会递增。若要从FIFO中重新读取一个样本,请将其值减去1并再次读取数据寄存器。

当进入SpO2模式或HR模式时,需要清空FIFO读写指针(回到Ox00),以便在FIFO中没有旧数据。如果VDD电源循环或VDD低于其UVLO电压,指针将自动清除。

Bits 7:5:

样本平均(SMP_AVE)为了减少数据吞吐量,相邻的样本(在每个单独的通道)可以通过设置这个寄存器在芯片上平均和抽取。

位4:

FIFO滚满(FIFO_ROLLOVER_EN)当FIFO完全被数据填满时,这个位控制FIFO的行为。如果设置了“FIFO ROLLOVER EN”(1),则FIFO地址滚到零,FIFO继续填充新的数据。如果位未设置(O),则FIFO不会更新,直到FIFO_DATA被读取或WRITE/ read指针位置被更改。

Bits 3:0:

FIFO Almost Full Value (FIFO_A_FULL)该寄存器设置中断发出时FIFO中剩余的数据样本数量(3字节/样本)。例如,如果该字段设置为Ox0,则当FIFO中剩余O个数据样本(所有32个FIFO单词都有未读数据)时发出中断。此外,如果该字段设置为OxF,则当FIFO中剩余15个数据样本(17个FIFO数据样本有未读数据)时发出中断。

第7位:

关机控制(SHDN)通过将该位设置为1,该部件可以进入省电模式。在省电模式下,所有寄存器保留其值,写/读操作正常进行。在这种模式下,所有中断都被清除为零。

第6位:

复位控制(Reset)当RESET位设置为1时,所有配置、阈值和数据寄存器都将通过上电重置重置到它们的上电状态。RESET位在重置顺序完成后自动归零。注意:设置RESET位不会触发PWR_RDY中断事件。

BIT2:0:

模式控制这些位设置MAX30102的工作状态。改变模式不会改变任何其他设置,也不会删除之前存储在数据寄存器中的任何数据。

BIT6:5:

SpO2 ADC范围控制该寄存器设置SpO2传感器ADC的满量程范围,如下所示。

BIT4:2:

SpO2采样率控制这些位定义有效采样率,一个样本由一个IR脉冲/转换和一个红色脉冲/转换组成。采样率和脉冲宽度是相关的,因为采样率在脉冲宽度时间上设置了一个上限。如果用户选择的采样率对于所选的LED_PW设置太高,则将最高的采样率编程到寄存器中。

  在配置采样周期时一定要注意如下2个表格

 位1:0:

LED脉冲宽度控制和ADC分辨率这些位设置了LED的脉宽(IR和Red具有相同的脉宽),因此,间接地设置了每个样本中ADC的积分时间。ADC分辨率与积分时间直接相关。

温度相关寄存器如下

就介绍到这里了,下篇继续。

基于STM32F030、MAX30102血氧心率监测仪的设计(一)相关推荐

  1. 基于STM32F030、MAX30102血氧心率监测仪的设计(三)

    本篇主要记录一下开发过程中遇到的问题与解决. max30102模块是某宝上购买的,价格不贵5元左右,如下图所示. 使用引脚为SDA.SCL.INT.VIN.GND 拿到模块后,看着资料开始移植程序,我 ...

  2. 基于STM32F030、MAX30102血氧心率监测仪的设计(二)

    上篇主要讲解了MAX30102寄存器相关知识,这篇主要看下程序配置. MAX30102寄存器配置 在一般的配置中我们让设备开机直接开始进入SpO2/HR 模式(PROX_INT_EN 置 0),设置两 ...

  3. 基于STM32F030、MAX30102血氧心率监测仪的设计(四)

    这篇主要分享代码,不做过多介绍! #include "myiic.h"#define CPU_FREQUENCY_MHZ 48 // STM32时钟主频void iic_delay ...

  4. spo2数据集_Arduino 血氧心率模块传感器数据采集

    开发环境: Arduino-1.8.5-windows.exe.HXDZ-30102-ACC 硬件设备: MAX30102 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块. 它集成 ...

  5. 血氧心率测量仪(带温湿度测量功能)OLED显示

    血氧心率测量仪(带温湿度测量功能)OLED显示 原理图资料 模块说明 测试数据处理图 部分代码展示 资料包 原理图资料 模块说明 数字温湿度传感 DHT11 ►相对湿度和温度测量 ►全部校准,数字输出 ...

  6. spo2数据集_自己翻译的Max30100寄存器中文资料(血氧心率传感器IC)

    Max30100 可穿戴光电式的血氧心率传感器IC 总体描述: Max30100是一款集成的脉搏血氧和心率检测传感器.它使用了两个LED灯,一个用来优化光学的光电探测器,和低噪声模拟信号处理器,用来检 ...

  7. STM32WB55大半年开发记录,血氧心率检测手环

    1.STM32WB55开发经验 在长达大半年的STM32WB55蓝牙手环开发的过程当中,让我感受到了这款芯片的魅力和ST为其倾力打造的生态环境是真的很不错! 不过在开发STM32WB55这款芯片的时候 ...

  8. 基于单片机MAX30100血氧、心率检测系统设计-整套资料

    基于美信MAX30100/MAX30102传感器设计的血氧和心率检测,以单片机STM32F103CBT6为主控核心,其中涉及电源模块.心率血氧模块.蓝牙模块.电源模块是提供所有系统的供电,心率血氧是整 ...

  9. 基于单片机心率脉搏心率血压体温血氧检测系统的设计与实现

    功能介绍 本次设计通过32系列单片机STM32进行数据处理,配置引脚和JFC103传感器以及温度传感器进行数据通信.采用防水DS18B20进行腋下温度采集,通过单总线方式进行数据传输.心率血氧血压模块 ...

最新文章

  1. WSAGetLastError返回的可能错误代码
  2. 接口测试入门软件及使用注意事项
  3. Luogu P4708 画画 (Burnside引理、组合计数、划分数)
  4. Hadoop-2.8.0集群搭建、hadoop源码编译和安装、host配置、ssh免密登录、hadoop配置文件中的参数配置参数总结、hadoop集群测试,安装过程中的常见错误
  5. SAP Hybris Commerce里的数据库表
  6. [MobX State Tree数据组件化开发][3]:选择正确的types.xxx
  7. Abp vNext 切换MySql数据库
  8. iptables 开放远程_JavaWeb项目的部署以及远程调试
  9. 《大话设计模式》读书笔记-索引
  10. 又有程序员把产品经理给打了!
  11. react 生命挂钩_角生命周期挂钩:ngOnChanges,ngOnInit等
  12. SAP License:资产年结
  13. OpenCV-绘制圆端矩形(药丸)
  14. [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序...
  15. duilib开发(十二):使用自定义控件
  16. 一分钟了解光纤、单模光纤、多模光纤
  17. 小飞升值记——(9)
  18. Latex:Tikz脑图(Mindmap)如何添加新结点并调整结点位置
  19. c# 正则匹配,匹配括号,中括号等
  20. 2017 robotart x86_RobotArt:机器人离线编程仿真软件领航者

热门文章

  1. 【机器学习】特征编码OneHot与Dummy的区别与联系
  2. 2021年电赛 E题 数字传输
  3. HashMap的工作原理(一):Hash算法
  4. solr搜索服务的使用
  5. keil最新版安装以及PJ
  6. yl335b分拣站单元流程图_基于PLC与MCGS的YL-335B分拣单元的创新设计
  7. 部分iphone机型无法实现css的animation动画效果(无效, 失效)
  8. UE4 蓝图Structure与Json的读写
  9. 前端入门——JavaScript
  10. 去除office非正版提示的方法(转)