기성 부품을 사용하여 저가형 산소 포화도 측정기 설계

작성자: Stephen Evanczuk

DigiKey 북미 편집자 제공

산소 포화도 측정기는 인체에 산소가 풍부한 혈액을 제공하는 심폐기관의 효율성을 나타내는 말초 산소 포화도(SpO2)를 측정합니다. 운동선수들은 SpO2 측정치를 사용하여 운동의 강도를 가늠하지만, 코로나19가 전 세계적으로 유행하면서 이러한 측정치가 더욱 중요해졌습니다. 의료인들은 SpO2의 감소를 코로나19를 유발하는 SARS-CoV-2 바이러스로 인한 폐 조직 손상의 조기 경고 신호로 보고 감시합니다.

경미한 증상이 있어 집에서 격리하도록 안내받은 경우 저가형 산소 포화도 측정기를 간편하게 이용할 수 있으면 감염 과정 평가에 도움을 받고 의료 지원을 요청해야 한다는 경고를 제공받을 수 있습니다.

이 기사에서는 코로나19의 증상과 SpO2 모니터링의 필요성을 간략하게 설명합니다. 그런 다음 개발자가 Microchip Technology 디지털 신호 컨트롤러(DSC)와 몇몇 추가 장치를 사용하여 후기 코로나19 감염에서 일관된 증상에 관한 조기 경고를 일반 사용자에게 제공할 수 있는 저가형 산소 포화도 측정기를 설계하는 방법을 설명합니다.

코로나19와 산소 포화도 측정의 필요성

코로나19는 SARS-CoV-2 바이러스의 손상 효과로 인한 광범위한 증상을 일으킵니다. 의료 서비스 제공자가 특히 걱정하는 증상은 폐 조직 손상으로 인한 호흡기 계통 손상 및 산소 섭취량 감소와 관련이 있습니다. 의사들은 개별 흉부 X-레이와 컴퓨터 단층 촬영(CT) 검사를 통해 코로나19의 진행 단계를 확인하지만, 조기 지표로서 SpO2 측정을 자주 사용합니다.

SpO2 측정은 환자의 동맥에서 추출한 샘플의 혈액 가스 농도를 분석하여 바로 결정하는 동맥 산소 포화도(SaO2) 측정 방식의 비침습적 대안입니다. 조건에 따라서 직접적인 동맥 혈액 가스 측정이 필요할 수도 있지만 SpO2를 통해 SaO2 예상치의 신뢰도가 높은 것으로 확인되었습니다. 광학 산소 포화도 측정기를 사용하여 가정에서도 임상 환경에서만큼 신뢰도 높은 측정 결과를 얻을 수 있다는 점이 아마도 가장 중요할 것입니다.

광학 산소 포화도 측정기는 탈산소화된 헤모글로빈(Hb)과 산소화된 헤모글로빈(HbO2)이 나타내는 광 흡수의 차이를 활용하여 SpO2를 측정합니다. 적혈구에서 운반되는 헤모글로빈은 산소가 풍부한 폐 내에서 최대 4개의 산소 분자와 가역성 결합을 빠르게 형성합니다. 이와 같은 HbO2 상태에서 분자는 660nm에서보다 940nm에서 더 많은 빛을 흡수합니다(그림 1).

산소화된 혈액세포(HbO2)와 탈산소화된 혈액세포(Hb) 사이의 흡수 스펙트럼 차이를 보여 주는 그래프그림 1 : 산소 포화도 측정기는 산소화된 혈액세포(HbO2)와 탈산소화된 혈액세포(Hb) 간의 흡수 스펙트럼 차이를 활용합니다. (이미지 출처: Wikipedia)

HbO2를 운반하는 적혈구가 산소의 분압(혼합 가스에 있는 단일 가스 성분의 압력)이 더 낮은 말초로 전달되면 헤모글로빈의 산소 친화성이 떨어지고 HbO2는 산소 분자 추출이 시작되어 결국 Hb가 됩니다. 이렇게 탈산소화된 상태에서 분자의 광 흡수 스펙트럼이 변하여 940nm에서보다 660nm에서 더 많은 빛을 흡수합니다.

산소 분압이 낮을 때 HbO2는 Hb가 되므로 다음의 간단한 방정식으로 SpO2를 결정할 수 있습니다.

