0

MAX30102

Tham khảo

Mở đầu

Kiến trúc thư viện

Trước hết ta cần xem hình ảnh sau đây để có thể hiểu hơn về thư viện giao tiếp với MAX30102 image.png

Ví dụ

#include <Wire.h>
#include "MAX30105.h"

MAX30105 particleSensor;

void setup() {
  Serial.begin(9600);

  // Initialize sensor
  if (particleSensor.begin() == false) {
    Serial.println("MAX30102 was not found. Please check wiring/power.");
    while (1)
      ;
  }

  particleSensor.setup();  //Configure sensor. Use 6.4mA for LED drive
}

void loop() {
  Serial.print(" R[");
  Serial.print(particleSensor.getRed());
  Serial.print("] IR[");
  Serial.print(particleSensor.getIR());
  Serial.println("]");
}

Datasheet

Applications Information

  • Thời gian led sáng trong 1 xung gọi là độ rộng xung (Pulse Width).
  • Tốc độ lấy mẫu của ADC phụ thuộc vào thời gian led sáng. Mỗi lần led được bật thì ADC sẽ đo được ánh sáng phản xạ về gọi là 1 mẫu (sample).

Nếu độ rộng xung càng lớn -> thời gian led sáng càng lâu -> Nhiều ánh sánh sẽ được phản xạ về ADC -> Đo chính xác hơn. Nhưng đổi lại thì sẽ mất khoảng thời gian lớn hơn để lấy mẫu.

SpO2 Temperature Compensation

  • MAX30102 có cảm biến nhiệt độ tích hợp bên trong.
  • Nhiệt độ ảnh hưởng đến bước sóng của led đỏ và led IR.
    • Tín hiệu đầu ra không ảnh hưởng bởi bước sóng của IR, bởi vì IR thường dùng để đo nhịp tim, và máu (Hb và HbO2) hấp thụ IR khá giống nhau.
    • Tuy nhiên đối với led đỏ thì khác, bước sóng rất quan trọng để dữ liệu có thể diễn giải 1 cách chỉnh xác. Bởi vì Led đỏ thường dùng để đo SpO2 trong máu và có sự khác biệt hấp thụ ánh sáng của máu có Oxy (HbO2) và không có Oxy (Hb).

Bước sóng của led sẽ không cố định mà sẽ tăng dần khi nhiệt độ tăng. Led đỏ nóng lên rất nhanh khi ta vừa khởi động cảm biến điều này sẽ khiến bước sóng của nó vượt qua qua giá trị 660 nm. Để ước tính chính xác bước sóng của Led đỏ đang sáng → ta cần dựa vào:

  • Dòng điện qua Led hiện tại.
  • Nhiệt độ hiện tại của IC (đọc từ cảm biến nhiệt độ bên trong cảm biến).

FIFO

Bao gồm 4 thành phần

  • FIFO Write Pointer: Chỉ tới vị trí nơi mà MAX30102 lưu data tiếp theo.
  • Over Flow Counter: Đây là bộ đếm (4-bit) đếm số sample bị mất do FIFO đầy. Khi ta đọc 1 sample thành công thì OVF_COUNTER được reset về 0.
  • FIFO Read Pointer:
    • Trỏ đến vị trí mà master sẽ lấy sample thông qua I2C. Con trỏ này sẽ tăng lên mỗi khi một sample được lấy ra khỏi FIFO.
    • Ta cũng có thể ghi giá trị vào con trỏ này để yêu cầu nó đọc vị trí mà ta mong muốn.
  • FIFO Data Register:
    • Kích thước của FIFO là 32 (lưu trữ được 32 sample). Kích thước của mỗi vị trí lưu trữ phụ thuộc vào bao nhiêu led hoạt động (Red và IR). Data của mỗi Led là 3 byte nên kích thước của mỗi vị trí là 3 byte hoặc 6 byte.
    • Thanh ghi FIFO Data là cửa đọc 8bit, nghĩa là mỗi lần đọc ta chỉ có thể lấy 1 byte từ FIFO. (Ví dụ để lấy 3 byte từ FIFO thì cần đọc FIFO_DATA 3 lần.

Reading from the FIFO

  • Khi đọc các thanh ghi từ giao tiếp I2C sẽ tự động tăng con trỏ địa chỉ thanh ghi, đều nay đúng với tất cả các thanh ghi trong MAX30102 nhưng ngoại trừ FIFO_DATA.
  • Việc đọc FIFO_DATA thì không tự động tăng địa chỉ thanh ghi (0x70), sẽ đọc một dữ liệu từ cùng một địa chỉ lặp đi lặp lại. Mỗi sample bao gồm nhiều byte, vì vậy cần đọc nhiều byte từ thanh ghi này trong 1 lần để có 1 sample đầy đủ.
  • Khi đọc tới thanh ghi có địa chỉ là 0xFF thì sẽ đứng im tại đây mà không quay về thanh ghi có địa chỉ 0x00.

FIFO Data Structure

  • Bao gồm 1 vùng nhớ cho 32 sample: IR và RED ADC data.

    • Mỗi sample có 2 thành phần data: 3 byte IR và 3 byte RED. => Có tổng cộng 192 byte tất cả.
  • Mỗi phần data là 3 byte = 24bit nhưng chỉ dùng tối đa 18bit để lưu trữ dữ liệu từ ADC cho mỗi led.

    • Có thể chọn độ phân giải: 18-bit, 17-bit, 16-bit, 15-bit, và dữ liệu được căn chỉnh bên trái -> điều này có nghĩa là bit MSB luôn nằm ở vị trí là 17. image.png
  • FIFO_DATA[18] - [23] không được sử dụng. image.png

Trong mode SpO2, ta cần đọc 2 bộ ba dữ liệu bao gồm IR và RED. image.png

image.png

Write/Read Pointers

  • Để kiểm soát luồn dữ liệu trong FIFO.
  • Writer pointer sẽ tăng mỗi khi thêm dữ liệu mới vào FIFO.
  • Read pointer sẽ tăng mỗi khi đọc một dữ liệu từ FIFO. Để có thể đọc lại một sample, hãy giảm giá trị con trỏ và đọc lại giá trị thanh ghi đó 1 lần nữa.
  • Write/read pointer sẽ được xóa khi
    • Vào SpO2 mode hoặc HR mode.
    • Tắt nguồn.

FIFO Configuration

image.png

Bit 5-7: Xác định số mẫu được tính trung bình trước khi ghi vào FIFO.
Bit 4: Khi FIFO đầy sẽ xảy ra 2 tình huống:
  • FIFO_ROLLOVER_EN = 1:
    • FIFO_RD_PTR sẽ tự di chuyển về vị trí đầu tiên.
    • Ghi đè dữ liệu cũ nhất bằng dữ liệu mới.
  • FIFO_ROLLOVER_EN = 0:
    • Ngừng ghi dữ liệu mới vào trong FIFO cho đến khi được đọc.
    • Các sample mới sẽ bị bỏ qua.
Bits 3:0: Xác định ngưỡng ngắt dựa vào số lượng sample có trong FIFO.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí