摘 要: 研制一款便攜式心電監(jiān)護(hù)系統(tǒng)對(duì)于預(yù)防老年人群的心腦血管疾病有著十分重要的意義。本文設(shè)計(jì)中使用了當(dāng)前比較流行的三星公司ARM11系列的低功耗、功能強(qiáng)大的S3C6410作為心電監(jiān)護(hù)系統(tǒng)的核心控制單元,并在ARM平臺(tái)上設(shè)計(jì)擴(kuò)展一塊心電信號(hào)采集及處理板,剪切并移植打包了開源的Linux操作系統(tǒng)。在嵌入式Linux系統(tǒng)平臺(tái)上構(gòu)建的便攜式心電監(jiān)護(hù)系統(tǒng),能夠?qū)崿F(xiàn)人體心電信號(hào)的實(shí)時(shí)采集、實(shí)時(shí)心率計(jì)算、實(shí)時(shí)交互的GUI界面顯示等功能。測(cè)試結(jié)果表明,便攜式心電監(jiān)護(hù)系統(tǒng)的各功能正常,性能良好,工作性能達(dá)到系統(tǒng)設(shè)計(jì)要求。
關(guān)鍵詞: ARM;心電監(jiān)護(hù);便攜式;嵌入式Linux
0 引言
隨著中國人口老齡化逐漸嚴(yán)重,心腦血管疾病的發(fā)病率大大提升,研制一款便攜式心電監(jiān)護(hù)系統(tǒng)對(duì)于預(yù)防老年人群的心腦血管疾病有著十分重要的意義[1]。本文結(jié)合飛速發(fā)展的嵌入式Linux系統(tǒng),使用當(dāng)前比較流行的三星公司ARM11系列的低功耗、功能強(qiáng)大的S3C6410作為心電監(jiān)護(hù)系統(tǒng)的核心控制單元,在ARM平臺(tái)上移植了嵌入式Linux系統(tǒng),在該平臺(tái)上開發(fā)便攜式心電監(jiān)護(hù)系統(tǒng),實(shí)現(xiàn)對(duì)人體心電信號(hào)的實(shí)時(shí)采集、實(shí)時(shí)心率計(jì)算、實(shí)時(shí)交互的GUI界面顯示等功能。主要介紹了便攜式心電監(jiān)護(hù)系統(tǒng)的軟硬件設(shè)計(jì)與實(shí)現(xiàn)。
1 系統(tǒng)硬件設(shè)計(jì)與實(shí)現(xiàn)
嵌入式系統(tǒng)硬件由心電信號(hào)調(diào)理電路和嵌入式系統(tǒng)兩部分構(gòu)成。這兩部分既相互獨(dú)立又緊密聯(lián)系,兩者協(xié)同工作。嵌入式系統(tǒng)是整個(gè)硬件的核心,它控制整個(gè)系統(tǒng)外圍設(shè)備進(jìn)行工作,而心電調(diào)理電路則為后端的嵌入式系統(tǒng)提供純凈的心電信號(hào)。
1.1 心電采集與調(diào)理電路設(shè)計(jì)
通過人體電極采集人體的心電信號(hào),信號(hào)由導(dǎo)聯(lián)線傳送給儀表放大電路進(jìn)行一級(jí)放大,從儀表放大電路輸出兩路信號(hào)分別傳送至左腿驅(qū)動(dòng)電路和高通濾波電路,左腿驅(qū)動(dòng)電路輸出的信號(hào)反饋到左腿電極進(jìn)一步消除共模信號(hào),高通濾波器將信號(hào)中的超低頻信號(hào)濾除,然后將信號(hào)傳送到主放大電路進(jìn)行二級(jí)放大。放大后的信號(hào)傳送到低通濾波器濾除信號(hào)中的高頻噪聲,從低通濾波器輸出的信號(hào)傳送入工頻陷波電路,去除信號(hào)中交流電產(chǎn)生的50 Hz干擾,最后信號(hào)被送入電平提升電路。這個(gè)電路主要是給心電信號(hào)加入一個(gè)直流分量,使信號(hào)被ADC采樣后不會(huì)失真。圖1是心電信號(hào)調(diào)理電路的模塊圖,主要由以下幾個(gè)模塊組成:
?。?)人體電極,采用一次性黏貼型傳導(dǎo)電極。
?。?)心電導(dǎo)聯(lián)線,采用自編三絞線,編織成三角形狀的導(dǎo)聯(lián)線可以消除部分干擾,減小心電信號(hào)的失真。
?。?)儀表放大電路,采用亞諾德半導(dǎo)體(AD)公司生產(chǎn)的單電源儀表放大器AD620。AD620在電源供電為±5 V時(shí),允許的最大輸出電壓范圍是±3.8 V,而心電信號(hào)的幅值在±5 mV之間,加上體表和心電電極產(chǎn)生的±300 mV共模直流偏移電壓,所以AD620可以設(shè)置最大的增益為12.88[2]。本設(shè)計(jì)將增益設(shè)置為10,RG設(shè)置為5 k。
(4)左腿驅(qū)動(dòng)電路,采用方向放大電路,兩個(gè)輸入端電壓相等并等于0,故沒有共模輸入信號(hào)[3]。因此,左腿驅(qū)動(dòng)電路對(duì)共模抑制沒有要求,在放大器選擇上也沒有嚴(yán)格要求,本設(shè)計(jì)采用的是AD公司生產(chǎn)的常用運(yùn)算放大器OP07。
(5)高通濾波器,高通濾波電路仍沿用左腿驅(qū)動(dòng)電路中使用過的運(yùn)算放大器OP07作為放大器件,高通濾波部分采用帶內(nèi)幅頻特性曲線平坦的一階有源巴特沃思濾波器。
?。?)主運(yùn)算放大電路,ADC轉(zhuǎn)換器采用ARM自帶的10位AD。實(shí)際電路中,將前后兩級(jí)放大電路的增益設(shè)定為1 000倍。
?。?)低通濾波電路,采用OP07運(yùn)算放大器,采用二階有源巴特沃思低通濾波器,以提高濾波器幅頻曲線的下降速度。
?。?)工頻陷波電路,濾除對(duì)心電信號(hào)影響嚴(yán)重的交流電50 Hz工頻干擾。
(9)電平提升電路,將從前面電路輸出的心電信號(hào)提升一個(gè)直流分量,使得心電信號(hào)的負(fù)值部分全部轉(zhuǎn)換成正電平信號(hào)。這樣就解決了因ADC采樣而造成的信號(hào)丟失,避免了ADC采樣后心電信號(hào)的失真。
1.2 數(shù)字電路設(shè)計(jì)
數(shù)字電路部分是便攜式心電監(jiān)護(hù)系統(tǒng)后期對(duì)信號(hào)處理并實(shí)現(xiàn)與用戶交互的核心部分。心電信號(hào)由模擬電路的輸出端送入ADC轉(zhuǎn)換器后,實(shí)現(xiàn)了從模擬信號(hào)處理到數(shù)字信號(hào)處理的轉(zhuǎn)換。這一轉(zhuǎn)換方便了后期對(duì)心電信號(hào)的實(shí)時(shí)采集、實(shí)時(shí)心率計(jì)算、實(shí)時(shí)傳輸以及實(shí)時(shí)顯示。數(shù)字部分由OK6410的核心板構(gòu)成的嵌入式最小系統(tǒng),以及底板上的ADC電路、LCD控制電路、SD卡接口電路和以太網(wǎng)接口電路等組成。數(shù)字電路部分組成框圖如圖2所示。
?。?)嵌入式最小系統(tǒng),以內(nèi)核為ARM11 76JZF-S的S3C6410微處理器為中心,周圍有與之相配接的復(fù)位電路、時(shí)鐘電路、輔助電源、SDRAM電路以及Flash電路等,保證嵌入式微處理器能夠正常運(yùn)行系統(tǒng)。OK6410核心板提供了四個(gè)不同的晶振源,復(fù)位電路使用了專業(yè)的復(fù)位芯片Max811,S3C6410微處理器需要多種電源供電,所以核心板每一路電源輸入由電源芯片單獨(dú)供電。同時(shí),S3C6410外擴(kuò)了一個(gè)256 MB的DAND Flash存儲(chǔ)器和一個(gè)128 MB的Mobile DDR內(nèi)存。
?。?)ADC電路,S3C6410處理器內(nèi)置了一個(gè)參考電壓為3.3 V的10位A/D,這個(gè)內(nèi)置的A/D可以滿足心電信號(hào)采樣對(duì)A/D分辨率的要求,同時(shí)A/D的電壓與S3C6410的電源電壓相匹配,使A/D的位數(shù)得到充分的利用。將從信號(hào)預(yù)處理模塊輸出的心電信號(hào)接入S3C6410的ADC輸入引腳,再通過相應(yīng)的軟件處理,就可以將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)。本設(shè)計(jì)使用一路A/D,所以將模擬電路輸出的信號(hào)接入S3C6410的ADCIN0引腳即可。
(3)LCD控制電路,由MAX202E和RS232 DB-9針母座構(gòu)成串口電路。串口電路的驅(qū)動(dòng)選用MAXIM公司專為苛刻環(huán)境下進(jìn)行RS-232通信設(shè)計(jì)的MAX202E線驅(qū)動(dòng)/接收器芯片。其中,MAX202E的兩個(gè)驅(qū)動(dòng)器T1O、T2O分別與RS-232的接收數(shù)據(jù)端RXD和允許發(fā)送端CTS相連;兩個(gè)接收器R1IN和R2IN分別與發(fā)送數(shù)據(jù)端TXD和請(qǐng)求發(fā)送端RTS相連。
?。?)以太網(wǎng)口電路,采用Davicom公司生產(chǎn)的10/100 M以太網(wǎng)控制器DM9000芯片,DM9000的SD0~SD15與S3C6410的數(shù)據(jù)總線DATA0~DATA15相連,DM9000的命令/數(shù)據(jù)使能端CMD與S3C6410的共同地址線ADDR2相連。
?。?)SD卡接口電路,OK6410開發(fā)板集成了一個(gè)SD卡座CON2。本設(shè)計(jì)使用SD卡啟動(dòng)S3C6410處理器,將U-boot放入SD卡中,由SD卡啟動(dòng)從而引導(dǎo)加載Linux內(nèi)核。
2 系統(tǒng)軟件設(shè)計(jì)與實(shí)現(xiàn)
2.1 嵌入式Linux系統(tǒng)的移植
嵌入式Linux系統(tǒng)是在Linux系統(tǒng)基礎(chǔ)上針對(duì)嵌入式系統(tǒng)進(jìn)行內(nèi)核裁減和優(yōu)化后形成的一種小型操作系統(tǒng)[4-5]。本設(shè)計(jì)采用嵌入式Linux作為操作系統(tǒng),選用Linux3.01內(nèi)核在嵌入式S3C6410上移植。具體的移植過程如下:
?。?)配置開發(fā)環(huán)境。使用安裝Ubuntu12.10操作系統(tǒng)的PC作為主機(jī),安裝GNU Tools跨平臺(tái)開發(fā)工具鏈以及arm-linux-gcc、arm-linux-ld等交叉編譯工具。
?。?)建立引導(dǎo)加載程序Boorloader,采用DAND Flash方式啟動(dòng)U-boot。
(3)解壓內(nèi)核源碼,然后進(jìn)到內(nèi)核源碼修改Makefile文件,添加對(duì)arm的支持:將“arch=”和“CROSS_COMPILE=”改為“arch=arm”和“CROSS_COMPILE=arm”[6]。
(4)配置內(nèi)核。通過命令“make menuconfig”進(jìn)入配置欄進(jìn)行配置。本設(shè)計(jì)需針對(duì)A/D轉(zhuǎn)換驅(qū)動(dòng)、觸摸屏驅(qū)動(dòng)進(jìn)行配置。
(5)執(zhí)行“make zImage”命令,進(jìn)行內(nèi)核編譯。將編譯后在“arch/arm/boot/”目錄下生成的U-boot格式的內(nèi)核映像文件“zImage”下載到目標(biāo)板上。
?。?)編譯并安裝BusyBox,建立根文件系統(tǒng)。執(zhí)行命令:./mkyaffsimage sdrootfs/rootfs.yaffs2生成yaffs2鏡像文件并下載到目標(biāo)板上。
2.2 應(yīng)用程序的設(shè)計(jì)與實(shí)現(xiàn)
本系統(tǒng)所實(shí)現(xiàn)的應(yīng)用程序模塊有心電采集模塊、心率計(jì)算模塊及GUI用戶界面模塊。這些應(yīng)用程序在嵌入式操作系統(tǒng)環(huán)境下運(yùn)行,通過驅(qū)動(dòng)設(shè)備程序提供的接口來控制ADC、LCD、蜂鳴器等設(shè)備。
?。?)心電采集模塊。通過控制ADC進(jìn)行采樣,將模擬信號(hào)轉(zhuǎn)換得到的數(shù)字信號(hào)讀入數(shù)據(jù)緩存區(qū),方便后面的模塊對(duì)數(shù)據(jù)進(jìn)行下一步的處理。本設(shè)計(jì)采用給PWM定時(shí)器和A/D采樣分別建立一個(gè)單獨(dú)的線程的方法,在需要進(jìn)行采樣時(shí)由PWM定時(shí)器線程通過pthread_cond_sigal()函數(shù)喚醒A/D采樣線程。心電監(jiān)護(hù)開始后,由主程序建立PWM定時(shí)器和A/D采樣線程,在開始采樣之前,首先對(duì)ADC進(jìn)行初始化并啟動(dòng)ADC和PWM定時(shí)器,PWM功能是由Timer0和Timer提供。為了保證系統(tǒng)工作的實(shí)時(shí)性和可靠性,本設(shè)計(jì)采集模塊采用兩個(gè)數(shù)據(jù)緩存交替存儲(chǔ)數(shù)據(jù),避免了采集的新數(shù)據(jù)將其他模塊沒有處理完的數(shù)據(jù)覆蓋。心電采集模塊流程如圖3所示。
?。?)心率計(jì)算模塊。心率在標(biāo)準(zhǔn)心電信號(hào)中表現(xiàn)為每分鐘出現(xiàn)R波的次數(shù)。心率計(jì)算模塊根據(jù)采集的心電信號(hào)計(jì)算出用戶的實(shí)時(shí)心率。式(1)為計(jì)算實(shí)時(shí)心率的公式。
X=(NR-1)/(PLR-PFR)×(60×fs)(1)
其中,X為所求心率;fs為心電信號(hào)采集頻率;NR為某段時(shí)間內(nèi)心電信號(hào)R波的個(gè)數(shù);PLR為該段時(shí)間內(nèi)最后一個(gè)R波的位置;PFR為該段時(shí)間內(nèi)第一個(gè)R波的位置。
因此,只要檢測(cè)出一分鐘里R波的個(gè)數(shù)就可以算出心率值。目前,較為流行的檢測(cè)算法是閾值差分算法。這種算法實(shí)現(xiàn)簡(jiǎn)單,檢測(cè)率高而且速度很快,但缺點(diǎn)是一旦確定了一個(gè)閾值后就不再更新閾值,如果閾值在計(jì)算過程中出現(xiàn)錯(cuò)誤,將導(dǎo)致整個(gè)R波檢測(cè)過程的可靠性下降。為此,本文在該算法基礎(chǔ)上提出了一種改進(jìn)的R波檢測(cè)差分閾值算法。
該算法涉及了ADC采樣問題。本文在A/D采樣時(shí),對(duì)采樣值做了一個(gè)滑動(dòng)平均濾波處理,即利用A/D底層驅(qū)動(dòng)在read函數(shù)中進(jìn)行十次A/D采樣并取平均值,這樣ADC的采樣頻率就相當(dāng)于1 000 Hz。由于正常人的心率范圍是60~100次/min,一個(gè)心跳周期的采樣點(diǎn)為60~100點(diǎn),取其上限,所以100個(gè)采樣點(diǎn)至少包含一個(gè)心跳周期。若在此期間沒有檢測(cè)到R波,則可判斷心率存在問題。在計(jì)算閾值時(shí),取4 s內(nèi)的400個(gè)點(diǎn),以100個(gè)點(diǎn)作為一小段,分成4段,根據(jù)二階差分公式(2)計(jì)算出4段的最小值平均值,將這個(gè)值的0.6倍與當(dāng)前閾值進(jìn)行加權(quán)求和即可得到閾值的計(jì)算公式,如式(3)。
y(n)=x(n+2)-2x(n)+x(n-2)(2)
th2=(1-a)×th2′+0.6a×ymin (3)
式中,x(n)表示原始心電數(shù)據(jù)序列;y(n)為對(duì)應(yīng)的二階差分序列;ymin是4段最小值的平均值;th2′是當(dāng)前二階差分閾值;th2為更新后的二階差分閾值;a是加權(quán)系數(shù),滿足a<1。
計(jì)算出閾值后,將這些二階差分?jǐn)?shù)據(jù)每L個(gè)作為一組,當(dāng)連續(xù)的四個(gè)數(shù)據(jù)滿足前兩個(gè)數(shù)據(jù)大于th2,后兩個(gè)數(shù)據(jù)小于th2,則建立一個(gè)以首個(gè)數(shù)據(jù)為區(qū)間起點(diǎn)的長(zhǎng)度為5的檢測(cè)區(qū)間。在檢測(cè)區(qū)間對(duì)應(yīng)的原始心電信號(hào)數(shù)據(jù)中找到最大值,這個(gè)值所對(duì)應(yīng)的位置即為R波的位置。
這種改進(jìn)的檢測(cè)R波差分閾值算法可以避免因?yàn)槟炒味A差分閾值計(jì)算不準(zhǔn)確而導(dǎo)致檢測(cè)結(jié)果錯(cuò)誤。同時(shí),在閾值計(jì)算時(shí)取最近4 s的400個(gè)點(diǎn)來計(jì)算閾值避免了頻繁的閾值更新。心率計(jì)算模塊的軟件流程圖如圖4所示。
(3)GUI用戶界面模塊。采用宿主機(jī)/目標(biāo)板交叉模式開發(fā)基于Qt的嵌入式GUI用戶界面[7]。開發(fā)的主要流程是:
?、侔裃t4.8.5移植到宿主機(jī)上,并將波形圖生成插件QWT(Qt Widgets for Technical Applications)移植到Ubuntu上。
?、趯t源碼解壓到目標(biāo)板上,配置“configure”文件,完成Qt的交叉編譯。
③在宿主機(jī)上的Qt里建立一個(gè)名為“ecgdemo”的工程文件,并在該文件中添加一個(gè)名為“mainwindow.cpp”的文件,在這里可以對(duì)顯示界面的字體、調(diào)色板、畫刷、窗口里的字體顏色進(jìn)行設(shè)置[8]。
?、芡ㄟ^panel的構(gòu)造函數(shù)對(duì)一些面板內(nèi)部部件進(jìn)行初始化,增加Value、Plot、Canvas、Curve和Tools 5個(gè)標(biāo)簽,定義信號(hào)與槽的連接,實(shí)現(xiàn)panel與plot的交互,即實(shí)現(xiàn)了面板和繪圖組件的交互。
3 測(cè)試結(jié)果
將心電導(dǎo)聯(lián)線黏貼在人體左手、右手和左腿的電極上,通過電極采集的心電信號(hào)由導(dǎo)聯(lián)線傳送到預(yù)處理模塊,再經(jīng)過ARM系統(tǒng)板處理,最后在LCD上顯示。使用系統(tǒng)測(cè)試一個(gè)正常人的實(shí)時(shí)心電信號(hào)及實(shí)時(shí)心率如圖5和圖6所示。
經(jīng)測(cè)試,獲取的心電信號(hào)比較穩(wěn)定,噪聲很小,而且能夠?qū)崟r(shí)計(jì)算出心率,基本實(shí)現(xiàn)了設(shè)計(jì)要求。
參考文獻(xiàn)
[1] 張嘯飛,胡大一,丁榮晶,等.中國心腦血管疾病死亡現(xiàn)況及流行趨勢(shì)[J].中國心血管病雜志,2012,40(3):179-187.
[2] 李?yuàn)W偉,尚煥亮,夏雪珩.基于AD620的簡(jiǎn)易心電圖儀的設(shè)計(jì)[J].電子設(shè)計(jì)技術(shù),2013(10):32-33.
[3] WINTER B B, WEBSTER J G. Driven-right-leg circuit design[J]. IEEE Transactions on Biomedical Engineering, 1983, 30(1):62-66.
[4] 李亞峰,歐文盛.ARM嵌入式Linux系統(tǒng)開發(fā)從入門到精通[M].北京,清華大學(xué)出版社,2007.
[5] 王小寧,王振臣,張少兵.Linux操作系統(tǒng)在ARM9處理器上的移植[J].化工自動(dòng)化及儀表,2010,37(2):67-69.
[6] 陳鐵軍,魏超,賈東明.基于ARM9的心電監(jiān)護(hù)系統(tǒng)[J].中國組織工程研究與臨床康復(fù),2011,15(17):3156-3159.
[7] 游燕珍,趙國鋒,徐川.基于Qt/E的嵌入式GUI的研究及其移植[J].微計(jì)算機(jī)信息,2008(5):61-63.
[8] Liu Ting, DASIEWICZ P. Incorporating a contract-based test facility to the GUI framework[C]. IEEE Canadian Conference, Canadian, 2004,1(5),405-408.