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

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

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

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

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

程序仿真如下图所示:

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第1张图片

没有优化,占用空间 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电源,方便开发者进行开发。

芯片内部框图

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第2张图片

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

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

2. 模块电路

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第3张图片

芯片内部有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单片机,只需要将相应的控制引脚配置为上拉模式即可。

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第4张图片

3、寄存器

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第5张图片

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第6张图片

 寄存器0X00-0X01

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第7张图片

当中断被触发时,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状态)。这也将中断状态寄存器中的所有位清除为零。

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第8张图片

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

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

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第9张图片

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数据结构的可视化表示,请参见下图。

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第10张图片

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第11张图片

         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电压,指针将自动清除。

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第12张图片

Bits 7:5:

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

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第13张图片

位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数据样本有未读数据)时发出中断。 

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第14张图片

 

第7位:

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

第6位:

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

BIT2:0:

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

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第15张图片

 

BIT6:5:

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

BIT4:2:

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

 基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第16张图片

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

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第17张图片 位1:0:

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

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第18张图片

温度相关寄存器如下

基于STM32F030、MAX30102血氧心率监测仪的设计(一)_第19张图片

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

你可能感兴趣的:(单片机,嵌入式硬件)