王夢(mèng),葛斌,朱政康,師巖琳
(上海理工大學(xué)醫(yī)療器械與食品學(xué)院,上海 200093)
肌電信號(hào)(electromyographic signal, EMG)是產(chǎn)生肌肉力的電信號(hào)根源,是肌肉中許多運(yùn)動(dòng)單元?jiǎng)幼麟娢辉跁r(shí)間和空間上的疊加,反映了神經(jīng)、肌肉的功能狀態(tài),在基礎(chǔ)醫(yī)學(xué)研究、臨床診斷和康復(fù)工程中有廣泛的應(yīng)用[1]。它在人機(jī)工效學(xué)領(lǐng)域肌肉工作的工效學(xué)分析,康復(fù)醫(yī)學(xué)領(lǐng)域的肌肉功能評(píng)價(jià)以及體育科學(xué)中的疲勞判定、運(yùn)動(dòng)技術(shù)合理性分析、肌纖維類型和在無氧閾值的無損傷性預(yù)測(cè)等方面均有重要實(shí)用價(jià)值[2-4]。
早期肌電信號(hào)的研究主要集中在對(duì)少數(shù)獨(dú)立通道進(jìn)行時(shí)域和頻域的研究[3]。近年來隨著對(duì)人體神經(jīng)肌肉系統(tǒng)的認(rèn)識(shí)進(jìn)步和研究的深入,對(duì)肌電信號(hào)的研究朝多通道、陣列式方向發(fā)展。目前通用的單路肌電信號(hào)采集儀已經(jīng)不能滿足醫(yī)療診斷的發(fā)展要求。肌電信號(hào)采集系統(tǒng)的性能瓶頸在于高速采樣數(shù)據(jù)的實(shí)時(shí)存儲(chǔ)和上下位機(jī)間的數(shù)據(jù)傳輸能力[4]。多通道的肌電信號(hào)要求更高的ADC的采樣吞吐,目前一般采用的微控制器以指令方式控制其執(zhí)行時(shí)序,但微控制器的速度優(yōu)先,而且一般需要3~4條指令完成一次數(shù)據(jù)采樣工作,制約了ADC的采樣吞吐[5]。而FPGA具有較高的運(yùn)行主頻,用于控制底層期間的執(zhí)行時(shí)序,具備良好的接口能力,能最大限度地保證ADC的采樣率[6]。為減少上位機(jī)數(shù)據(jù)存儲(chǔ)處理的時(shí)間消耗,提高整體系統(tǒng)的實(shí)時(shí)性,本研究采用一種獨(dú)立于CPU的后臺(tái)批量數(shù)據(jù)傳輸技術(shù)(DMA),實(shí)現(xiàn)底層數(shù)據(jù)采集單元與上位機(jī)之間的數(shù)據(jù)交互,解決了多路信號(hào)大量采集并實(shí)時(shí)傳輸?shù)膯栴}。
系統(tǒng)以Samsung 公司的S3C2440A 微處理器為核心,包含了多路A/D轉(zhuǎn)換、現(xiàn)場(chǎng)可編程門陣列FPGA、電源電路及其他接口電路等,系統(tǒng)結(jié)構(gòu)見圖1。本研究中FPGA模塊選擇了EP4CE10E22C8N芯片,該芯片的可編程邏輯單元為10kLE。ARM選用了目前性能很高的嵌入式處理器S3C2440A,可在400 MHZ高速頻率下工作,提供4個(gè)DMA通道,用于系統(tǒng)總線內(nèi)部或與外圍總線直接的數(shù)據(jù)交換,實(shí)現(xiàn)了核心板和數(shù)據(jù)采集部分等硬件電路設(shè)計(jì)及整個(gè)模塊功能測(cè)試。
輸入的肌電信號(hào)經(jīng)過放大電路后,通過A/D轉(zhuǎn)換模塊將模擬肌電信號(hào)轉(zhuǎn)換成16位的數(shù)字信號(hào),F(xiàn)PGA對(duì)數(shù)字信號(hào)進(jìn)行預(yù)處理并存儲(chǔ)到雙口RAM中,F(xiàn)PGA同時(shí)響應(yīng)ARM,處理器以DMA方式將數(shù)據(jù)存儲(chǔ)到RAM中,再通過USB2.0接口依照系統(tǒng)通信協(xié)議接受上位機(jī)的命令進(jìn)行相應(yīng)的數(shù)據(jù)處理及傳輸。本研究的主要工作集中在ARM與FPGA的實(shí)時(shí)高速數(shù)據(jù)傳輸在肌電信號(hào)采集的應(yīng)用上,下面對(duì)這部分的設(shè)計(jì)與實(shí)現(xiàn)做一詳細(xì)說明。
圖1 多路肌電信號(hào)實(shí)時(shí)傳輸流程圖
S3C2440A芯片開發(fā)采用了由ARM公司研發(fā)的先進(jìn)的ARM920T 核心,ARM920T 實(shí)現(xiàn)了MMU,AMBA 總線和哈佛結(jié)構(gòu)高速緩沖體系結(jié)構(gòu)。這一結(jié)構(gòu)具有獨(dú)立的16KB 指令高速緩存和16KB 數(shù)據(jù)高速緩存。S3C2440A提供8個(gè)Bank,每個(gè)Bank 有128M 字節(jié)。S3C2440A與外部存儲(chǔ)器相連時(shí),必須先給其分配在一個(gè)固定的Bank,本研究將bank1作為FPGA內(nèi)部RAM映射的空間。ACTEL公司的EP4CE10E22C8N芯片提供對(duì)ADC器件的采樣時(shí)序控制,將其作為特殊的內(nèi)存設(shè)備掛接到ARM的內(nèi)存地址空間。FPGA與ARM之間的接口邏輯關(guān)系見圖2。S3C2440A通過寫信號(hào)線(TXD)向FPGA發(fā)送上位機(jī)命令,F(xiàn)PGA控制A/D采樣并將采集到的數(shù)字信號(hào)緩存在雙口RAM中,RAM中寫滿510個(gè)字節(jié)后,F(xiàn)PGA發(fā)出滿信號(hào)作為中斷F_INT信號(hào),同時(shí)S3C2440A響應(yīng)中斷F_INT,向FPGA發(fā)送片選信號(hào)nGCS1。
圖2FPGA與ARM之間的接口邏輯關(guān)系圖
Fig2InterfacelogicdiagrambetweenFPGAandARM
為提高總線利用率,需設(shè)計(jì)數(shù)據(jù)緩沖來實(shí)現(xiàn)不同速率數(shù)據(jù)傳輸之間的要求。雙口RAM是共享式多端口存儲(chǔ)器,一個(gè)存儲(chǔ)器配備兩套獨(dú)立的地址、數(shù)據(jù)和控制線,允許兩個(gè)獨(dú)立的CPU或控制器同時(shí)異步地訪問存儲(chǔ)單元,大大提高了通信效率。本研究采用FPGA來實(shí)現(xiàn)雙口RAM的功能可以很好的解決并行性和通信速度問題,前段肌電信號(hào)在寫入的同時(shí),ARM可以進(jìn)行數(shù)據(jù)的讀取。雙口RAM與ARM總線連接圖見圖3。EP4CE10的數(shù)據(jù)總線寬度為16位,S3C2440A的數(shù)據(jù)總線寬度為32位,因此將雙口RAM的地址線addr[8..0]與ARM的地址線的低九位相連,雙口RAM的數(shù)據(jù)總線與ARM 的數(shù)據(jù)總線相連。FPGA讀取信號(hào)convst高電平有效,雙口RAM的數(shù)據(jù)輸出q經(jīng)過一個(gè)十六位的三態(tài)緩沖器輸出。
圖3 雙口RAM與ARM總線連接圖
Fig3DualportRAMwithARMbusconnectiondiagram
在以S3C2440A芯片為主控的肌電信號(hào)采集系統(tǒng)中,S3C2440A除了要與上位機(jī)進(jìn)行數(shù)據(jù)傳輸外,還要接受上位機(jī)指令進(jìn)一步對(duì)數(shù)據(jù)進(jìn)行處理。由于采樣指令數(shù)據(jù)人為發(fā)送,不具有規(guī)律性,為了充分利用CPU,提高數(shù)據(jù)傳輸速度,本系統(tǒng)在使用DMA方式進(jìn)行肌電數(shù)據(jù)傳輸?shù)耐瑫r(shí),使用USB完成與上位機(jī)的數(shù)據(jù)交換(主要是上位機(jī)發(fā)送給S3C2440A的采樣指令,見表1)。USB通信的軟件設(shè)計(jì)主要是通訊數(shù)據(jù)格式、波特率等的設(shè)置,采用中斷模式, 使能FIFO 緩沖區(qū)(使用16 字節(jié)的接收緩沖區(qū))。
表1 采樣指令
設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和硬件之間的接口,DMA驅(qū)動(dòng)程序設(shè)計(jì)是控制FPGA與ARM與上位機(jī)的數(shù)據(jù)交換,是一個(gè)典型的字符設(shè)備驅(qū)動(dòng)程序。DMA驅(qū)動(dòng)程序初始化主要設(shè)置相關(guān)寄存器,在初始化時(shí)要正確設(shè)置目標(biāo)(緩沖區(qū)的)首地址、數(shù)據(jù)傳輸?shù)姆较?、源寄存器的首地址、地址指針是否遞增以及遞增方向等等。相關(guān)代碼以及注釋如下:
#define BUF_SIZE (510) //定義緩存FIFO大小
#define XDREQ0_RD_SRC_ADDR 0x08000000//定義讀取FPGA中數(shù)據(jù)的緩沖區(qū)地址
系統(tǒng)加載后,驅(qū)動(dòng)程序進(jìn)行初始化,完成相關(guān)寄存器及存儲(chǔ)空間的映射。當(dāng)FPGA采集并存儲(chǔ)在RAM中的肌電數(shù)據(jù)達(dá)到一定數(shù)量時(shí),為了避免緩存溢出,ARM要從FPGA模塊中的緩沖區(qū)中讀取數(shù)字化的肌電數(shù)據(jù)。本系統(tǒng)中申請(qǐng)IRQ_DMA0中斷服務(wù)程序,用來響應(yīng)FPGA模塊的DMA中斷請(qǐng)求。應(yīng)用程序響應(yīng)中斷請(qǐng)求,啟動(dòng)DMA,發(fā)出讀命令將目的地址中的數(shù)據(jù)取走后,一次讀取操作結(jié)束,進(jìn)行下一次讀取并重復(fù)上述過程。部分代碼如下:
staticstructfile_operationsdev_fops = {
.owner = THIS_MODULE,
.open = s3c2410_ad_open,
.release = s3c2410_ad_close,
.read = s3c2410_ad_read,
};
if (request_irq(IRQ_DMA0, s3c_dma0_irq, 0, "DMA0_FPGA", NULL))//申請(qǐng)中斷函數(shù)
{
printk("can't request_irq for DMA0 ");
return -EBUSY;
}
/* 分配SRC, DST對(duì)應(yīng)的緩沖區(qū)*/
dst0 = dma_alloc_writecombine(NULL, sizeof(unsigned short int)*BUF_SIZE, &dst0_phys, GFP_KERNEL);//目的
if (NULL == dst0)
{
free_irq(IRQ_DMA0, NULL);
dma_free_writecombine(NULL, sizeof(unsigned short int)*BUF_SIZE, dst0, dst0_phys);
printk("can't alloc buffer for dst0 ");
return -ENOMEM;
}
dma0_regs = ioremap(DMA0_BASE_ADDR, sizeof(struct s3c_dma_regs));//將DMA控制寄存器映射到內(nèi)核空間
dma0_regs->disrc= XDREQ0_RD_SRC_ADDR ;//源的物理地址
dma0_regs->disrcc = (0<<1) | (0<<0); //源位于AHB總線, 源地址遞增 (1<<0)
dma0_regs->didst = dst0_phys; //目的的物理地址
dma0_regs->didstc = (0<<2) | (0<<1) | (0<<0); //目的位于AHB總線, 目的地址遞增
dma0_regs->dcon=(1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(0<<22)|(0<<21)|(1<<20)|(BUF_SIZE<<0); //使能中斷,單個(gè)傳輸,軟件觸發(fā)
dma0_regs->dmasktrig = (1<<1) | (1<<0);//啟動(dòng)DMA
為了驗(yàn)證本研究介紹的多路肌電信號(hào)實(shí)時(shí)傳輸系統(tǒng)的性能,建立了圖4所示的實(shí)驗(yàn)平臺(tái)。本研究設(shè)計(jì)為6路的肌電信號(hào)處理與采集系統(tǒng),將三組雙路肌電傳感器與AD7976前端的6通道相連,多路數(shù)據(jù)采集卡通過USB與上位機(jī)連接。
圖4 實(shí)驗(yàn)平臺(tái)
本研究中,動(dòng)作設(shè)計(jì)為雙側(cè)上肢彎舉運(yùn)動(dòng)和雙側(cè)下肢的抬腿運(yùn)動(dòng)。具體動(dòng)作順序和內(nèi)容如下:(1)彎舉運(yùn)動(dòng),要求受試者兩臂平放于桌面,當(dāng)聽到指令后保持4 s不動(dòng),4 s后發(fā)力以肘關(guān)節(jié)為原點(diǎn)抬起雙側(cè)上臂,至上臂垂直于桌面為止;(2)抬腿運(yùn)動(dòng),要求受試者正坐于椅面,當(dāng)聽到指令后保持4 s不動(dòng),4 s后發(fā)力以膝關(guān)節(jié)為原點(diǎn)平抬雙側(cè)前腿,至前腿平行于桌面為止。
肌電采集點(diǎn)為受試者兩側(cè)上肢的肱二頭肌與肱橈肌和兩側(cè)下肢的腓腸肌。采集前使用75%的酒精和一次性電極片自帶細(xì)砂紙進(jìn)行預(yù)置電極部位皮膚的去屑去脂肪,再將一次性銀/氯化銀電極雙極放在每一待測(cè)肌肉部位的隆起處并與肌纖維走向一致,在緊鄰雙極部位安放一同規(guī)格的參考電極。[9]
實(shí)驗(yàn)前實(shí)驗(yàn)人員先給受試者示范和講解要完成的動(dòng)作,并要求受試者練習(xí)若干次直到所做動(dòng)作具有再現(xiàn)性,然后受試者聽實(shí)驗(yàn)人員口令去執(zhí)行本實(shí)驗(yàn)設(shè)計(jì)的動(dòng)作。
以本系統(tǒng)的采樣定時(shí)倍率1,最高采樣率120 kHz為例,設(shè)置采樣時(shí)間為8 s。開始試驗(yàn)后8 s,從上位機(jī)得到的六路肌電信號(hào)圖,見圖5。其中通道1、通道3的采集點(diǎn)分別為上肢左、右側(cè)肱二頭??;通道2、通道4的采集點(diǎn)分別為上肢左、右側(cè)肱橈??;通道5、通道6的采集點(diǎn)分別為下肢左、右側(cè)腓腸肌。
圖5六通道肌電信號(hào)圖
Fig5Sixchannelselectromyographicsignal
實(shí)驗(yàn)過程中使用Agilent Technologies示波器觀察FPGA發(fā)出的中斷F_INT信號(hào)和ARM響應(yīng)的DMA片選地址信號(hào)。FPGA控制AD采樣頻率為120 kHz,6個(gè)通道同時(shí)采樣,F(xiàn)PGA設(shè)置每采滿510個(gè)點(diǎn)就發(fā)出一次中斷F_INT信號(hào),周期t1=510×6*(1/120kHz)≈708 us。見圖6,F(xiàn)PGA采集數(shù)字信號(hào)周期t1時(shí)間內(nèi),ARM完成數(shù)據(jù)的讀取后仍剩余足夠的空閑時(shí)間t2,可用于ARM對(duì)采集的肌電數(shù)據(jù)進(jìn)行算法處理或用于對(duì)更多通道肌電信號(hào)的采集。
采用SignalTap工具獲取的肌電信號(hào)數(shù)據(jù)存儲(chǔ)時(shí)序,見圖7。Convst為AD采樣時(shí)鐘,頻率為120 kHz;busy為FPGA忙信號(hào);cs為ADC采樣的片選信號(hào);rd為FPGA的讀時(shí)鐘信號(hào);rdaddr為FPGA的讀地址信號(hào),即DMA響應(yīng)中斷請(qǐng)求后發(fā)出的片選地址信號(hào);wrfull為滿信號(hào),即DMA中斷請(qǐng)求F_INT信號(hào);rdclock為ARM給FPGA 的讀時(shí)鐘信號(hào)。由測(cè)試結(jié)果可知,該系統(tǒng)操作完全符合AD采樣時(shí)序和DMA操作時(shí)序要求,系統(tǒng)能正常工作。
圖6中斷信號(hào)和片選信號(hào)
Fig6Interruptsignalandselectsignal
圖7 肌電信號(hào)數(shù)據(jù)存儲(chǔ)時(shí)序
針對(duì)多路肌電信號(hào)的采集和處理,本研究提出的基于嵌入式的多路肌電信號(hào)實(shí)時(shí)傳輸系統(tǒng)設(shè)計(jì)方案在采集肌電信息的同時(shí),能進(jìn)一步對(duì)肌電信息進(jìn)行算法處理,大大提升了整個(gè)系統(tǒng)的數(shù)據(jù)處理能力和控制功能。采樣時(shí)序由FPGA控制提供,確保了ADC器件的采樣吞吐,保證了肌電信號(hào)的多路采集;主控器件ARM采用DMA方式與上位機(jī)進(jìn)行數(shù)據(jù)交換,保證了ARM有足夠時(shí)間空余對(duì)采集的肌電數(shù)據(jù)進(jìn)行前期處理,減少了上位機(jī)的工作量,并最大限度地保證了采樣數(shù)據(jù)的實(shí)時(shí)性。本研究對(duì)多通道肌電圖機(jī)/誘發(fā)電位儀的開發(fā)有著重要意義。