上篇主要讲解了MAX30102寄存器相关知识,这篇主要看下程序配置。
MAX30102寄存器配置
在一般的配置中我们让设备开机直接开始进入SpO2/HR 模式(PROX_INT_EN 置 0),设置两个LED的电流都为0x40,然后开启 RDY 中断使能。这样每次数据采集ok就可以中断一次去处理数据。
int8_t maxim_max30102_init(void)
{
max30102_Bus_Write(REG_MODE_CONFIG,0x40);
HAL_Delay(20);
max30102_Bus_Write(REG_INTR_ENABLE_1,0xE0);//C0 // INTR setting
max30102_Bus_Write(REG_INTR_ENABLE_2,0x00);
max30102_Bus_Write(REG_FIFO_WR_PTR,0x00); //FIFO_WR_PTR[4:0]
max30102_Bus_Write(REG_OVF_COUNTER,0x00); //OVF_COUNTER[4:0]
max30102_Bus_Write(REG_FIFO_RD_PTR,0x00); //FIFO_RD_PTR[4:0]
max30102_Bus_Write(REG_FIFO_CONFIG,0x4f); //0F //sample avg = 1, fifo rollover=false, fifo almost full = 17
max30102_Bus_Write(REG_MODE_CONFIG,0x03); //0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
max30102_Bus_Write(REG_SPO2_CONFIG,0x2A); //27 // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), LED pulseWidth (400uS)
max30102_Bus_Write(REG_LED1_PA,0x2F); //24 //Choose value for ~ 7mA for LED1
max30102_Bus_Write(REG_LED2_PA,0x2F); //24 // Choose value for ~ 7mA for LED2
// max30102_Bus_Write(REG_PILOT_PA,0x7f); // Choose value for ~ 25mA for Pilot LED
max30102_Bus_Write(REG_TEMP_CONFIG,0X01);
max30102_Bus_Read(REG_INTR_STATUS_1);
max30102_Bus_Read(REG_INTR_STATUS_2);
}
以上配置不是绝对的,根据自己的需求进行配置。
FIFO读取数据
MAX30102 FIFO 的深度为32,每个buf是6个字节(两通道数据,每通道3字节)。可以开启 PPG_RDY_EN,这样就能每来一个新的数据,就会中断一次通知我们去取数据。读FIFO_DATA 就会自动清掉中断标志位。
FIFO 寄存器
FIFO相关的寄存器有4个。虽然是显示均可读写(R/W),但是实际上只有 FIFO Read Pointer可以写(应用在读数据出错,往回重读一次的情况)。其他 FIFO 寄存器均为只读。
FIFO Write Pointer:
写指针寄存器。保存下一个新数据在 FIFO 中的写地址。每次来一个数据,这个写指针会自动移动一位。
Over Flow Counter:
如果32个FIFO深度满了,就会在这里增加1,表示溢出。
FIFO Read Pointer:
FIFO读指针,始终指向下一个待读取的FIFO地址。如果数据读取后,读地址也会自动增加。
FIFO Data Register:
可以简单的理解为 *FIFO_RD_PTR,始终指向下一个数据。
I2C寄存器映射中的FIFO_DATA寄存器指向要从FIFO读取的下一个样本。 FIFO_RD_PTR指向此样本。所以虽然通过连续读 FIFO_DATA 不会使该寄存器自增,但是 FIFO_DATA 寄存器实际是映射到FIFO_RD_PTR,而FIFO_RD_PTR 寄存器始终指向下一个待读取的数据,所以对FIFO_DATA 连续读,是能够实现的。读 FIFO 函数如下:
void max30102_fifo_read(float *output_data)
{
uint8_t receive_data[6];
uint32_t data[2];
max30102_i2c_read(REG_FIFO_DATA,receive_data);
data[0] = ((receive_data[0]<<16 | receive_data[1]<<8 | receive_data[2]) & 0x03ffff);
data[1] = ((receive_data[3]<<16 | receive_data[4]<<8 | receive_data[5]) & 0x03ffff);
*output_data = data[0];
*(output_data+1) = data[1];
}
采样率和精度设置
简单的说想要更高的ADC精度(位数),就得提高脉宽(增加ADC的采样时间)。但是脉宽又会受限制于采样率,如果采样率太高,这个每个周期的时间短可能太短,就不足以满足高采样率的脉宽要求。所以具体的设置参考下表:
两种模式各自允许设置采样率表
由上表可知,如果我们在SpO2模式想要ADC的精度为 17bits,脉宽只能为215us,且采样率最高只能到800Hz(也即灰色部分是我们不可设置的)。
还有一个接近功能检测,程序中未使用,我使用的是软件检测手指,这个博主写的很清楚,可以学习一下文章来源:https://www.toymoban.com/news/detail-462174.html
MAX30102 血氧调试笔记_YulongHe的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-462174.html
到了这里,关于基于STM32F030、MAX30102血氧心率监测仪的设计(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!