【STM32+HAL库】---- 驱动MAX30102心率血氧传感器
硬件开发板:STM32F407VET6软件平台:cubemax+keil+VScode
1 MAX30102心率血氧传感器工作原理
MAX30102传感器是一种集成了红外光源、光电检测器和信号处理电路的高度集成传感器,主要用于心率和血氧饱和度的测量。以下是MAX30102传感器的主要特点和工作原理:
-
红外光源:MAX30102传感器内部集成了红外LED光源,用于照射到皮肤表面。红外光在血液中的反射特性可用于测量心率和血氧饱和度。
-
光电检测器:传感器还集成了光电检测器,用于接收皮肤表面反射的光信号。这些光信号中包含了经过血液的红外光的吸收情况,根据吸收的程度可以推断出血液中的血氧饱和度。
-
信号处理电路:MAX30102传感器内部还集成了一系列的信号处理电路,用于对接收到的光信号进行滤波、放大、数字化等处理。经过处理后的信号可以直接输出给微控制器进行进一步的处理和分析。
-
工作原理:MAX30102传感器的工作原理基于红外光在血液中的吸收特性。红外光能够穿透皮肤并被血液吸收,血液中的氧合血和脱氧血对红外光的吸收程度不同,因此可以通过测量红外光的吸收情况来推断血液的氧合状态。传感器利用LED发出的光照射到皮肤表面,然后通过光电检测器接收经过皮肤反射的光信号,并根据光信号的变化来计算心率和血氧饱和度。
综上所述,MAX30102传感器通过红外光源和光电检测器实现了对心率和血氧饱和度的测量,具有高度集成、精准度高、成本低廉等特点,在医疗监护、健康监测等地方有着广泛的应用。
2 cubemx配置
2.1 配置烧录环境
2.2 启用外部时钟
2.3 配置时钟树
2.4 配置串口
打印调试输出
2.5 配置IIC
2.6 配置结束,导出工程
3 程序
3.1 MAX30102.h
/** * ************************************************************************ * * @file MAX30102.h * @author zxr * @brief * * ************************************************************************ * @copyright Copyright (c) 2024 zxr * ************************************************************************ */#ifndef _MAX30102_H#define _MAX30102_H#include \"main.h\" // Device header#include \"i2c.h\"#include \"stdbool.h\"#define MAX30102_Device_address 0xAE//register addresses#define REG_INTR_STATUS_1 0x00#define REG_INTR_STATUS_2 0x01#define REG_INTR_ENABLE_1 0x02#define REG_INTR_ENABLE_2 0x03#define REG_FIFO_WR_PTR 0x04#define REG_OVF_COUNTER 0x05#define REG_FIFO_RD_PTR 0x06#define REG_FIFO_DATA 0x07#define REG_FIFO_CONFIG 0x08#define REG_MODE_CONFIG 0x09#define REG_SPO2_CONFIG 0x0A#define REG_LED1_PA 0x0C#define REG_LED2_PA 0x0D#define REG_PILOT_PA 0x10#define REG_MULTI_LED_CTRL1 0x11#define REG_MULTI_LED_CTRL2 0x12#define REG_TEMP_INTR 0x1F#define REG_TEMP_FRAC 0x20#define REG_TEMP_CONFIG 0x21#define REG_PROX_INT_THRESH 0x30#define REG_REV_ID 0xFE#define REG_PART_ID 0xFF#define SAMPLES_PER_SECOND 100//检测频率uint8_t Max30102_reset(void);void MAX30102_Config(void);void max30102_read_fifo(void);uint8_t max30102_write_reg(uint8_t addr, uint8_t data);uint8_t max30102_read_reg(uint8_t addr );#endif
3.2 MAX30102.c
/** * ************************************************************************ * * @file MAX30102.c * @author zxr * @brief * * ************************************************************************ * @copyright Copyright (c) 2024 zxr * ************************************************************************ */#include \"MAX30102.h\"uint16_t fifo_red; //定义FIFO中的红光数据uint16_t fifo_ir; //定义FIFO中的红外光数据/** * ************************************************************************ * @brief 向MAX30102寄存器写入一个值 * * @param[in] addr 寄存器地址 * @param[in] data 传输数据 * * @return * ************************************************************************ */uint8_t max30102_write_reg(uint8_t addr, uint8_t data){ HAL_I2C_Mem_Write(&hi2c1, MAX30102_Device_address,addr,1,&data,1,HAL_MAX_DELAY); return 1;}/** * ************************************************************************ * @brief 读取MAX30102寄存器的一个值 * * @param[in] addr 寄存器地址 * * @return * ************************************************************************ */uint8_t max30102_read_reg(uint8_t addr ){ uint8_t data=0; HAL_I2C_Mem_Read(&hi2c1, MAX30102_Device_address, addr, 1, &data, 1, HAL_MAX_DELAY); return data;}/** * ************************************************************************ * @brief MAX30102传感器复位 * * * @return * ************************************************************************ */uint8_t Max30102_reset(void){ if(max30102_write_reg(REG_MODE_CONFIG, 0x40)) return 1; else return 0; }/** * ************************************************************************ * @brief MAX30102传感器模式配置 * * * ************************************************************************ */void MAX30102_Config(void){ max30102_write_reg(REG_INTR_ENABLE_1,0xc0);//// INTR settingmax30102_write_reg(REG_INTR_ENABLE_2,0x00);//max30102_write_reg(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]max30102_write_reg(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]max30102_write_reg(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]max30102_write_reg(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17max30102_write_reg(REG_MODE_CONFIG,0x03);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LEDmax30102_write_reg(REG_SPO2_CONFIG,0x27);// SPO2_ADC range = 4096nA, SPO2 sample rate (50 Hz), LED pulseWidth (400uS) max30102_write_reg(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1max30102_write_reg(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2max30102_write_reg(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED}/** * ************************************************************************ * @brief 读取FIFO寄存器的数据 * * * ************************************************************************ */void max30102_read_fifo(void){ uint16_t un_temp; fifo_red=0; fifo_ir=0; uint8_t ach_i2c_data[6]; //read and clear status register max30102_read_reg(REG_INTR_STATUS_1); max30102_read_reg(REG_INTR_STATUS_2); ach_i2c_data[0]=REG_FIFO_DATA;HAL_I2C_Mem_Read(&hi2c1,MAX30102_Device_address,REG_FIFO_DATA,1,ach_i2c_data,6,HAL_MAX_DELAY); un