SpO2 = HbO2 / (HbO2 + Hb)

따라서 혈류에서 Hb 및 HbO2의 상대 농도는 660nm 및 940nm 파장에서의 광 흡수를 측정하여 결정할 수 있습니다.

산소 포화도 측정기는 혈중 산소 분압, 헤모글로빈 산소 부하 및 광 흡수 차이 사이의 관계를 활용하여 SpO2를 신뢰할 수 있게 측정합니다.

일반적인 산소 포화도 측정기의 주요 서브 시스템

일반적인 산소 포화도 측정기 설계는 세 가지 주요 서브 시스템으로 구성됩니다.

  • 아날로그 스위치 및 구동기와 함께 빨간색(660nm) 및 적외선(IR)(950nm) 파장의 발광 다이오드(LED)를 포함하는 광 전달 서브 시스템. 일부 시스템에는 피부 혈관의 용적 변화를 모니터링하여 심박수를 결정하는 광혈류측정(PPG) 방법에 사용하기 위한 녹색(530nm) 광원도 포함됩니다.
  • 광 다이오드, 신호 조정 체인 및 아날로그 디지털 컨버터(ADC)를 포함하는 광 감지 서브 시스템
  • 빛 전달 및 감지 서브 시스템을 조정하고 측정된 데이터에서 SpO2를 계산하는 DSC 또는 마이크로 컨트롤러

이러한 기본 서브 시스템은 모든 산소 포화도 측정기에 있지만 구현은 크게 다를 수 있습니다. 투과 산소 포화도 측정기에서 광 다이오드는 LED를 기준으로 사용자 손가락 또는 귓불의 반대쪽에 배치됩니다. 일반적으로 제공되는 손가락 클립 장치는 클립 한쪽의 빨간색, IR 및 녹색(선택 사항) LED와 다른 쪽의 광 다이오드가 결합된 형태입니다. 반사율 산소 포화도 측정기에서는 광 다이오드와 LED를 피부의 같은 쪽에 배치하고 아티팩트를 줄이기 위해 둘 간에 약간의 광학적 장벽을 배치합니다. 예를 들어 OSRAM의 SFH7060은 LED와 광 다이오드 구성된 단일 7.2mm x 2.5mm x 0.9mm 패키지 드롭인 반사율 측정 장치입니다.

해당 광학 패키지를 투과 방법 또는 반사율 방법 중 무엇에 사용하든 설계자는 비교적 적은 수의 추가 부품으로도 일반 사용자에게 의료 전문가의 추가 평가가 필요함을 나타내는 정보를 제공할 수 있는 저가형 산소 포화도 측정기 설계를 구현할 수 있습니다. Microchip Technology DSPIC33FJ128GP802 DSC를 기반으로 하여 제작된 설계 예제에서는 마이크로 컨트롤러의 통합 주변 소자를 사용하여 빨간색 및 IR LED로 피부 조명을 제어하고 조건부 광 다이오드 출력 신호를 디지털화합니다(그림 2).

Microchip의 일반 산소 포화도 측정기 설계 구성도그림 2: 일반적인 산소 포화도 측정기 설계에서는 LED 조명 및 광 다이오드 신호 처리를 위한 서브 시스템과 조명 및 데이터 취득 타이밍을 제어하는 데 사용되는 마이크로 컨트롤러를 결합합니다. (이미지 출처: Microchip Technology)

산소 포화도 측정기 설계에서는 일반적으로 스펙트럼 응답 곡선이 넓은 단일 광 다이오드를 사용하여 조명원과 관계없이 전송 또는 반사된 신호를 캡처합니다. 수신된 신호가 빨간색 또는 IR 파장에만 해당하는지 확인하기 위해 하드웨어 또는 소프트웨어 제어 논리에서는 지정된 시간에 빨간색 또는 IR 조명원 중 하나만 제공하고, 두 광원을 번갈아 가며 측정 시퀀스를 완료합니다.

저가형 산소 포화도 측정기 설계 구현

이 설계에서 DSC는 Microchip Technology의 외부 MCP4728 디지털 아날로그 컨버터(DAC)를 사용하여 각 LED를 필요한 강도로 구동하는 데 필요한 수준으로 개별 MBT2222 트랜지스터를 설정합니다. 각 LED의 "켜짐" 시퀀스 타이밍을 정밀하게 제어하기 위해 DSC는 두 개의 펄스 폭 변조(PWM) 출력을 사용하여 Analog DevicesADG884 아날로그 스위치를 제어합니다(그림 3).

