マルツTOP > APPLICATION LAB TOPページ おすすめ技術記事アーカイブス > 容易に入手可能な部品を使用して低コストのパルスオキシメータを設計

容易に入手可能な部品を使用して低コストのパルスオキシメータを設計

著者 Stephen Evanczuk 氏
Digi-Keyの北米担当編集者 提供
2020-08-13

マルツ掲載日:2020-12-07


 パルスオキシメトリは、酸素を豊富に含む血液を人体に提供する心肺系の有効性を反映する末梢酸素飽和(SpO2)を測定します。スポーツ選手はSpO2の測定を使用して運動の成果レベルを判断しますが、これらの測定は新型コロナウイルス感染症(COVID-19)感染拡大の中でより大きな重要性を持つようになりました。医療提供者は、新型コロナウイルス感染症を引き起こすSARS-CoV-2ウイルスによる肺組織の損傷の初期兆候として、SpO2の低下を監視します。

 自宅隔離を指示された軽症の感染者にとって、低コストのパルスオキシメータをすぐに入手することは、感染症の経過を判断し、医療の段階を高めるのに必要な警告を提供するのに役立ちます。

 この記事では、新型コロナウイルス感染症の症状と、SpO2を監視することの必要性について手短に説明します。次に、開発者がMicrochip Technologyのデジタル信号コントローラ(DSC)と少数の追加デバイスを使用して、在宅の使用者に新型コロナウイルス感染症の進行を示す症状の早期警告を提供できる低コストのパルスオキシメータを設計する方法を説明します。

新型コロナウイルス感染症で酸素飽和度を測定する必要性

 新型コロナウイルス感染症は、SARS-CoV-2ウイルスの破壊的な影響から生じるさまざまな症状をもたらします。医療提供者にとって、特に厄介な症状は肺組織の損傷です。これは、呼吸器系の機能障害や酸素摂取量の低下につながります。

 医師は個別の胸部X線やコンピュータ断層撮影(CT)スキャンを使用して新型コロナウイルス感染症のこのステージを確認しますが、早期指標としてSpO2の測定も定期的に使用しています。

 SpO2測定は、患者の動脈から抽出したサンプル内の血液ガス濃度を分析することにより直接判断する動脈血酸素飽和度(SaO2)の測定に対する、非侵襲性の代替手段です。一部の状況では直接的な動脈血ガス測定が必要になりますが、SpO2からSaO2の信頼できる推定値が得られることが判明しました。最も重要なこととして、光学式パルスオキシメータを使用することにより、自宅でも臨床環境と同じほど信頼できる方法で実行できます。

 光学式パルスオキシメータは、脱酸素化ヘモグロビン(Hb)と酸化ヘモグロビン(HbO2)が示す光吸収の違いを活用することにより、SpO2を測定します。赤血球により運ばれるヘモグロビンは、酸素を豊富に含む肺内で最大4つの酸素分子との可逆的結合を素早く形成します。このHbO2としての状態で、分子は660nmよりも940nmでより多くの光を吸収します(図1)。


図1:パルスオキシメトリは、酸素化(HbO2)と脱酸素化(Hb)血液細胞の吸収スペクトルの違いを利用しています。(画像提供:Wikipedia)

 HbO2を運ぶ赤血球が、酸素の分圧(混合ガス内の単一ガス成分の圧力)が低い末梢を通過すると、ヘモグロビンの酸素親和性が低下して、HbO2が酸素分子を解放し始め、最終的にHbになります。この脱酸素化状態において、分子の光吸収スペクトルが変化し、940nmよりも660nmでより多くの光を吸収するようになります。

 酸素の分圧が低いとHbO2はHbになるため、SpO2は次の簡単な式で確定できます。

   SpO2=HbO2/(HbO2 + Hb)

 次に、血流内のHbとHbO2の相対濃度は、660nmや940nmの波長で光吸収を測定することにより確定できます。

 パルスオキシメータは、血液の酸素分圧、ヘモグロビンの酸素負荷、光吸収の違いの間の関係を利用して、信頼性の高いSpO2測定を提供します。

一般的なパルスオキシメータの主なサブシステム

 一般的なパルスオキシメータの設計は、以下3つの主なサブシステムで構成されています。

