脈搏血氧飽和度_第1頁
脈搏血氧飽和度_第2頁
脈搏血氧飽和度_第3頁
脈搏血氧飽和度_第4頁
脈搏血氧飽和度_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

脈搏血氧飽和度的測量一、測量值:脈搏血氧飽和度、脈率二、測量原理:以兩路光線(紅光vs,紅外光ir)高頻交替照射被測部位,兩路透射光經(jīng)光電轉(zhuǎn)換得到兩路變化的光電流信號,兩路光電流信號經(jīng)過放大、去直流、去工頻干擾得到兩路信號的交流部分,交流部分的平均功率之比即為動脈血的含氧量,通過線性擬合得到脈搏血氧飽和度;其中任何一路信號交流部分即為脈搏波,測得其周期可計算出脈率。三、測量電路及其參數(shù)。電路包括三部分:探頭驅(qū)動電路、光電流放大和去直流電路、計算電路。探頭驅(qū)動電路實(shí)現(xiàn)兩路光線由對稱的兩組三極管構(gòu)成,與計算電路的兩個IO端口和兩個DA端口相連,分別控制兩路光線的交替開關(guān)和幅值。光電流放大和去直流電路由兩級運(yùn)放構(gòu)成,一級運(yùn)放將光電流信號放大為電壓信號,這個電壓信號包含交流分量和較大的直流分量(分別對應(yīng)著測量部位的動脈血和其他成分),因此需要二級運(yùn)放去直流處理。計算電路接受兩個運(yùn)放的輸出,作為反饋為探頭驅(qū)動電路和去直流電路提供參考電壓幅值。探頭接口說明:1為地線,6、7分別為外屏蔽和內(nèi)屏蔽線,2為紅外光輸入正極,紅光輸入負(fù)極,3為紅光輸入正極,紅外光輸入負(fù)極,9為光電管輸出正極,5為光電管輸出負(fù)極。四、測量流程 基本測量流程如下圖。200Hz定時器中斷,兩路LED交替通斷,即1秒內(nèi)兩路光各有100次采樣。以紅外光這一路為例:每次開啟紅外光LED,根據(jù)OA0輸出改變LED的幅度ir_LED_level(Q3的基極),根據(jù)OA1輸出改變?nèi)ブ绷麟娐返闹绷鲄⒖茧妷篿r_dc_offset(OA1的正向輸入端),得到的OA1的輸出作為計算電路的輸入,關(guān)燈,原始信號去工頻處理后得到ir_heart_signal,數(shù)字去直流后得到ir_heart_signal_ac,該信號進(jìn)入脈搏波周期判斷的隊(duì)列g(shù)roup_caculate[64],同時計算ir_heart_signal_ac信號的平方和,并且采樣計數(shù),同時進(jìn)行脈搏周期的判斷。數(shù)字信號直流跟隨可表達(dá)為:跟隨系數(shù)×(輸入信號-直流分量)+直流分量=更新的直流分量。脈搏周期的判斷過程:隊(duì)列相當(dāng)于在脈搏波信號上一個滑動的窗口,窗口應(yīng)有一定寬度,大于噪聲時間,但需小于脈搏周期。判斷過程如下:當(dāng)最小值位置處于窗口中部位置時則判定為一個波谷,檢測到波谷以后窗口繼續(xù)滑過10個采樣點(diǎn),但不再檢查最小值,確保上一個波谷已經(jīng)離開窗口中心,然后繼續(xù)檢查最小值位置確定下一個波谷??梢苑譃槿N狀態(tài)分別稱之為確定波谷、離開波谷、尋找波谷。如下圖。利用局部特征實(shí)時判斷脈搏周期的三個階段:1)確定波谷,確定周期,計算血氧飽和度和脈率,清空計數(shù);2)離開波谷,開始計數(shù),計算信號平方和;3)尋找波谷,保持計數(shù),計算平方和,確定窗口中最小值位置五、測量程序?qū)崿F(xiàn)(可參考pulsoximeter.c文件)1、變量設(shè)置1)全局參量根據(jù)運(yùn)放一的輸出經(jīng)AD轉(zhuǎn)化后判斷LED是否過亮過暗,2500到3000之間為合適亮度,否則進(jìn)行調(diào)節(jié),快速調(diào)節(jié)步長為2,細(xì)調(diào)步長為1,可根據(jù)實(shí)際電路修改。//反饋控制LED驅(qū)動幅度時的上下界和調(diào)節(jié)步長#defineFIRST_STAGE_TARGET_HIGH3000#defineFIRST_STAGE_TARGET_LOW2500#defineFIRST_STAGE_TARGET_HIGH_FINE3500#defineFIRST_STAGE_TARGET_LOW_FINE2000#defineFIRST_STAGE_STEP2#defineFIRST_STAGE_FINE_STEP12)全局變量//脈搏血氧信號,存儲脈搏血氧幾個處理方法后的值int32_tir_heart_signal;//紅外光,OA1輸出經(jīng)過平均濾波后,等待數(shù)字去直流int32_tvs_heart_signal;//紅光,OA1輸出經(jīng)過平均濾波后,等待數(shù)字去直流int32_tir_heart_signal_ac;//紅外光,經(jīng)過數(shù)字去直流,進(jìn)入計算窗口,參加平方和的累加int32_tvs_heart_signal_ac;//紅光,經(jīng)過數(shù)字去直流,進(jìn)入計算窗口,參加平方和的累加int32_tsum_ir_heart_signal_ac=0;//紅外光,信號平方和累加值,一個周期計算平均功率int32_tsum_vs_heart_signal_ac=0;//紅光,信號平方和累加值,一個周期計算平均功率//計算過程信號intgroup_wave[512];//用于顯示,循環(huán)隊(duì)列,存儲幾個周期內(nèi)的ir_heart_signal_ac信號intoffset_wave=0;//循環(huán)隊(duì)列隊(duì)列頭intflag_initial=1;//初始化標(biāo)志位intsample_count=0;//采樣計數(shù),每個周期清空,重新計數(shù)intnum_beat=0;//初始值為1,下一個脈搏后為2,計算平均功率和血氧飽和度,重新置1intflag_jump=0;//脈搏波周期判斷,是否處于離開波谷的狀態(tài)intsample_jump=0;//離開波谷時的采樣計數(shù),到20則已離開波谷,置0,flag_jump置1//循環(huán)隊(duì)列,以滑動窗口的形式判斷當(dāng)前是否為脈搏波波谷intgroup_caculate[64];//用于脈搏周期判斷的循環(huán)隊(duì)列,存儲64個ir_heart_signal_ac信號intoffset_caculate=0;//隊(duì)列頭位置intmin;//隊(duì)列中最小值intlocation_min;//最小值位置intlocation_min_adjust;//最小值相對與隊(duì)列頭的位置,如果是32則確認(rèn)一個波谷//最終結(jié)果//脈率unsignedintheart_rate=6000;//脈率最終測量結(jié)果,初始值為60.00unsignedintgroup_heart_rate[8];//最近8秒內(nèi)的脈率,循環(huán)隊(duì)列,初始化為6000intoffset_heart_rate=0;//隊(duì)列頭unsignedintsample_heart_rate;//脈率當(dāng)前原始結(jié)果,經(jīng)過一定調(diào)整后進(jìn)入group_heart_rate[8]int32_tsum_heart_rate;//最近8秒的脈率累加值,除以8得到新的heart_rate//脈搏血氧飽和度unsignedintSpO2=9500;//血氧飽和度最終測量結(jié)果,初始值為95.00unsignedintgroup_SpO2[8];//最近8秒內(nèi)的血氧飽和度,循環(huán)隊(duì)列,初始化為9500intoffset_SpO2=0;//隊(duì)列頭int32_tsum_SpO2;//最近8秒的血氧飽和度累加值,除以8得到新的heart_rate//控制參數(shù)intfresh=0;//調(diào)試使用,無意義//反饋控幅和OA1參考電壓的參數(shù)intled_tab=0;//控制開啟紅光還是紅外光,每次中斷切換狀態(tài)intir_LED_level;//ir驅(qū)動幅度,控制Q3基極,范圍1到2500,數(shù)字越大,亮度越弱intvs_LED_level;//vs驅(qū)動幅度,控制Q4基極,范圍1到4095,數(shù)字越大,亮度越弱intir_dc_offset=4095;//ir燈直流參考電壓,開啟紅外LED時,控制OA1正向輸入端intvs_dc_offset=4095;///vs燈直流參考電壓,開啟紅光LED時,控制OA1正向輸入端intir_dc_offset_second=0;//數(shù)字去直流時的直流跟隨量intvs_dc_offset_second=0;//數(shù)字去直流時的直流跟隨量//運(yùn)放輸出的輸出intir_sample;//ir燈,OA0的輸出,根據(jù)該輸出改變ir_LED_levelintvs_sample;//vs燈,OA0的輸出,根據(jù)該輸出改變vs_LED_level3)子函數(shù)unsignedlongisqrt32(registerunsignedlongh);//開方運(yùn)算int16_tir_filter_test(int16_tsample);//平均濾波器_紅外int16_tvs_filter_test(int16_tsample);//平均濾波器_紅光2、程序主體(請參照pulsoximeter.c文件)1)晶振、電源設(shè)置2)初始化操作:group_heart_rate[8]初始化為6000,sum_heart_rate初始化為48000,group_SpO2[8]初始化為9500,sum_SpO2初始化為76000。3)DAC設(shè)置,ir_LED_level初始化為2500,vs_LED_level初始化為900。ADC設(shè)置。定時器設(shè)置,200Hz采樣中斷,1600Hz用于PWM輸出。4)設(shè)置完,進(jìn)入低功耗模式5)中斷處理程序,200Hz中斷,中斷進(jìn)入后或者進(jìn)入紅光LED流程,或者進(jìn)入紅外LED流程,都要根據(jù)輸入調(diào)整相應(yīng)參數(shù),進(jìn)行平均濾波,去直流處理。兩種流程其他計算上有所不同:在紅光流程中主要進(jìn)行兩路信號平方和累加、采樣計數(shù)、脈搏血氧飽和度和脈率的計算;紅外流程里主要進(jìn)行的是脈搏周期的判斷。兩個流程的具體操作如下。紅光流程:關(guān)閉兩路燈,設(shè)置參數(shù),開啟紅光LED,讀取輸入,關(guān)閉紅光LED,根據(jù)輸入調(diào)整參數(shù),平均濾波,去直流,循環(huán)隊(duì)列更新,是否處于找到波谷的狀態(tài)(num_beat由1變?yōu)?,找到,否則未找到),未找到則計算兩路平方和,采樣計數(shù)累加,找到則計算脈搏血氧飽和度和脈率,平方和、采樣計數(shù)置0。紅外流程:關(guān)閉兩路燈,設(shè)置參數(shù),開啟紅光LED,讀取輸入,關(guān)閉紅光LED,根據(jù)輸入調(diào)整參數(shù),平均濾波,去直流,循環(huán)隊(duì)列更新,是否處于離開波谷的狀態(tài)(flag_jump==0時為尋找狀態(tài),flag_jump==0時為離開狀態(tài)),尋找狀態(tài)找到循環(huán)隊(duì)列中最小值及位置,判斷是否波谷,不是波谷繼續(xù)尋找,是波谷則進(jìn)入離開狀態(tài),離開狀態(tài)僅計數(shù),計數(shù)滿20次進(jìn)入尋找狀態(tài)。中斷程序代碼如下所示://紅光流程if(led_tab==0)//led_tab==0,打開紅光LED{led_tab=1;//切換led_tab,下一次進(jìn)入紅外流程P2OUT|=BIT2;//關(guān)燈P2OUT|=BIT3;//關(guān)燈DAC12_0CTL&=~DAC12ENC;//開啟DAC,根據(jù)vs_LED_level給出幅度DAC12_0CTL&=~DAC12OPS;DAC12_0CTL|=DAC12ENC;DAC12_0DAT=vs_LED_level;//紅光LED驅(qū)動幅度DAC12_1DAT=vs_dc_offset;//紅光去直流電路的參考電壓,OA1正向輸入P2OUT&=~BIT3;//開燈,紅光LEDADC12CTL0&=~ENC;//開啟DAC,讀取OA0、OA1輸出ADC12CTL0|=ENC;for(m=1;m<=1500;m++)//偽循環(huán)提供DAC轉(zhuǎn)換時間,紅光LED保持開{}vs_sample=ADC12MEM0;//OA0輸出結(jié)果i=ADC12MEM1;//OA1輸出結(jié)果//OA0輸出,根據(jù)全局參量控制LED的驅(qū)動幅度if(vs_sample>=FIRST_STAGE_TARGET_HIGH||vs_sample<=FIRST_STAGE_TARGET_LOW){if(vs_sample>=FIRST_STAGE_TARGET_HIGH){if(vs_sample>=FIRST_STAGE_TARGET_HIGH_FINE)vs_LED_level+=FIRST_STAGE_STEP;elsevs_LED_level+=FIRST_STAGE_FINE_STEP;if(vs_LED_level>=4095)vs_LED_level=4095;}else{if(vs_sample<=FIRST_STAGE_TARGET_LOW_FINE)vs_LED_level-=FIRST_STAGE_STEP;elsevs_LED_level-=FIRST_STAGE_FINE_STEP;if(vs_LED_level<=1)vs_LED_level=1;}}//OA1輸出,控制OA1輸入的參考電壓if(i>=4095){if(vs_dc_offset>0)vs_dc_offset--;}elseif(i<100){if(vs_dc_offset<4095)vs_dc_offset++;}DAC12_0CTL&=~DAC12ENC;//關(guān)閉DAC_NOP();_NOP();P2OUT|=BIT2;//關(guān)燈P2OUT|=BIT3;//關(guān)燈//實(shí)時處理vs_heart_signal=vs_filter_test(i);//OA1輸出,平均濾波處理vs_dc_offset_second+=((vs_heart_signal-vs_dc_offset_second)>>7);//數(shù)字直流跟隨vs_heart_signal_ac=vs_heart_signal-vs_dc_offset_second;//去直流group_wave[offset_wave]=ir_heart_signal_ac+4000;//加4000保證脈搏波信號為正offset_wave=(offset_wave+1)&0x1ff;//循環(huán)隊(duì)列更新,用于顯示group_caculate[offset_caculate]=ir_heart_signal_ac;//循環(huán)隊(duì)列更新,用于脈搏判斷offset_caculate=(offset_caculate+1)&0x3f;if(num_beat>=1)//num_beat是否為1{sample_count++;//采樣計數(shù) //兩路信號平方和累加sum_vs_heart_signal_ac+=((vs_heart_signal_ac*vs_heart_signal_ac)>>10);sum_ir_heart_signal_ac+=((ir_heart_signal_ac*ir_heart_signal_ac)>>10);}if(num_beat>=2)//num_beat是否為2,為2表示找到一個新的波谷{int32_tx=isqrt32(sum_vs_heart_signal_ac);//平方和開方int32_ty=isqrt32(sum_ir_heart_signal_ac);//平方和開方int32_tw=100*x/y;//平均功率之比R×100sum_SpO2-=group_SpO2[offset_SpO2];//8秒內(nèi)血氧飽和度之和減去8秒前的值 //計算當(dāng)先新的脈搏血氧飽和度,擬合公式110-25×R,R為平均功率之比group_SpO2[offset_SpO2]=11000-25*w; //調(diào)整新的脈搏血氧飽和度,變化不能超過3個百分點(diǎn),范圍在85到100之間if(group_SpO2[offset_SpO2]>(group_SpO2[(offset_SpO2-1)&0x07]+300)){group_SpO2[offset_SpO2]=group_SpO2[(offset_SpO2-1)&0x07]+300;}elseif(group_SpO2[offset_SpO2]<(group_SpO2[(offset_SpO2-1)&0x07]-300)){group_SpO2[offset_SpO2]=group_SpO2[(offset_SpO2-1)&0x07]-300;}else{}if(group_SpO2[offset_SpO2]>10000){group_SpO2[offset_SpO2]=10000;}elseif(group_SpO2[offset_SpO2]<8500){group_SpO2[offset_SpO2]=8500;}else{}sum_SpO2+=group_SpO2[offset_SpO2];//8秒內(nèi)血氧飽和度之和加上當(dāng)前的值offset_SpO2=(offset_SpO2+1)&0x07;SpO2=sum_SpO2/8;//計算平均值,得到最終結(jié)果//清空計數(shù)和變量重置sum_vs_heart_signal_ac=0;//平方和累加值置零sum_ir_heart_signal_ac=0;//平方和累加值置零//脈率的計算sample_heart_rate=600000/sample_count;//由脈搏周期換算成脈率num_beat=1;//脈搏計數(shù)重置成1sample_count=0;//采樣計數(shù)置0if(sample_heart_rate<1000||sample_heart_rate>18000)//明顯錯誤的結(jié)果{}else{//8秒內(nèi)脈率之和減去8秒前的值sum_heart_rate-=group_heart_rate[offset_heart_rate]; //循環(huán)隊(duì)列更新,得到當(dāng)前脈率group_heart_rate[offset_heart_rate]=sample_heart_rate;//8秒內(nèi)脈率之和加上當(dāng)前值sum_heart_rate+=group_heart_rate[offset_heart_rate];offset_heart_rate=(offset_heart_rate+1)&0x07; //求平均值,為脈率最終結(jié)果heart_rate=sum_heart_rate/8;}fresh=1;}}//紅外流程else{//前面部分與紅光部分一致,關(guān)燈,設(shè)置參數(shù),開燈,讀取運(yùn)放輸出,關(guān)燈,平均濾波,去//直流,不再做注釋,注釋的主要是脈搏周期的判斷部分led_tab=0;P2OUT|=BIT2;//關(guān)燈P2OUT|=BIT3;//關(guān)燈DAC12_0CTL&=~DAC12ENC;DAC12_0CTL|=DAC12OPS;DAC12_0CTL|=DAC12ENC;DAC12_0DAT=ir_LED_level;//紅外LED驅(qū)動幅度DAC12_1DAT=ir_dc_offset;//OA1輸入?yún)⒖茧妷篜2OUT&=~BIT2;//開燈ADC12CTL0&=~ENC;ADC12CTL0|=ENC;for(m=1;m<=1500;m++){}ir_sample=ADC12MEM0;//OA0輸出,用以控制LED驅(qū)動幅度i=ADC12MEM1;//OA1輸出,初始未處理的信號j=ADC12MEM2;k=ADC12MEM3;//OA0輸出,控制LED驅(qū)動幅度if(ir_sample>=FIRST_STAGE_TARGET_HIGH||ir_sample<=FIRST_STAGE_TARGET_LOW){if(ir_sample>=FIRST_STAGE_TARGET_HIGH){if(ir_sample>=FIRST_STAGE_TARGET_HIGH_FINE)ir_LED_level+=FIRST_STAGE_STEP;elseir_LED_level+=FIRST_STAGE_FINE_STEP;if(ir_LED_level>=2500)ir_LED_level=2500;}else{if(ir_sample<=FIRST_STAGE_TARGET_LOW_FINE)ir_LED_level-=FIRST_STAGE_STEP;elseir_LED_level-=FIRST_STAGE_FINE_STEP;if(ir_LED_level<=1)ir_LED_level=1;}}//OA1輸出,控制OA1輸入的參考電壓if(i>=4095){if(ir_dc_offset>0)ir_dc_offset--;}elseif(i<100){if(ir_dc_offset<4095)ir_dc_offset++;}DAC12_0CTL&=~DAC12ENC;_NOP();_NOP();P2OUT|=BIT2;//關(guān)燈P2OUT|=BIT3;//關(guān)燈T_body_signal=j;T_enviroment_signal=k;ir_heart_signal=ir_filter_test(i);//初始信號濾波處理ir_dc_offset_second+=((ir_heart_signal-ir_dc_offset_second)>>7);ir_heart_signal_ac=ir_heart_signal-ir_dc_offset_second;//是否為程序啟動狀態(tài),此時flag_initial==1if(flag_initial==1){if(offset_wave>=500){flag_initial=0;}}else{//脈搏周期的判斷if(flag_jump==0)//flag_jump==0,表示處在尋找波谷狀態(tài){sample_jump=0;//離開波谷時的采樣計數(shù)置0//尋找group_caculate[64]循環(huán)隊(duì)列中的最小值及其位置min=group_caculate[0];location_min=0;for(inti=1;i<64;i++){if(min<group_caculate[i]){min=group_caculate[i];location_min=i;}} //計算最小值位置距離隊(duì)列頭距離if(location_min<=offset_caculate){location_min_adjust=offset_caculate-location_min;}else{location_min_adjust=offset_caculate+64-location_min;} //最小值是否在隊(duì)列正中if(location_min_adjust==31||location_min_adjust==32){flag_jump=1;//如果是,找到波谷,進(jìn)入離開波谷狀態(tài)//脈搏計數(shù)增加,如果是程序第一次找到,則由0到1,以后則總是由1到2num_beat++;P1OUT^=BIT0;}}else//flag_jump==1,表示處在離開波谷狀態(tài){sample_jum

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論