빨간색 및 IR LED로의 구동 전류를 지원하는 아날로그 스위치 구성도그림 3: 디지털 컨트롤러에서 빨간색 및 IR 채널용 신호를 교대로 보내 구동하는 아날로그 스위치는 빨간색 및 IR LED로의 구동 전류를 지원합니다. (이미지 출처: Microchip Technology)

광 다이오드 출력을 처리하기 위해 단일 Microchip Technology MCP6002 장치는 기본 2단계 신호 조정 체인을 구현하는 데 필요한 연산 증폭기 쌍을 제공합니다. 여기서 첫 번째 단계에서는 트랜스 임피던스 증폭기로 구성된 하나의 MCP6002 연산 증폭기를 사용하여 광 다이오드의 전류 출력을 전압 신호로 변환합니다. 잡음을 줄이기 위한 고역 통과 필터에 이어 MCP6002의 두 번째 연산 증폭기는 DSC에 통합된 ADC의 전체 범위에서 조건부 신호의 스윙을 최적화하는 데 필요한 이득 및 DC 오프셋 조정을 제공합니다(그림 4).

2단계 신호 체인 조건 광 다이오드 출력의 구성도(전달용)그림 4: 디지털 컨트롤러의 통합 ADC에 전달하는 2단계 신호 체인 조건 광 다이오드 출력 (이미지 출처: Microchip Technology)

작동 시 DSC는 PWM 출력과 ADC 입력을 사용하여 조건부 광 다이오드 출력 신호의 LED 조명 및 ADC 디지털화를 동기화합니다. 여기서 매번 빨간색과 IR 조명을 교대하는 기간을 신호 취득 및 변환에 맞게 조정합니다. 두 LED가 모두 꺼질 때 수집한 추가 ADC 샘플을 통해 LED 강도를 최적화하는 데 사용되는 주변광을 측정하고 SpO2를 측정합니다. 결과적으로 LED 조명 및 ADC 디지털화를 조정하는 이벤트 시퀀스를 정밀하게 제어하여 Hb의 빨간색 파장 결과를 캡처하고, 주변광을 캡처하고, 마지막으로 HbO2의 IR 파장을 캡처합니다(그림 5).

Microchip의 저가형 산소 포화도 측정기 기능 구성도그림 5: 저가형 산소 포화도 측정기의 기능은 SpO2 결정을 위해 측정을 수집하는 데 필요한 조명 및 데이터 캡처의 시퀀스 타이밍을 정밀하게 관리할 수 있는 디지털 신호 컨트롤러의 기능에 달려 있습니다. (이미지 출처: Microchip Technology)

인터럽트 기반 소프트웨어 솔루션 구현

Microchip에서는 DSC를 사용하여 이러한 조명 제어 및 데이터 변환 시퀀스를 수행하는 방법을 보여 주는 샘플 프로그램이 포함된 산소 포화도 측정기 펌웨어 패키지를 제공합니다. 여기서 해당 프로그램은 DSC 타이머 쌍(Timer2와 Timer3)을 사용하여 IR LED 및 빨간색 LED 각각의 "켜짐" 시퀀스 시간을 별도로 제어하는 인터럽트 기반 방식을 구현합니다. 따라서 각 타이머는 IR LED 및 빨간색 LED 각각의 아날로그 스위치를 제어하는​데 사용되는 DSC의 출력 비교(OC) 모듈 2개(OC1 및 OC2)를 위한 시간축을 제공합니다.

목록 1에 나온 대로 소프트웨어는 먼저 Timer2 및 Timer3을 초기화하여 필요한 조명 주기 기간을 설정하고 인터럽트를 활성화합니다. 초기화 시퀀스의 일부로 OC1 및 OC2 모듈은 DSC의 다시 매핑 가능한 핀(RP) 기능을 사용하여 별도의 출력 핀에 연결됩니다. 그런 다음 초기화 시퀀스에서는 조명 듀티 사이클을 설정하고 시간축으로 사용할 관련 타이머를 선택합니다.