・赤色(660nm)や赤外線(IR)(950nm)波長でのアナログスイッチ、ドライバ、発光ダイオード(LED)を含む配光サブシステム
 一部のシステムには、皮膚の血管内の血液量の変化を監視することで心拍数を測定する光電式容積脈波記録法(PPG)で使用される緑色(530nm)光源も含まれます。
・フォトダイオード、シグナルコンディショニングチェーン、A/Dコンバータ(ADC)を含む光検出サブシステム
・配光や光検出サブシステムを調整し、測定データからSpO2を計算するDSCまたはマイクロコントローラ

 これらの基本的なサブシステムはどのパルスオキシメータにも存在しますが、それらの実装は大きく異なる場合があります。透過型パルスオキシメータでは、LEDから見てユーザーの指や耳たぶの反対側にフォトダイオードが配置されます。

 一般的に入手可能なフィンガークリップユニットでは、赤色、IR、オプションの緑色LEDがクリップの一方に、フォトダイオードがもう一方にまとめられています。反射型パルスオキシメータでは、フォトダイオードとLEDが皮膚の同じ側に配置され、その間にアーティファクトを低減するための光バリアが配置されます。

 たとえば、OSRAMのSFH7060は、LEDとフォトダイオードを単一の7.2×2.5×0.9mmパッケージに収めたドロップイン反射型測定デバイスです。

 これらの光学パッケージを透過型と反射型のどちらで使用するかにかかわらず、設計者は比較的少数の追加部品で低コストのパルスオキシメータの設計を実装できます。これにより、医療専門家による精密検査の必要性を示す情報を在宅ユーザーに提供することができます。

 Microchip TechnologyのDSPIC33FJ128GP802 DSCを中心に構築された設計例では、マイクロコントローラの統合型ペリフェラルを使用して、赤色やIR LEDにより皮膚の照明を制御し、調整済みのフォトダイオード出力信号をデジタル化しています(図2)。


図2:一般的なパルスオキシメータの設計では、LED照明とフォトダイオード信号処理のサブシステムを、照明のタイミングとデータ収集を制御するのに使用するマイクロコントローラと組み合わせます。(画像提供:Microchip Technology)

 一般的に、パルスオキシメータの設計は、照明光源にかかわらず、広範なスペクトル応答曲線により透過または反射された信号をキャプチャする単一のフォトダイオードに依存しています。

 受信した信号が赤色やIRの波長だけに対応するようにするために、ハードウェアやソフトウェアの制御ロジックは、特定の時間に赤色やIRの照明光源だけを提供します。2つの光源を繰り返すことにより、一連の測定を完了させます。

低コストのパルスオキシメータのハードウェア設計を実装

 この設計において、DSCは外部のMicrochip Technology製MCP4728 D/Aコンバータ(DAC)を使用して、必要な光度で各LEDを駆動するのに必要なレベルで別個のMBT2222トランジスタを設定します。

 各LEDの「オン」シーケンスを正確に時間調整するために、DSCは2つのパルス幅変調(PWM)出力を使用して、Analog DevicesのADG884アナログスイッチを制御します(図3)。


図3:デジタルコントローラからの赤色やIRチャンネルの信号を繰り返すことにより駆動されるアナログスイッチは、赤色やIR LEDへの駆動電流を可能にします。(画像提供:Microchip Technology)

 フォトダイオード出力を処理するために、単一のMicrochip Technology製MCP6002デバイスは、基本的な2段シグナルコンディショニングチェーンを実装するのに必要な1組のオペアンプを提供します。ここで、最初の段は、トランスインピーダンスアンプとして構成されたMCP6002オペアンプを使用して、フォトダイオードの電流出力を電圧信号に変換します。

 ノイズを低減するハイパスフィルタに続いて、MCP6002の2番目のオペアンプは、DSCに統合されたADCの範囲全体にわたって調整済み信号の振幅を最適化するのに必要なゲインとDCオフセット調整を提供します(図4)。


図4:2段シグナルチェーンは、デジタルコントローラの統合型ADCへ供給するためにフォトダイオード出力を調整します。(画像提供:Microchip Technology)

 動作中、DSCはPWM出力とADC入力を使用して、LED照明と調整済みフォトダイオード出力信号のADCデジタル化を同期します。ここで、繰り返される赤色やIRの照明期間は、信号の収集と変換により調整されます。両方のLEDがオフのときに取得される追加のADCサンプルは、LEDの光度とSpO2測定を最適化するのに使用される周囲光の測定を提供します。

 その結果、正確に制御された一連のイベントが発生します。これにより、LED照明とADCデジタル化を調整して、赤色波長の結果(Hb)、周囲光、最後にIR波長の結果(HbO2)をキャプチャします(図5)。


