Projekt niedrogiego pulsoksymetru wykorzystujący gotowe komponenty
Przekazane przez: Północnoamerykańscy redaktorzy DigiKey
2020-08-13
Pulsoksymetry mierzą wysycenie krwi obwodowej tlenem (SpO2), które odzwierciedla wydolność układu krążeniowo-oddechowego w zakresie dostarczania do organizmu krwi bogatej w tlen. Sportowcy wykorzystują pomiary SpO2, aby ocenić swój poziom wysiłku podczas treningów, ale pomiary te nabrały większego znaczenia podczas pandemii COVID-19. Pracownicy służby zdrowia monitorują stan pacjentów pod kątem spadku SpO2, który stanowi wczesny znak ostrzegawczy przed uszkodzeniem tkanki płucnej wywołanym przez wirusa SARS-CoV-2, który powoduje COVID-19.
W przypadku osób dotkniętych chorobą z łagodnymi objawami, którym zlecono kwarantannę w domu, łatwy dostęp do niedrogiego pulsoksymetru może pomóc ocenić przebieg zakażenia i zapewnić ostrzeżenie potrzebne do zintensyfikowania opieki zdrowotnej.
W niniejszym artykule pokrótce omówiono objawy COVID-19 i potrzebę monitorowania saturacji SpO2. Następnie pokazano, jak deweloperzy mogą wykorzystać cyfrowy kontroler sygnałów firmy Microchip Technology i kilka dodatkowych urządzeń do zaprojektowania niedrogiego pulsoksymetru, który zapewni użytkownikom domowym wczesne ostrzeganie o objawach zbieżnych z zaawansowaną infekcją COVID-19.
COVID-19 i konieczność pomiaru poziomu nasycenia tlenem
COVID-19 posiada szerokie spektrum objawów wynikających ze szkodliwego działania wirusa SARS-CoV-2. Dla pracowników służby zdrowia szczególnie niepokojącym objawem jest uszkodzenie tkanki płucnej, prowadzące do upośledzenia układu oddechowego i zmniejszonego poboru tlenu. Chociaż lekarze stosują indywidualne zdjęcia rentgenowskie klatki piersiowej i tomografię komputerową (CT), aby potwierdzić ten etap infekcji COVID-19, jako wczesny wskaźnik rutynowo wykorzystują pomiary saturacji SpO2.
Pomiar saturacji SpO2 jest nieinwazyjną alternatywą dla pomiaru wysycenia krwi tętniczej tlenem (SaO2). Pomiaru tego dokonuje się bezpośrednio poprzez analizę poziomu gazów we krwi w próbkach pobranych z tętnicy pacjenta. Chociaż niektóre stany mogą wymagać bezpośredniego pomiaru stężeń gazów w krwi tętniczej, uznano iż pomiary saturacji SpO2 umożliwiają wiarygodne oszacowanie wysycenia SaO2. Być może najważniejsze jest to, że można to zrobić równie niezawodnie w domu, jak w warunkach klinicznych za pomocą pulsoksymetrów optycznych.
Pulsoksymetry optyczne mierzą saturację SpO2, wykorzystując różnice w absorpcji światła wykazywane przez hemoglobinę odtlenowaną (Hb) i hemoglobinę utlenowaną (HbO2). Przenoszona w czerwonych krwinkach hemoglobina szybko tworzy odwracalne wiązanie z maksymalnie czterema cząsteczkami tlenu w bogatych w tlen płucach. W stanie HbO2 cząsteczka absorbuje więcej światła przy długości 940nm niż przy 660nm (ilustracja 1).
Ilustracja 1: pulsoksymetry wykorzystują różnice w widmach absorpcyjnych pomiędzy krwinkami utlenowanymi (HbO2) i odtlenowanymi (Hb). (Źródło ilustracji: Wikipedia)
Gdy krwinki czerwone przenoszące utlenowaną hemoglobinę HbO2 trafiają do obwodu, gdzie ciśnienie parcjalne - czyli ciśnienie pojedynczej składowej gazowej w mieszaninie gazów - tlenu jest niższe, spada powinowactwo hemoglobiny do tlenu i HbO2 zaczyna oddawać swoje cząsteczki tlenu, ostatecznie przekształcając się Hb. W tym stanie odtlenowania widmo absorpcji światła przez cząsteczkę zmienia się, pochłaniając więcej światła przy długości 660nm niż przy 940nm.
Ponieważ HbO2 przekształca się w Hb, gdy ciśnienie parcjalne tlenu jest niskie, saturację SpO2 można określić za pomocą prostego wzoru:
SpO2 = HbO2 / (HbO2 + Hb)
Z kolei względne stężenia Hb i HbO2 w krwiobiegu można określić, mierząc absorpcję światła przy długościach fali 660nm i 940nm.
Aby zapewnić wiarygodne pomiary saturacji SpO2, pulsoksymetry wykorzystują zależność między ciśnieniem parcjalnym tlenu we krwi, obciążeniem hemoglobiny tlenem i różnicami w absorpcji światła.
Kluczowe podsystemy typowego pulsoksymetru
Typowa konstrukcja pulsoksymetru składa się z trzech głównych podsystemów:
- Podsystem dostarczania światła obejmujący przełączniki analogowe i sterowniki wraz z diodami elektroluminescencyjnymi (LED) o długości fali czerwonej 660nm i podczerwonej (IR) 950nm. Niektóre systemy zawierają również źródła koloru zielonego (530nm) do stosowania z metodami fotopletyzmografii (PPG), które określają częstość akcji serca poprzez monitorowanie zmian objętości naczyń krwionośnych skóry.
- Podsystem detekcji światła zawierający fotodiodę, łańcuch kondycjonowania sygnału i przetwornik analogowo-cyfrowy (ADC).
- Cyfrowy kontroler sygnałów (DSC) lub mikrokontroler do koordynowania podsystemów dostarczania i wykrywania światła oraz obliczania saturacji SpO2 na podstawie zmierzonych danych.
Chociaż te podstawowe podsystemy istnieją w każdym pulsoksymetrze, ich implementacja może się znacznie różnić. W pulsoksymetrach transmisyjnych fotodiodę umieszcza się po przeciwnej stronie palca lub płatka ucha użytkownika niż diody LED. Powszechnie dostępne moduły z klipsami na palce zawierają kombinację diod LED czerwonych, podczerwonych (IR) i opcjonalnie zielonych po jednej stronie klipsa, natomiast po drugiej znajduje się fotodioda. W pulsoksymetrach odbiciowych fotodioda i diody LED są umieszczane po tej samej stronie skóry, a pomiędzy nimi umieszczona jest bariera optyczna w celu redukcji artefaktów. Na przykład kompletne urządzenie do pomiaru odbicia SFH7060 firmy OSRAM łączy diody LED i fotodiodę w jednej obudowie o wymiarach 7,2 x 2,5 x 0,9mm.
Niezależnie od tego, czy te zestawy optyczne są używane do metod transmisyjnych, czy odbiciowych, projektanci potrzebują stosunkowo niewielu dodatkowych komponentów, aby wdrożyć niedrogi projekt pulsoksymetru, który jest w stanie dostarczyć użytkownikom domowym informacje sugerujące potrzebę dalszej oceny stanu zdrowia przez pracowników służby zdrowia. Przykładowy projekt zbudowany na bazie cyfrowego kontrolera sygnałów (DSC) DSPIC33FJ128GP802 firmy Microchip Technology wykorzystuje zintegrowane urządzenia peryferyjne mikrokontrolera do sterowania oświetleniem skóry za pomocą diod LED czerwonych i podczerwonych (IR) oraz do cyfryzacji kondycjonowanego sygnału wyjściowego fotodiody (ilustracja 2).
Ilustracja 2: typowa konstrukcja pulsoksymetru łączy w sobie podsystemy oświetlenia LED i przetwarzania sygnału fotodiody z mikrokontrolerem używanym do sterowania taktowaniem oświetlenia i akwizycji danych. (Źródło ilustracji: Microchip Technology)
Konstrukcje pulsoksymetrów zazwyczaj opierają się na pojedynczej fotodiodzie z szeroką krzywą wrażliwości widmowej do przechwytywania przesyłanego lub odbitego sygnału niezależnie od źródła oświetlenia. Aby zapewnić, że odbierany sygnał odpowiada tylko długościom fal czerwieni lub podczerwieni, sprzętowa lub programowa logika sterująca przedstawia tylko źródło światła czerwonego lub podczerwonego w danym czasie, naprzemiennie między dwoma źródłami, aby zakończyć sekwencję pomiarów.
Wdrażanie niedrogiego projektu pulsoksymetru
W tym projekcie cyfrowy kontroler sygnałów (DSC) wykorzystuje zewnętrzny przetwornik cyfrowo-analogowy (DAC) MCP4728 firmy Microchip Technology do ustawienia niezależnych tranzystorów MBT2222 na poziomie potrzebnym do wysterowania poszczególnych diod LED wymaganym natężeniem. Aby precyzyjnie określić czas sekwencji „włączenia” dla poszczególnych diod LED, cyfrowy kontroler sygnałów (DSC) wykorzystuje dwa wyjścia modulacji szerokości impulsu (PWM) do sterowania przełącznikiem analogowym ADG884 firmy Analog Devices (ilustracja 3).
Ilustracja 3: przełącznik analogowy sterowany naprzemiennymi sygnałami dla kanałów czerwonego i podczerwonego z kontrolera cyfrowego umożliwia podawanie prądu do diod LED czerwieni i podczerwieni. (Źródło ilustracji: Microchip Technology)
Na potrzeby przetwarzania sygnału wyjściowego fotodiody pojedyncze urządzenie MCP6002 firmy Microchip Technology zapewnia parę wzmacniaczy operacyjnych potrzebnych do realizacji podstawowego dwustopniowego łańcucha kondycjonowania sygnału. W pierwszym stopniu do konwersji prądu wyjściowego fotodiody na sygnał napięciowy wykorzystuje się jeden wzmacniacz operacyjny MCP6002, skonfigurowany jako wzmacniacz transimpedancyjny. Za filtrem górnoprzepustowym do redukcji szumów znajduje się drugi wzmacniacz operacyjny z urządzenia MCP6002, który odpowiada za regulację wzmocnienia i korekcji prądu stałego niezbędne do zoptymalizowania wahań sygnału kondycjonowanego w całym zakresie przetwornika analogowo-cyfrowego (ADC) zintegrowanego z cyfrowym kontrolerem sygnałów (DSC) (ilustracja 4).
Ilustracja 4: dwustopniowy łańcuch sygnałowy kondycjonuje sygnał wyjściowy fotodiody w celu podania sygnału do przetwornika analogowo-cyfrowego (ADC) zintegrowanego z kontrolerem cyfrowym. (Źródło ilustracji: Microchip Technology)
Podczas pracy cyfrowy kontroler sygnałów (DSC) wykorzystuje swoje wyjścia modulacji szerokości impulsu (PWM) i wejścia przetwornika analogowo-cyfrowego (ADC) w celu synchronizacji oświetlenia LED i cyfryzacji przetwornika analogowo-cyfrowego (ADC) na podstawie kondycjonowanego sygnału wyjściowego fotodiody. Tutaj każdy naprzemienny okres oświetlenia czerwonego i podczerwonego jest koordynowany z akwizycją i konwersją sygnału. Dodatkowa próbka przetwornika analogowo-cyfrowego (ADC) pobrana przy wyłączonych obu diodach LED służy do pomiaru światła otoczenia wykorzystywanego do optymalizacji natężenia światła diody LED i pomiaru saturacji SpO2. Rezultatem jest precyzyjnie kontrolowana sekwencja zdarzeń, która koordynuje oświetlenie LED i cyfryzację sygnału przez przetwornik analogowo-cyfrowy (ADC) w celu pozyskania wyników długości fali czerwonej dla Hb, pomiaru światła z otoczenia i wreszcie pozyskania wyników długości fali podczerwonej (IR) dla HbO2 (ilustracja 5).
Ilustracja 5: zasada działania niedrogiego pulsoksymetru opiera się na zdolności cyfrowego kontrolera sygnału do zarządzania precyzyjnym taktowaniem sekwencji oświetlenia i przechwytywania danych wymaganych do zbierania pomiarów w celu określenia saturacji SpO2. (Źródło ilustracji: Microchip Technology)
Wdrażanie rozwiązania programowego opartego na przerwaniach
Firma Microchip zapewnia pakiet oprogramowania układowego pulsoksymetru z przykładowym programem, który demonstruje użycie cyfrowego kontrolera sygnałów (DSC) do wykonania tych sekwencji sterowania oświetleniem i konwersji danych. W tym przypadku program implementuje metodę sterowaną przerwaniami przy użyciu pary układów czasowych cyfrowego kontrolera sygnałów (DSC) - układu Timer2 i Timer3 - w celu zsynchronizowania oddzielnych sekwencji „włączenia” odpowiednio diod LED podczerwieni i czerwieni. Z kolei każdy układ czasowy zapewnia podstawę czasu dla dwóch modułów porównania wyjść (OC) cyfrowego kontrolera sygnałów (DSC) - OC1 i OC2 - używanych do sterowania przełącznikami analogowymi odpowiednio dla diody podczerwieni i czerwonej diody LED.
Jak pokazano na listingu 1, oprogramowanie najpierw inicjalizuje układ czasowy Timer2 i układ czasowy Timer3, aby ustawić żądany okres cyklu oświetlenia i włączyć przerwania. W ramach sekwencji inicjalizacji moduły OC1 i OC2 są łączone z oddzielnymi wtykami wyjściowymi za pomocą funkcji mapowania wtyków (RP) cyfrowego kontrolera sygnałów (DSC). Sekwencja inicjalizacji następnie ustawia cykl pracy oświetlenia i wybiera powiązany układ czasowy w celu wykorzystania jako podstawa czasu.
Kopiuj
//*********************************************************************************************************
// 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
Listing 1: główna procedura z pakietu przykładowego kodu Microchip Technology wykorzystuje krótką sekwencję inicjalizacji do skonfigurowania układów czasowych cyfrowego kontrolera sygnałów i modułów porównujących wyjścia, stanowiących serce omawianego niedrogiego pulsoksymetru. (Źródło kodu: Microchip Technology)
Podejście to wykorzystuje powiązanie przerwań poszczególnych układów czasowych z określonym punktem wejścia procedury obsługi przerwania (ISR) w architekturze cyfrowego kontrolera sygnałów (DSC). Na przykład, gdy wystąpi przerwanie układu czasowego Timer3 kanału czerwonej diody LED, cyfrowy kontroler sygnałów (DSC) wykonuje funkcję w punkcie wejścia _T3Interrupt. Tak więc, gdy upłynie czas układu czasowego Timer3 czerwonej diody LED, zachodzą dwa skoordynowane zdarzenia sprzętowe i programowe:
- moduł OC2 generuje ciągły impuls podawany do przełącznika analogowego, włączając czerwoną diodę LED
- cyfrowy kontroler sygnałów (DSC) rozpoczyna wykonywanie procedury obsługi przerwania (ISR) _T3Interrupt (listing 2)
Kopiuj
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
}
Listing 2: zawarta w pakiecie przykładowych kodów Microchip Technology, przedstawiona tutaj procedura obsługi przerwania (ISR) układu czasowego Timer3 zbiera pomiary oświetlenia czerwonej diody LED i pomiary światła otoczenia, podczas gdy procedura obsługi przerwania (ISR) układu czasowego Timer2 musi jedynie zbierać pomiary oświetlenia podczerwonej diody LED. (Źródło kodu: Microchip Technology)
Jak pokazano na listingu 2, procedura obsługi przerwania (ISR) _T3Interrupt odczytuje czerwony poziom bazowy (Red-DC) z kanału 0 (AN0) przetwornika analogowo-cyfrowego (ADC) i czerwony poziom dynamiczny (Red-AC) z kanału 1 (AN1) przetwornika analogowo-cyfrowego (ADC). Jeśli deweloper zdecyduje się dołączyć definicję Sleep_Enabled, po wykonaniu skompilowanego kodu procedury obsługi przerwania (ISR) nastąpi przechwycenie danych ze sprawdzeniem, czy procesor powinien przejść w stan uśpienia. Domyślna konfiguracja pakietu oprogramowania Microchip zawiera definicję #define dla funkcji Sleep_Enabled, więc zmienna goto_sleep zostanie ustawiona, jeśli sonda optyczna nie będzie podłączona lub jeśli użytkownik nie przyłoży jej do palca.
Po sprawdzeniu stanu sondy procedura obsługi przerwania (ISR) próbkuje poziom oświetlenia otoczenia i wykorzystuje tę zaktualizowaną wartość do odpowiedniego przesunięcia granic okna linii bazowej. Korzystając z tych zmodyfikowanych limitów funkcja Calibrate_Red() zwiększa lub zmniejsza sygnał wyjściowy przetwornika cyfrowo-analogowego (DAC) do sterownika czerwonej diody LED, aby utrzymać intensywność między dolną wartością graniczną (Baseline_Lower_Limit) i górną wartością graniczną (Baseline_Upper_Limit).
Procedura obsługi przerwania układu czasowego T2 wykorzystuje ten sam podstawowy wzorzec projektowy, z wyjątkiem sprawdzania funkcji sleep_enabled i pomiaru oświetlenia otoczenia.
Wykorzystując układ czasowy, moduły porównania wyjścia i procedury obsługi przerwania (ISR), główna procedura przykładowego oprogramowania wykonuje krótką sekwencję inicjalizacji i uruchamia układ czasowy Timer2 i Timer3. W tym momencie kod wchodzi do głównej pętli, czekając na dane przetworzone przez procedury obsługi przerwania (ISR). Gdy dane czerwieni i podczerwieni są dostępne, wartości te są przetwarzane przez cyfrowy filtr o skończonej odpowiedzi impulsowej (FIR), wywołując w końcu procedury obliczania saturacji SpO2 i tętna (listing 3).
Kopiuj
//********** 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);
Listing 3: ten fragment głównej procedury w pakiecie przykładowego kodu firmy Microchip Technology pokazuje, w jaki sposób kod inicjuje układ czasowy i moduły porównywania wyjść oraz wchodzi w nieskończoną pętlę, obliczając saturację SpO2 i tętno, jeśli pomiary są dostępne, lub przełącza procesor w tryb uśpienia z niskim poborem mocy, gdy czujnik zostanie odłączony. (Źródło kodu: Microchip Technology)
Na potrzeby pomiaru saturacji SpO2 funkcja SpO2_Calculation() przekształca amplitudy impulsów (Vpp) sygnałów czerwonego i podczerwonego na wartości skuteczne Vrms. Korzystając z tych wartości, funkcja generuje proporcję i wykorzystuje tablicowanie (nie pokazane na listingu 3) do konwersji współczynnika na określoną wartość saturacji SpO2. Zazwyczaj tablicowanie odbywa się na podstawie wielu pomiarów empirycznych. Funkcja Pulse_Rate_Calculation() wykorzystuje czas międzyszczytowy pomiaru, aby określić tętno.
Opcje optymalizacji projektu pomiaru saturacji SpO2
Chociaż konstrukcja opisana w tym artykule stanowi skuteczne rozwiązanie dla niedrogiego pulsoksymetru, inne urządzenia mogą pozwalać na jeszcze większą optymalizację. Na przykład deweloper może wyeliminować zewnętrzne urządzenie z dwoma wzmacniaczami operacyjnymi MCP6002, używając wzmacniaczy operacyjnych zintegrowanych z cyfrowym kontrolerem sygnałów (DSC) DSPIC33CK64MP102 firmy Microchip Technology.
Jednak wdrażając ten zmodyfikowany projekt pulsoksymetru, deweloperzy będą musieli przepisać niektóre kluczowe części pakietu oprogramowania opisanego wcześniej, aby uwzględnić pewne różnice w cyfrowym kontrolerze sygnałów (DSC).
Na przykład cyfrowy kontroler sygnałów (DSC) DSPIC33CK64MP102 zamiast funkcji układu czasowego Timer2/Timer3 znanych z kontrolera DSPIC33FJ128GP802 zawiera zestaw wielozadaniowych modułów czasowych, co wymaga od programistów stworzenia własnego rozwiązania niektórych funkcji opisanych w listingach przedstawionych w tym artykule. Mimo to zasady działania pozostają takie same, a deweloperzy mogą co najmniej wykorzystać wzorce projektowe przedstawione w przykładowym pakiecie oprogramowania Microchip Technology, aby opracować własny, niestandardowy projekt oprogramowania.
Podsumowanie
Pomiar poziomu nasycenia krwi tlenem stanowi ważny wskaźnik wydolności układu oddechowego i stał się ważnym narzędziem w kontroli stanu zdrowia podczas pandemii COVID-19. Korzystając z prostych metod optycznych, pulsoksymetry zapewniają wiarygodne oszacowanie wysycenia krwi obwodowej tlenem (SpO2), zaspokajając konkretne zapotrzebowanie na niedrogie rozwiązania w zakresie monitorowania stanu zdrowia podczas pandemii.
Cyfrowy kontroler sygnałów (DSC) w połączeniu z kilkoma podstawowymi komponentami zapewnia skuteczną podstawę sprzętową do wdrożenia niedrogiego pulsoksymetru, który jest w stanie niezawodnie dostarczać pomiaru saturacji SpO2 mogącego posłużyć do sygnalizacji, czy użytkownicy powinni szukać dalszej pomocy medycznej w związku z postępującą infekcją COVID-19.
Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.




