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