図5:低コストのパルスオキシメータの機能は、SpO2判定のための測定値を収集するのに必要な照明とデータキャプチャのシーケンスの正確なタイミングを管理するデジタル信号コントローラの能力に依存します。(画像提供:Microchip Technology)

割り込み駆動型ソフトウェアソリューションの実装

 Microchipは、DSCの使用を実証するサンプルプログラムによりパルスオキシメータのファームウェアパッケージを提供して、これらの照明制御とデータ変換シーケンスを実行します。

 ここで、プログラムは1組のDSCタイマ(Timer2とTimer3)を使用して、IR LEDや赤色LEDそれぞれ別個の「オン」シーケンスを時間調整する割り込み駆動方法を実装します。

 次に、各タイマは、IR LEDと赤色LEDそれぞれのアナログスイッチを制御するのに使用される2つのDSCの出力コンペア(OC)モジュール(OC1とOC2)のタイムベースを提供します。

 リスト1で示されているように、ソフトウェアは最初にTimer2とTimer3を初期化して、照明サイクルの望ましい期間を設定し、割り込みを有効にします。初期化シーケンスの一部として、DSCのリマッパブルピン(RP)機能を使用して、OC1およびOC2モジュールが異なる出力ピンに接続されます。

 次に、初期化シーケンスは照明デューティサイクルを設定し、そのタイムベースとして使用する関連タイマを選択します。

//*********************************************************************************************************
// 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)

 このアプローチでは、特定の割り込みサービスルーチン(ISR)エントリポイントを備えたDSCアーキテクチャの各タイマ割り込みの関連付けを活用します。たとえば、赤色LEDチャンネルのTimer3割り込みが発生すると、DSCは_T3Interruptのエントリポイントで関数を実行します。そのため、赤色LEDのTimer3が終了すると、2つの調整されたハードウェアおよびソフトウェアイベントが発生します。

・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:ここに示されているTimer3 ISRは、Microchip Technologyのサンプルコードパッケージに含まれ、赤色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のいくつかの違いに対応する必要があります。

 たとえば、DSPIC33FJ128GP802 DSCのTimer2/Timer3機能の代わりに、DSPIC33CK64MP102 DSCは一連の多目的タイマモジュールを提供します。これにより、開発者はこの記事に含まれるリストで説明された機能の一部に対し独自のソリューションを提供する必要があります。

 それでも、動作原則は同じであり、開発者は少なくともMicrochip Technologyのサンプルソフトウェアパッケージで示された設計パターンを使用して、独自のカスタムソフトウェア設計の導きとすることができます。

結論

 血中酸素飽和度の測定は、呼吸機能の重要な指標を提供し、新型コロナウイルス感染症拡大中の健康管理において重要なツールとなっています。簡単な光学的方法を使用することにより、パルスオキシメータは末梢酸素飽和(SpO2)の信頼できる推測値を提供します。これにより、感染拡大中に使用できる手頃な価格の健康管理ソリューションという特定ニーズを満たすことができます。

 前述のとおり、少数の基本部品と組み合わせることにより、 DSCは低コストのパルスオキシメータを実装するための効果的なハードウェア基盤を提供します。これにより、SpO2測定を確実に提供でき、新型コロナウイルス感染症の進行に対してユーザーが医療機関を受診する必要性を示唆することも可能になります。



免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、Digi-Key Electronicsの意見、信念および視点またはDigi-Key Electronicsの公式な方針を必ずしも反映するものではありません。

 

このページのコンテンツはDigi-Key社より提供されています。
英文でのオリジナルのコンテンツはDigi-Keyサイトでご確認いただけます。
   


Digi-Key社の全製品は 1個からマルツオンラインで購入できます

※製品カテゴリー総一覧はこちら



ODM、OEM、EMSで定期購入や量産をご検討のお客様へ【価格交渉OK】

毎月一定額をご購入予定のお客様や量産部品としてご検討されているお客様には、マルツ特別価格にてDigi-Key社製品を供給いたします。
条件に応じて、マルツオンライン表示価格よりもお安い価格をご提示できる場合がございます。
是非一度、マルツエレックにお見積もりをご用命ください。


ページトップへ