当前位置:   article > 正文

MAX30102健康检测传感器_max30102的i2c地址在哪看

max30102的i2c地址在哪看

1.基础资料

MAX30102 是 Maxim Integrated 公司开发的一款高灵敏度光学脉搏血氧传感器。以下是关于 MAX30102 的详细介绍:

1.1.背景介绍

MAX30102 是一款集成了 LED 和光电二极管的心率和血氧监测传感器。它主要被用于可穿戴设备,如智能手表、健身追踪器等,能够实时监测用户的心率和血氧饱和度(SpO2)。

1.2.发展前景

随着健康监测需求的增加,尤其在疫情期间,个人健康监测设备的市场需求急剧上升。MAX30102 作为一款高精度且低功耗的传感器,具有广阔的市场前景。未来,它可能会在更多的医疗设备和个人健康监测产品中得到应用,推动可穿戴健康监测设备的发展。

1.3.应用领域

MAX30102 的主要应用领域包括:

  • 可穿戴设备:如智能手表、健身追踪器等,用于实时监测心率和血氧水平。
  • 医疗设备:便携式血氧仪、心率监测仪等。
  • 运动健康:用于运动员和健身爱好者的心率和血氧监测,以优化训练和恢复。
  • 睡眠监测:用于检测睡眠呼吸暂停等问题。

1.4.工作原理

MAX30102 通过光电容积脉搏波描记法(PPG)来测量心率和血氧饱和度。其工作原理如下:

  1. 发射光线:传感器内部的红光和红外光 LED 向皮肤发射光线。
  2. 光线吸收和反射:血液中的血红蛋白会吸收部分光线,剩余的光线被反射回传感器。
  3. 光电探测:反射回来的光线被光电二极管接收,并转换成电信号。
  4. 信号处理:传感器内部的模拟前端(AFE)对电信号进行放大和滤波,得到脉搏波信号。
  5. 数据输出:通过 I2C 接口,将处理后的数据传输给主控芯片进行进一步分析和处理。

1.5.基本结构

MAX30102 的基本结构包括:

  • LED:红光 LED 和红外光 LED,用于发射光线。
  • 光电二极管:用于接收反射回来的光线。
  • 模拟前端(AFE):用于信号放大和滤波,包括一个 19 位 ADC(模数转换器)。
  • I2C 接口:用于与外部主控芯片通信,传输测量数据。
  • 集成温度传感器:用于校正温度影响,提高测量精度。
  • 电源管理模块:用于控制传感器的供电,实现低功耗设计。

MAX30102 通过高度集成的设计,实现了紧凑的尺寸和低功耗,非常适合用于可穿戴设备和便携式医疗设备。

2.pin to pin(引脚)

        编写相应的初始化和数据获取代码。以下是基于 C 语言和 wiringPi 库的示例代码,包括初始化、功能自定义、数据获取和数据转换。