복사
    //*********************************************************************************************************
    // Initialize Timer 2 - IR light
    //*********************************************************************************************************
    T2CON = 0x0020;                    // Stop 16-bit Timer2, 1:64(40MhzFosc) Prescale, Internal clock (Fosc/2)
    TMR2 = 0x00;                    // Clear timer register
    PR2 = 1250;                        // Load the period value, OCxRS <= PRx, 4ms period = (1/(Fosc/2))*1000*64*PR2 = (1/(40000000/2))*1000*64*1250
    IPC1bits.T2IP = 2;                // Set Timer2 Interrupt Priority Level
    IFS0bits.T2IF = 0;                // Clear Timer2 Interrupt Flag
    IEC0bits.T2IE = 1;                // Enable Timer2 Interrupt
 
    //*********************************************************************************************************
    // Initialize Timer 3 - Red light
    //*********************************************************************************************************
    T3CON = 0x0020;                    // Stop 16-bit Timer3, 1:64(40MhzFosc) Prescale, Internal clock (Fosc/2)
    TMR3 = 0x00;                    // Clear timer register
    PR3 = 1250;                        // Load the period value, OCxRS <= PRx, 4ms period = (1/(Fosc/2))*1000*64*PR2 = (1/(40000000/2))*1000*64*1250
    IPC2bits.T3IP = 2;                // Set Timer3 Interrupt Priority Level
    IFS0bits.T3IF = 0;                // Clear Timer3 Interrupt Flag
    IEC0bits.T3IE = 1;                // Enable Timer3 Interrupt
 
    //*********************************************************************************************************
    // Initialize Output Compare 1 module in Continuous Pulse mode, OC1 controls IR LED switch
    //*********************************************************************************************************
    RPOR6bits.RP13R = 0b10010;        // RP13/RB13 tied to OC1 (IR)
    OC1CONbits.OCM = 0b000;         // Disable Output Compare 1 Module
    OC1R = 0;                         // Write the duty cycle for the first PWM pulse, 24=8MHzFosc(50us), 30=40MHzFosc(50us), 600=40MHzFosc(1ms)
    OC1RS = duty_cycle;             // Write the duty cycle for the second PWM pulse, OCxRS <= PRx, 499=8MHzFosc(1ms), 623=40MHzFosc(1ms), 1246=40MHzFoc,2msPeriod, 4984=40MHzFoc,8msPeriod, 280=450us D/C@40MHzFoc,2msPeriod,switch
    OC1CONbits.OCTSEL = 0;             // Select Timer 2 as output compare time base
 
    //*********************************************************************************************************
    // Initialize Output Compare 2 module in Continuous Pulse mode, OC2 controls Red LED switch
    //*********************************************************************************************************
    RPOR6bits.RP12R = 0b10011;        // RP12/RB12 tied to OC2 (Red)
    OC2CONbits.OCM = 0b000;         // Disable Output Compare 2 Module
    OC2R = 0;                         // Write the duty cycle for the first PWM pulse, 24=8MHzFosc, 30=40MHzFosc, 600=40MHzFosc(1ms)
    OC2RS = duty_cycle;             // Write the duty cycle for the second PWM pulse, OCxRS <= PRx, 499=8MHzFosc(1ms), 623=40MHzFosc(1ms), 1246=40MHzFoc,2msPeriod, 4984=40MHzFoc,8msPeriod, 280=450us D/C@40MHzFoc,2msPeriod,switch
    OC2CONbits.OCTSEL = 1;             // Select Timer 3 as output compare time base

목록 1: Microchip Technology 샘플 코드 패키지의 주 루틴에서는 짧은 초기화 시퀀스를 사용하여 이 저가형 산소 포화도 측정기 솔루션의 핵심인 디지털 신호 컨트롤러의 타이머 및 출력 비교 모듈을 설정합니다. (코드 출처: Microchip Technology)

이 접근 방식에서는 DSC 아키텍처의 각 타이머 인터럽트와 특정 인터럽트 서비스 루틴(ISR) 진입점 간 연결을 활용합니다. 예를 들어 빨간색 LED 채널의 Timer3 인터럽트가 발생하면 DSC는 _T3Interrupt 진입점에서 기능을 실행합니다. 따라서 빨간색 LED의 Timer3이 만료되면 다음 두 가지의 조정된 하드웨어 및 소프트웨어 이벤트가 발생합니다.

  • OC2가 아날로그 스위치에 연속 펄스를 생성하여 빨간색 LED를 켭니다.
  • DSC가 _T3Interrupt ISR 실행을 시작합니다(목록 2).
