搞这个设计用时大约一周,中途遇到好多问题,查找资料乱七八糟,始终没有解决问题,只能自己慢慢的啃资料,本文章主要记录设计过程及记录遇到的问题,做个记录同时帮助有需要的朋友。
目前该设计已成功读取计算出血氧及心率数据,算法还需完善,程序中用的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分辨率与积分时间直接相关。
温度相关寄存器如下
文章来源:https://www.toymoban.com/news/detail-422247.html
就介绍到这里了,下篇继续。文章来源地址https://www.toymoban.com/news/detail-422247.html
到了这里,关于基于STM32F030、MAX30102血氧心率监测仪的设计(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!