2.1.初始化和基本设置

  • SCL (Pin 2): 连接到 I2C 时钟引脚(例如 Raspberry Pi 的 GPIO 3)。
  • SDA (Pin 3): 连接到 I2C 数据引脚(例如 Raspberry Pi 的 GPIO 2)。
  • PGND (Pin 4): 连接到电源地。
  • VLED+ (Pin 9, 10): 连接到 LED 电源(通常为 3.3V 或 5V)。
  • VDD (Pin 11): 连接到模拟电源输入(通常为 3.3V)。
  • GND (Pin 12): 连接到模拟地。
  • INT (Pin 13): 可以连接到 GPIO 引脚用于中断(可选)。

 2.2.引脚分布图

 2.3.代码示例

  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <unistd.h>
  4. #include <wiringPiI2C.h>
  5. // MAX30102 I2C 地址
  6. #define MAX30102_ADDRESS 0x57
  7. // MAX30102 寄存器地址
  8. #define REG_INTR_STATUS_1 0x00
  9. #define REG_INTR_STATUS_2 0x01
  10. #define REG_INTR_ENABLE_1 0x02
  11. #define REG_INTR_ENABLE_2 0x03
  12. #define REG_FIFO_WR_PTR 0x04
  13. #define REG_OVF_COUNTER 0x05
  14. #define REG_FIFO_RD_PTR 0x06
  15. #define REG_FIFO_DATA 0x07
  16. #define REG_MODE_CONFIG 0x09
  17. #define REG_SPO2_CONFIG 0x0A
  18. #define REG_LED1_PA 0x0C
  19. #define REG_LED2_PA 0x0D
  20. #define REG_TEMP_INT 0x1F
  21. #define REG_TEMP_FRAC 0x20
  22. int fd;
  23. // 写寄存器函数
  24. void writeRegister(uint8_t reg, uint8_t value) {
  25. wiringPiI2CWriteReg8(fd, reg, value);
  26. }
  27. // 读寄存器函数
  28. uint8_t readRegister(uint8_t reg) {
  29. return wiringPiI2CReadReg8(fd, reg);
  30. }
  31. // 初始化 MAX30102
  32. void initMAX30102() {
  33. // 中断使能
  34. writeRegister(REG_INTR_ENABLE_1, 0xC0); // A_FULL_EN and PPG_RDY_EN
  35. writeRegister(REG_INTR_ENABLE_2, 0x00); // ALMOST_FULL_EN and DIE_TEMP_RDY_EN
  36. // FIFO 配置
  37. writeRegister(REG_FIFO_WR_PTR, 0x00); // FIFO 写指针
  38. writeRegister(REG_OVF_COUNTER, 0x00); // 溢出计数器
  39. writeRegister(REG_FIFO_RD_PTR, 0x00); // FIFO 读指针
  40. // 模式配置
  41. writeRegister(REG_MODE_CONFIG, 0x03); // 心率和血氧模式
  42. // SPO2 配置
  43. writeRegister(REG_SPO2_CONFIG, 0x27); // SPO2_ADC_RANGE = 4096nA, SPO2_SAMPLE_RATE = 100Hz, LED_PULSE_WIDTH = 411us
  44. // LED 配置
  45. writeRegister(REG_LED1_PA, 0x24); // 红光 LED 电流
  46. writeRegister(REG_LED2_PA, 0x24); // 红外光 LED 电流
  47. }
  48. // 获取 FIFO 数据
  49. void readFIFO(uint32_t* red_led, uint32_t* ir_led) {
  50. uint8_t data[6];
  51. for (int i = 0; i < 6; i++) {
  52. data[i] = readRegister(REG_FIFO_DATA);
  53. }
  54. *red_led = ((data[0] << 16) | (data[1] << 8) | data[2]) & 0x03FFFF;
  55. *ir_led = ((data[3] << 16) | (data[4] << 8) | data[5]) & 0x03FFFF;
  56. }
  57. // 主函数
  58. int main() {
  59. // 初始化 I2C
  60. fd = wiringPiI2CSetup(MAX30102_ADDRESS);
  61. if (fd == -1) {
  62. printf("Failed to initialize I2C.\n");
  63. return -1;
  64. }
  65. // 初始化 MAX30102
  66. initMAX30102();
  67. while (1) {
  68. uint32_t red_led, ir_led;
  69. readFIFO(&red_led, &ir_led);
  70. printf("Red LED: %u, IR LED: %u\n", red_led, ir_led);
  71. usleep(100000); // 延时 100ms
  72. }
  73. return 0;
  74. }

3.原理图和pcb

4.寄存器配置

4.1寄存器详细信息

模式配置寄存器 (0x09)
  • 地址: 0x09
  • 默认值: 0x00
  • 读/写: 读/写 (R/W)
  • 位描述:
    • Bit 7 (SHDN): 关断控制 (Shutdown Control)
      • 1: 进入省电模式
      • 0: 正常工作模式
    • Bit 6 (RESET): 重置控制 (Reset Control)
      • 1: 重置所有配置、阈值和数据寄存器到上电状态
      • 0: 正常工作模式
    • Bits 5-3: 保留
    • Bits 2-0 (MODE[2:0]): 模式控制 (Mode Control)
      • 000: 禁用
      • 001: 禁用
      • 010: 心率模式 (Heart Rate mode)
      • 011: 血氧模式 (SpO2 mode)
      • 100-110: 保留
      • 111: 多 LED 模式 (Multi-LED mode)
SPO2 配置寄存器 (0x0A)
  • 地址: 0x0A
  • 默认值: 0x00
  • 读/写: 读/写 (R/W)
  • 位描述:
    • Bits 6-5 (SPO2_ADC_RGE[1:0]): SPO2 ADC 范围控制
      • 00: 2048 nA (7.81 pA 分辨率)
      • 01: 4096 nA (15.63 pA 分辨率)
      • 10: 8192 nA (31.25 pA 分辨率)
      • 11: 16384 nA (62.5 pA 分辨率)
    • Bits 4-2 (SPO2_SR[2:0]): SPO2 采样率控制
      • 000: 50 SPS
      • 001: 100 SPS
      • 002: 200 SPS
      • 011: 400 SPS
      • 100: 800 SPS
      • 101: 1000 SPS
      • 110: 1600 SPS
      • 111: 3200 SPS
    • Bits 1-0 (LED_PW[1:0]): LED 脉冲宽度 (LED Pulse Width)
      • 00: 69 µs (18-bit 分辨率)
      • 01: 118 µs (19-bit 分辨率)
      • 10: 215 µs (20-bit 分辨率)
      • 11: 411 µs (21-bit 分辨率)
LED 脉冲幅度寄存器 (0x0C - 0x0D)
  • 地址: 0x0C, 0x0D
  • 默认值: 0x00
  • 读/写: 读/写 (R/W)
  • 位描述:
    • Bit 7-0 (LEDx_PA[7:0]): LED 电流控制
      • 0x00: 0.0 mA
      • 0x01: 0.2 mA
      • 0x02: 0.4 mA
      • ...
      • 0x0F: 3.0 mA
      • ...
      • 0x1F: 6.2 mA
      • ...
      • 0x3F: 12.6 mA
      • ...
      • 0x7F: 25.4 mA
      • ...
      • 0xFF: 51.0 mA