복사
void __attribute__((__interrupt__, no_auto_psv)) _T3Interrupt(void)        //Read Red DC & AC signals from AN0 & AN1
{
    int delay;
    unsigned char i;
 
    Read_ADC_Red = 1;
    CH0_ADRES_Red_sum = 0;
    CH1_ADRES_Red_sum = 0;
 
    for (delay=0; delay<200; delay++);    //2000=delayed 256us before read ADC
 
//    LATBbits.LATB14 = 1;            // for debugging
 
    for (i=0; i<oversampling_number; i++)
    {
        //Acquires Red-DC from Channel0 (AN0)
        AD1CHS0bits.CH0SA = 0x00;        // Select AN0
        AD1CON1bits.SAMP = 1;            // Begin sampling
        while(!AD1CON1bits.DONE);        // Waiting for ADC completed
        AD1CON1bits.DONE = 0;            // Clear conversion done status bit
        CH0_ADRES_Red_sum = CH0_ADRES_Red_sum + ADC1BUF0;    // Read ADC result
 
        //Acquires Red-AC from Channel1 (AN1)
        AD1CHS0bits.CH0SA = 0x01;        // Select AN1
        AD1CON1bits.SAMP = 1;            // Begin sampling
        while(!AD1CON1bits.DONE);        // Waiting for ADC completed
        AD1CON1bits.DONE = 0;            // Clear conversion done status bit
        CH1_ADRES_Red_sum = CH1_ADRES_Red_sum + ADC1BUF0;    // Read ADC result
    }
 
    CH0_ADRES_Red = CH0_ADRES_Red_sum / oversampling_number;
    FIR_input_Red[0] = CH1_ADRES_Red_sum / oversampling_number;
 
#ifdef Sleep_Enabled
    if (CH0_ADRES_Red<=74 && CH1_ADRES_Red>=4000)    //if spo2 probe is not connected, 74=60mV, 4000=3.2V
    {
        goto_sleep = 1;
    }
    else if (CH0_ADRES_Red > Finger_Present_Threshold)    //if no finger present then goto sleep
    {
        goto_sleep = 1;
    }
    else
#endif
    {
//        LATBbits.LATB14 = 0;            // for debugging
        for (delay=0; delay<500; delay++);    //1000=delayed 256us before read ADC
//        LATBbits.LATB14 = 1;            // for debugging
 
        //Acquires Red-DC baseline from Channel0 (AN0)
        AD1CHS0bits.CH0SA = 0x00;        // Select AN0
        AD1CON1bits.SAMP = 1;            // Begin sampling
        while(!AD1CON1bits.DONE);        // Waiting for ADC completed
        AD1CON1bits.DONE = 0;            // Clear conversion done status bit
        Baseline_ambient = ADC1BUF0;
 
        Baseline_Upper_Limit = Baseline_ambient + DCVppHigh;
        Baseline_Lower_Limit = Baseline_ambient + DCVppLow;
 
        Meter_State = Calibrate_Red();
    }
 
//    LATBbits.LATB14 = 0;            // for debugging
 
    OC2RS = duty_cycle;                // Write Duty Cycle value for next PWM cycle
    IFS0bits.T3IF = 0;                // Clear Timer3 Interrupt Flag
}

목록 2: Microchip Technology 샘플 코드 패키지에 포함된 Timer3 ISR(여기에 표시됨)은 빨간색 LED 조명 측정 및 주변광 측정을 수집하지만 Timer2 ISR은 IR LED 조명 측정만 수집하면 됩니다. (코드 출처: Microchip Technology)

목록 2에 표시된 대로 _T3Interrupt ISR은 ADC 채널 0(AN0)에서 빨간색 기준선 수준(Red-DC)을 읽고 ADC 채널 1(AN1)에서 빨간색 동적 수준(Red-AC)을 읽습니다. 개발자가 Sleep_Enabled에 대한 정의를 포함하도록 선택하는 경우 컴파일된 ISR 코드에서는 데이터 수집 이후 프로세서를 절전 상태로 전환해야 하는지 확인합니다. Microchip 소프트웨어 패키지의 기본 구성에는 Sleep_Enabled에 대한 #define이 포함되어 있으므로 광학 프로브가 연결되지 않았거나 사용자의 손가락이 없는 경우 goto_sleep 변수가 설정됩니다.

