文章目录
前言(文末获取源码)
Maxim MAX30102传感器是一款集成脉搏血氧仪和心率监测器模块。MAX30102 包括内部 LED、光电探测器、光学元件以及低噪声电子元件,具有环境光反射特征。该高灵敏度器件由 1.8V 单电源供电,其内部 LED 由独立的 5.0V 电源供电。通过标准的 I2C 兼容接口进行通信。该传感器可通过软件来关断电源,待机模式下的电流消耗量几乎为零。
一、PPG信号简介
简单来说PPG信号就是光照照射在皮肤组织上时,由于血液流动造成对光的吸收率不同,而其它组织(例如骨骼,肌肉)对光的吸收率基本不变,导致光的反射率随血液流动情况改变的信号。如下图所示,直流信号DC反映的是组织、骨骼、肌肉、静脉血等等,交流信号AC则是反映了动脉血流动情况。根据AC、DC信号能够计算出心率、血氧,详细的计算公式在下一章进行介绍。
二、MAX30102简介
1.总体结构
可以看到,MAX30102结构包括两个光电二极管(RED:红光 IR:红外)、接收器、ADC通道、数字滤波器、数据寄存器和I2C通信模块。
2.寄存器
寄存器包括三大部分:状态寄存器、设置寄存器、温度寄存器。另外还有版本号和设备ID的寄存器,如下图。
三、使用步骤
1.I2C通信
和一般的I2C通信方式不同,MAX30102的读写时序如下
程序如下:
void max30102\_i2c\_write(uint8\_t reg_adder,uint8\_t data)
{
uint8\_t transmit_data[2];
transmit_data[0] = reg_adder;
transmit_data[1] = data;
i2c\_transmit(transmit_data,2);
}
void max30102\_i2c\_read(uint8\_t reg_adder,uint8\_t \*pdata, uint8\_t data_size)
{
uint8\_t adder = reg_adder;
i2c\_transmit(&adder,1);
i2c\_receive(pdata,data_size);
}
2.MAX30102初始化
对照datasheet设置采样率,工作模式,led电流等等参数的设置。下面作为参考,实际使用的效果还是很好的。
void max30102\_init(void)
{
uint8\_t data;
max30102\_i2c\_write(MODE_CONFIGURATION,0x40); //reset the device
delay\_ms(5);
max30102\_i2c\_write(INTERRUPT_ENABLE1,0xE0);
max30102\_i2c\_write(INTERRUPT_ENABLE2,0x02); //interrupt enable: FIFO almost full flag, new FIFO Data Ready,
// ambient light cancellation overflow, power ready flag,
// internal temperature ready flag
max30102\_i2c\_write(FIFO_WR_POINTER,0x00);
max30102\_i2c\_write(FIFO_OV_COUNTER,0x00);
max30102\_i2c\_write(FIFO_RD_POINTER,0x00); //clear the pointer
max30102\_i2c\_write(FIFO_CONFIGURATION,0x0F); //FIFO configuration: sample averaging(1),FIFO rolls on full(0), FIFO almost full value(15 empty data samples when interrupt is issued)
max30102\_i2c\_write(MODE_CONFIGURATION,0x03); //FIFO configuration:SpO2 mode
max30102\_i2c\_write(SPO2_CONFIGURATION,0x26); //SpO2 configuration:ACD resolution:15.63pA,sample rate control:100Hz, LED pulse width:215 us
max30102\_i2c\_write(LED1_PULSE_AMPLITUDE,0x2f);
max30102\_i2c\_write(LED2_PULSE_AMPLITUDE,0x2f); //LED current
max30102\_i2c\_write(TEMPERATURE_CONFIG,0x01); //temperture
max30102\_i2c\_read(INTERRUPT_STATUS1,&data,1);
max30102\_i2c\_read(INTERRUPT_STATUS2,&data,1);//clear the flag
}
3.读取数据
采用轮询的方式,未用到引脚中断信号。用过中断引脚的信息,发现读出来的数据波形不太好,用10-15ms延时读取是比较好的。
void max30102\_fifo\_read(uint32\_t \*data)
{
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**


**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**