赞
踩
最近在学习使用MAX30102传感器,但网络上的文章大都只是给出示例代码而没有较为详细的介绍,本文章结合官方文档和网上资料,记录并分享我对该传感器的认识。文章末尾给出基于Arduino的简单的MAX30102库,注释较为详细。该代码在ESP8266上可运行,但只实现了简单的数据访问。
MAX30102脉搏血氧仪和心率传感器包含两个LED,分别发射红光(RED)和红外光(IR),光线照射进人体组织后一部分被吸收,另一部分反射光被集成的光电传感器捕获、转变为电信号。两种光的电信号都会呈现出具有直流(DC)成分的交流(AC)信号,AC成分的频率就是脉搏频率,使用任何一个电信号就能获得心跳频率。
血氧浓度(SpO2)的计算需要同时使用两个电信号,估算SpO2,以下线性近似公式来自MAX3010X用户手册:
R
=
AC
red
/
DC
red
AC
ir
/
DC
ir
SpO
2
=
(
104
−
17
R
)
×
100
%
该传感器使用IIC总线与主机通信,通过读写传感器上的寄存器控制它的运转。在Arduino中,读寄存器大致需要以下步骤:
Wire.beginTransmission(ADDRESS_OF_MAX30102); //select slave
Wire.write(ADDRESS_OF_REGISTER); //send the register's address
Wire.endTransmission();
Wire.requestFrom(ADDRESS_OF_MAX30102, sizeof(required_data)); // ask for reading
if (Wire.available()) {
int val = Wire.read(); //read 1 byte from max30102
// ... continue to read if required_data is more than 1 byte.
}
写寄存器与其类似:
Wire.beginTransmission(ADDRESS_OF_MAX30102);
Wire.write(ADDRESS_OF_REGISTER);
Wire.write(one_byte_of_data); //write1 byte to max30102
Wire.endTransmission();
以下主要介绍我在编程中使用到的寄存器和寄存器位,更详细的内容可以查看MAX30102数据手册
MAX30102传感器具有一个中断引脚,当传感器发生某些事件后,该引脚会从高电平跳变为低电平,触发主机的中断事件。该中断引脚只有一根,所以主机需要读取中断状态寄存器来判断引起中断的事件。
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
Interrupt Status 1 | A_FULL | PPG_RDY | ALC_OVF | \ | \ | \ | \ | PWR_RDY |
Interrupt Status 2 | \ | \ | \ | \ | \ | \ | DIE_TEMP_RDY | \ |
其中某一比特为1则表示该事件发生。
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
Interrupt Enable 1 | A_FULL_EN | PPG_RDY_EN | ALC_OVF_EN | \ | \ | \ | \ | \ |
Interrupt Enable 2 | \ | \ | \ | \ | \ | \ | DIE_TEMP_RDY_EN | \ |
即可读也可写,对应0x00和0x01的中断比特,置1表示可以由该事件引起中断。
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
FIFO Write Pointer | \ | \ | \ | FIFO_WR_PTR[4] | [3] | [2] | [1] | [0] |
Over Flow Counter | \ | \ | \ | OVF_COUNTER[4] | [3] | [2] | [1] | [0] |
FIFO Read Pointer | \ | \ | \ | FIFO_RD_PTR[4] | [3] | [2] | [1] | [0] |
FIFO Data Register | FIFO_DATA[7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] |
一般在初始化时将FIFO_WR_PTR、FIFO_RD_PTR和OVF_COUNTER设置为0。
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
FIFO Configuration | SMP_AVE[2] | [1] | [0] | FIFO_ROLLOVER_EN | FIFO_A_FULL[3] | [2] | [1] | [0] |
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
Mode Configuration | SHDN | RESET | \ | \ | \ | MODE[2] | [1] | [0] |
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
SpO2 Configuration | \ | SPO2_ADC_RGE[1] | [0] | SPO2_SR[2] | [1] | [0] | LED_PW[1] | [0] |
实际的采样速率由SPO2_SR和LED_PW共同决定,在心率模式和血氧模式下不同的搭配方法会出现不同的采样速率,具体可见MAX30102数据手册的Table 11. SpO2 Mode (Allowed Settings)及Table 12. HR Mode (Allowed Settings)。
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
LED Pulse Amplitude 1 | LED1_PA[7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] |
LED Pulse Amplitude 2 | LED2_PA[7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] |
这两个寄存器控制两个LED的典型电流大小,影响亮度。在MAX30102上,LED1是红光LED、LED2是红外光LED。LED_PA在0x00到0xFF之间变化,值越大所需的电流就越大。
由于我所需的功能在SpO2模式下就能完成,所以并没有详细了解多LED模式。
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
Die Temp Integer | TINT[7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] |
Die Temp Fraction | \ | \ | \ | \ | TFRAC[3] | [2] | [1] | [0] |
Die Temperature Config | \ | \ | \ | \ | \ | \ | \ | TEMP_EN |
加入TINT=0x25=3710、TFRAC=0x8=810,则实际温度是 37 + 8 × 0.0625 = 37. 5 ∘ C 37+8\times 0.0625=37.5^{\circ}\text{C} 37+8×0.0625=37.5∘C。
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
Revision ID | REV_ID[7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] |
Part ID | PART_ID[7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。