프로브 상태 확인 후 ISR은 주변광 수준을 샘플링하고 이 업데이트된 값을 사용하여 기준선 창 제한을 적절히 조정합니다. 이러한 조정 제한을 사용하여 Calibrate_Red() 함수가 빨간색 LED 구동기로의 DAC 출력을 늘리거나 줄여 Baseline_Lower_Limit와 Baseline_Upper_Limit 사이로 강도를 유지합니다.

T2 타이머 인터럽트 서비스 루틴은 sleep_enabled 확인과 주변광 수준 측정을 제외하고 기본 설계와 같은 패턴을 사용합니다.

타이머, 출력 비교 및 ISR이 준비되면 샘플 소프트웨어의 주 루틴에서는 짧은 초기화 시퀀스를 수행하고 Timer2 및 Timer3을 시작합니다. 이때 코드가 주 루프로 전환되고 ISR에서 데이터를 처리할 때까지 대기합니다. 빨간색 및 IR 데이터를 사용할 수 있게 되면 해당 값을 디지털 유한 임펄스 응답(FIR) 필터로 처리하고 마지막으로 루틴을 호출하여 SpO2 및 심박수를 계산합니다(목록 3).

복사
    //********** Enable OC1 & OC2 ouputs for IR & Red LED's on/off switch **********
    OC2CONbits.OCM = 0b101;                // Select the Output Compare 2 mode, Turn on Red LED
    T3CONbits.TON = 1;                    // Start Timer3
 
    for (delay=0; delay<2200; delay++);
 
    OC1CONbits.OCM = 0b101;                // Select the Output Compare 1 mode, Turn on IR LED
    T2CONbits.TON = 1;                    // Start Timer2
 
    goto_sleep = 0;
    first_reading = 0;
    
 
    while (1)
    {
        if (goto_sleep)
        {
 
[lines clipped]
 
                Sleep();                    // Put MCU into sleep
                Nop();
            }
        }
 
        //--------- Main State Machine starts here ---------
        if (RedReady && IRReady)
        {
            RedReady = 0;
            IRReady = 0;
 
//            LATBbits.LATB14 = 1;            //for debugging
 
            FIR(1, &FIR_output_IR[0], &FIR_input_IR[0], &BandpassIRFilter);
            FIR(1, &FIR_output_Red[0], &FIR_input_Red[0], &BandpassRedFilter);
 
            CH1_ADRES_IR = FIR_output_IR[0];
            CH1_ADRES_Red = FIR_output_Red[0];
 
[lines clipped]
 
            if (Detection_Done)
            {
                //Max & Min are all found. Calculate SpO2 & Pulse Rate
                SpO2_Calculation();                //calculate SpO2
                Pulse_Rate_Calculation();        //calculate pulse rate
 
[lines clipped]
 
    }
/*****************************************************************************
 * Function Name: SpO2_Calculation()
 * Specification: Calculate the %SpO2
 *****************************************************************************/
void SpO2_Calculation (void)
{
    double Ratio_temp;
 
    IR_Vpp1 = fabs(IR_Max - IR_Min);
    Red_Vpp1 = fabs(Red_Max - Red_Min);
    IR_Vpp2 = fabs(IR_Max2 - IR_Min2);
    Red_Vpp2 = fabs(Red_Max2 - Red_Min2);
 
    IR_Vpp = (IR_Vpp1 + IR_Vpp2) / 2;
    Red_Vpp = (Red_Vpp1 + Red_Vpp2) / 2;
 
    IR_Vrms = IR_Vpp / sqrt(8);
    Red_Vrms = Red_Vpp / sqrt(8);
 
//    SpO2 = log10(Red_Vrms) / log10(IR_Vrms) * 100;
//    if (SpO2 > 100)
//    {
//        SpO2 = 100;
//    }
 
    // Using lookup table to calculate SpO2
    Ratio = (Red_Vrms/CH0_ADRES_Red) / (IR_Vrms/CH0_ADRES_IR);

목록 3: Microchip Technology 샘플 코드 패키지의 주 루틴에서 가져온 이 코드 조각에서는 코드를 통해 타이머 및 출력 비교 모듈을 초기화하고 무한 루프로 진입하여, 측정이 가능할 경우 SpO2 및 심박수를 계산하고 또는 센서 기능이 오프라인으로 전환될 경우 프로세서를 저전력 절전 모드로 설정하는 방법을 보여 줍니다. (코드 출처: Microchip Technology)

SpO2의 경우 SpO2_Calculation() 함수는 빨간색 및 IR 신호의 펄스 진폭(Vpp)을 Vrms 값으로 변환합니다. 해당 함수는 이 값을 사용하여 비율을 생성하고 조회 테이블(목록 3에 표시되지 않음)을 사용하여 이 비율을 특정 SpO2 값으로 변환합니다. 일반적으로 이 조회 테이블은 여러 경험적 측정에서 도출됩니다. Pulse_Rate_Calculation() 함수는 측정의 피크 간 타이밍을 사용하여 심박수를 결정합니다.

SpO2 설계 최적화 옵션

이 기사에 설명되어 있는 설계에서 저가형 산소 포화도 측정기를 위한 효과적인 솔루션을 제공하지만 다른 장치를 통해 추가로 최적화할 수도 있습니다. 예를 들어 개발자는 Microchip Technology DSPIC33CK64MP102 DSC에 통합된 연산 증폭기를 사용하여 외부 MCP6002 이중 연산 증폭기 장치를 제거할 수 있습니다.

그러나 수정된 이 산소 포화도 측정기 설계를 구현할 경우 개발자는 DSC의 몇 가지 차이점을 반영하기 위해 앞서 설명한 소프트웨어 패키지의 핵심 부분 중 일부를 다시 작성해야 합니다.

예를 들어 DSPIC33CK64MP102 DSC는 DSPIC33FJ128GP802 DSC의 Timer2/Timer3 기능 대신 다용도 타이머 모듈 세트를 제공하므로 개발자는 이 기사의 목록에서 설명한 일부 기능에 자체 솔루션을 제공해야 합니다. 그러나 작동 원리는 동일하며 개발자는 적어도 Microchip Technology 샘플 소프트웨어 패키지에 표시된 설계 패턴을 고유한 맞춤형 소프트웨어를 설계하기 위한 지침으로 사용할 수 있습니다.

결론

혈중 산소 포화도 측정은 호흡 기능을 평가하는 중요한 지표로 사용되며 코로나19의 전 세계적인 유행에 따라 건강 관리의 중요한 도구가 되었습니다. 단순한 광학 방법을 사용하는 산소 포화도 측정기는 말초 산소 포화도(SpO2)에 대한 신뢰할 수 있는 예측치를 제공할 수 있으므로 전염병의 전 세계적 유행 속에서 저렴한 건강 모니터링 솔루션을 찾는 특별한 요구에 부합합니다.

앞서 설명한 대로, DSC는 몇 가지 기본 부품과 함께 조합하여 사용자에게 코로나19 감염 진행에 대해 추가적인 의료 치료를 받아야 함을 알리는 SpO2 측정치를 안정적으로 제공할 수 있는 저가형 산소 포화도 측정기를 구현하기 위한 효과적인 하드웨어 기반을 제공할 수 있습니다.

DigiKey logo

면책 조항: 이 웹 사이트에서 여러 작성자 및/또는 포럼 참가자가 명시한 의견, 생각 및 견해는 DigiKey의 의견, 생각 및 견해 또는 DigiKey의 공식 정책과 관련이 없습니다.

작성자 정보

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk는 전자 산업에 관해 하드웨어, 소프트웨어, 시스템, 응용 제품(예: IoT)을 비롯한 광범위한 주제에 대해 20년 이상 집필한 경력을 갖고 있습니다. 그는 신경 과학의 뉴런 네트워크 박사 학위를 받았으며항공 우주 산업 분야의 광범위하게 분포된 보안 시스템 및 알고리즘 가속 메서드 관련 업무를 수행했습니다. 현재, 기술 및 엔지니어링에 대해 기사를 쓰지 않을 때에는 인식 및 추천 시스템에 대한 심층적 학습 응용 프로그램을 연구하고 있습니다.

게시자 정보

DigiKey 북미 편집자