4.2表格汇总

表 4. 模式控制
MODE[2:0]模式
000禁用
001禁用
010心率模式
011血氧模式
100-110保留
111多 LED 模式
表 5. SPO2 ADC 范围控制 (18-bit 分辨率)
SPO2_ADC_RGE[1:0]LSB 大小 (pA)全量程 (nA)
007.812048
0115.634096
1031.258192
1162.516384
表 6. SPO2 采样率控制
SPO2_SR[2:0]样品率 (SPS)
00050
001100
010200
011400
100800
1011000
1101600
1113200
表 7. LED 脉冲宽度控制
LED_PW[1:0]脉冲宽度 (µs)ADC 分辨率 (bits)
006918
0111819
0221520
0341121
表 8. LED 电流控制
LEDx_PA [7:0]典型 LED 电流 (mA)
0x000.0
0x010.2
0x020.4
......
0x0F3.0
......
0x1F6.2
......
0x3F12.6
......
0x7F25.4
......
0xFF51.0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <unistd.h>
  4. #include <wiringPiI2C.h>
  5. // MAX30102 I2C 地址
  6. #define MAX30102_ADDRESS 0x57
  7. // MAX30102 寄存器地址
  8. #define REG_INTR_STATUS_1 0x00
  9. #define REG_INTR_STATUS_2 0x01
  10. #define REG_INTR_ENABLE_1 0x02
  11. #define REG_INTR_ENABLE_2 0x03
  12. #define REG_FIFO_WR_PTR 0x04
  13. #define REG_OVF_COUNTER 0x05
  14. #define REG_FIFO_RD_PTR 0x06
  15. #define REG_FIFO_DATA 0x07
  16. #define REG_MODE_CONFIG 0x09
  17. #define REG_SPO2_CONFIG 0x0A
  18. #define REG_LED1_PA 0x0C
  19. #define REG_LED2_PA 0x0D
  20. #define REG_TEMP_INT 0x1F
  21. #define REG_TEMP_FRAC 0x20
  22. int fd;
  23. // 写寄存器函数
  24. void writeRegister(uint8_t reg, uint8_t value) {
  25. wiringPiI2CWriteReg8(fd, reg, value);
  26. }
  27. // 读寄存器函数
  28. uint8_t readRegister(uint8_t reg) {
  29. return wiringPiI2CReadReg8(fd, reg);
  30. }
  31. // 初始化 MAX30102
  32. void initMAX30102() {
  33. // 中断使能
  34. writeRegister(REG_INTR_ENABLE_1, 0xC0); // A_FULL_EN and PPG_RDY_EN
  35. writeRegister(REG_INTR_ENABLE_2, 0x00); // ALMOST_FULL_EN and DIE_TEMP_RDY_EN
  36. // FIFO 配置
  37. writeRegister(REG_FIFO_WR_PTR, 0x00); // FIFO 写指针
  38. writeRegister(REG_OVF_COUNTER, 0x00); // 溢出计数器
  39. writeRegister(REG_FIFO_RD_PTR, 0x00); // FIFO 读指针
  40. // 模式配置
  41. writeRegister(REG_MODE_CONFIG, 0x03); // 心率和血氧模式
  42. // SPO2 配置
  43. // SPO2_ADC_RGE = 00 (2048 nA), SPO2_SR = 011 (100 Hz), LED_PW = 11 (411 µs)
  44. writeRegister(REG_SPO2_CONFIG, 0x27);
  45. // LED 配置
  46. writeRegister(REG_LED1_PA, 0x24); // 红光 LED 电流
  47. writeRegister(REG_LED2_PA, 0x24); // 红外光 LED 电流
  48. }
  49. // 获取 FIFO 数据
  50. void readFIFO(uint32_t* red_led, uint32_t* ir_led) {
  51. uint8_t data[6];
  52. for (int i = 0; i < 6; i++) {
  53. data[i] = readRegister(REG_FIFO_DATA);
  54. }
  55. *red_led = ((data[0] << 16) | (data[1] << 8) | data[2]) & 0x03FFFF;
  56. *ir_led = ((data[3] << 16) | (data[4] << 8) | data[5]) & 0x03FFFF;
  57. }
  58. // 主函数
  59. int main() {
  60. // 初始化 I2C
  61. fd = wiringPiI2CSetup(MAX30102_ADDRESS);
  62. if (fd == -1) {
  63. printf("Failed to initialize I2C.\n");
  64. return -1;
  65. }
  66. // 初始化 MAX30102
  67. initMAX30102();
  68. while (1) {
  69. uint32_t red_led, ir_led;
  70. readFIFO(&red_led, &ir_led);
  71. printf("Red LED: %u, IR LED: %u\n", red_led, ir_led);
  72. usleep(100000); // 延时 100ms
  73. }
  74. return 0;
  75. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/1020359
推荐阅读
相关标签
  

闽ICP备14008679号