楊增寶 , 楊 浩
(1.重慶大學 重慶 400044;2.長江師范學院 重慶 408100)
心電、腦電、胃電等生物電信號通常都集中在頻率低段,對采樣電路和波形顯示設備的要求都不太高。但為了能對象肌電一類相對較高頻率的生物電信號進行更高質(zhì)量的采樣和精確分析,就要求有更高速率的數(shù)據(jù)采集設備。常規(guī)數(shù)據(jù)采集卡都采用PCI接口,安裝和攜帶都非常麻煩,給人們的研究工作帶來了極大的不便。因此,設計一款基于USB接口的高速率數(shù)據(jù)采集卡,對分析更復雜的生物電信號有著十分重要的作用,也會給研究工作帶來更大的方便。
圖1 硬件結構圖Fig.1 Block diagram of hardware
控制軟件針對的是該款自行設計的,以Cypress公司生產(chǎn)的CY7C68013A為核心的USB數(shù)據(jù)采集卡,該卡充分利用了USB2.0的高帶寬數(shù)據(jù)傳輸優(yōu)勢,在采樣精度為12 Bit的條件下,還能達到單通道最高6 Ms/s的數(shù)據(jù)采樣速率。采集卡的硬件設計如圖1所示。
圖中,隔離電路采用軌至軌、低噪聲運放LT1677連接成跟隨器實現(xiàn),有較高的通頻帶;A/D轉換器采用了ADI公司的AD9220,其轉換精度為12 Bit,最高采樣速率可達10 Ms/s;USB接口電路由Cypress公司的CY7C68013A構成,它率先支持USB2.0傳輸標準,內(nèi)建一個可工作在48 MHz時鐘的增強型8051內(nèi)核[1],利用它可以方便地通過上位機對其工作狀態(tài)進行設定,而且它內(nèi)部還自帶4 kB FIFO,每個端點都可獨立使用其中的1 k。
該設計方案的最大特點是做到了硬件結構的最簡化,因而成本最低、工作穩(wěn)定度也最高。設計中最主要的創(chuàng)新點是去掉了通常由FPGA或CPLD來執(zhí)行的外部控制邏輯,讓A/D轉換器的時鐘信號CLK直接由CY7C68013的GPIF輸出信號CTL來提供,在簡化了外圍控制邏輯的同時,又保證了較高的采樣速率(因為GPIF的驅動時鐘為12 MHz),同時還很好地解決了時鐘同步問題。
GDIPlus(Graphics Device Interface Plus)是 Windows系列操作系統(tǒng)用來執(zhí)行繪畫及其他相關圖形操作的一套子系統(tǒng)[2],它是一組通過C++類實現(xiàn)的應用程序編程接口,它不僅在GDI的基礎上添加了許多新特性,而且對原有的GDI功能進行了各種優(yōu)化。在它的基礎上,采用GDIPlus雙緩存技術[3]繪圖,不僅可以非常容易地編寫出與設備無關的應用程序,而且可以實現(xiàn)更好的繪圖效果。
由于硬件平臺數(shù)據(jù)采樣率比較高,這就要求上位機的波形顯示程序要有盡可能高的效率才能達到理想的動態(tài)波形顯示效果,因此我們將GDIPlus雙緩存技術引入到此硬件平臺的控制軟件開發(fā)當中。
由于GDIPlus提供了更豐富的繪圖方法,因而生成平滑度效果十分良好的圖形線條,同時還能跟早期GDI編程一樣對所繪圖形的屬性進行控制,該方法具有更高的實用價值。
控制軟件在繪制波形前,首先要從USB端口獲取AD采集的原始數(shù)據(jù),這一過程需要通過訪問驅動程序來實現(xiàn)。
控制軟件首先通過bOpenDriver()方法與驅動程序建立連接,并打開USB設備,函數(shù)原型如下:
BOOL bOpenDriver (HANDLE *phDeviceHandle,PCHAR devname)
{
char completeDeviceName[64]="";
char pcMsg[64]="";
strcat(completeDeviceName,"\\.\");
strcat(completeDeviceName,devname);
*phDeviceHandle=CreateFile(completeDeviceName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(*phDeviceHandle==INVALID_HANDLE_VALUE)
{
return (FALSE);
}
else
{
return (TRUE);
}
}
然后應用程序通過DeviceIoControl()方法[4]從CY7C68013A的EP6端點獲取AD轉換器采集到的數(shù)據(jù)結果,得到的數(shù)據(jù)在指針inBuffer中,其函數(shù)原型如下:
inBulkControl.pipeNum=1;//選擇EP6為輸入端口DeviceIoControl(usbInHandle, //指定 USB 設備句柄
IOCTL_EZUSB_BULK_READ,//指定傳輸類型為Bulk IN
(PVOID)&inBulkControl, //傳輸控制緩沖區(qū)指針
sizeof (BULK_TRANSFER_CONTROL), //傳輸控制緩沖區(qū)大小
inBuffer,//數(shù)據(jù)輸入緩沖區(qū)指針
TransferSize,//數(shù)據(jù)傳輸量大小
&nBytes,//實際返回的字節(jié)數(shù)
NULL);
如果采集到的數(shù)據(jù)還需進行數(shù)字濾波[5]或其它算法的加工,可直接對inBuffer中的數(shù)據(jù)進行相應處理。處理完后的結果便可用于波形顯示。
由于AD采集的每一個數(shù)據(jù)都對應波形上的一個點,所以波形顯示的主要目的就是把這些離散的點連成線條。因此,控制軟件會非常頻繁地調(diào)用DrawLine()函數(shù)。如果DrawLine()函數(shù)直接把圖形繪制到繪圖窗口,其繪圖效率會嚴重下降。最為嚴重的問題還在于每一幀圖形繪制完畢后的擦除操作會導致整個繪圖窗口的閃爍。為有效解決這兩個問題,設計引入了雙緩存的繪圖方法。
實現(xiàn)雙緩存技術的基本思想是:創(chuàng)建一個跟顯示窗口等大的內(nèi)存空間作為虛擬畫布,用來保存臨時繪制的圖像,當一幀完整的圖形全部繪制完畢之后,再一次性將此虛擬畫布的內(nèi)容復制到顯示窗口中,完成最終顯示任務。由于內(nèi)存的訪問速度遠高于實際窗口繪圖,所以繪圖效率成倍地提高。再加上整個繪圖過程和擦除動作都是在虛擬畫布中以后臺的方式完成的,所以前一幀與后一幀之間的擦圖操作被隱藏,閃爍問題得到了有效解決。
虛擬畫布的創(chuàng)建在GDIPlus中需要用Bitmap bmp()方法來實現(xiàn),其調(diào)用參數(shù) rect.Width()和 rect.Height()保障了它與實際窗口面積等大。應用程序原則上可以調(diào)用任何GDIPlus提供的繪圖函數(shù)來在虛擬畫布所對應的緩存區(qū)中繪制圖形映像,但本控制軟件的主要任務是繪制波形圖,所以只調(diào)用了DrawLine()函數(shù)。需要特別指出的是,在GDIPlus庫中,畫點和畫線都只能用DrawLine()函數(shù)來完成[6],兩者實現(xiàn)了統(tǒng)一。
程序最后調(diào)用Graphics.DrawImage()方法,將虛擬畫布中的圖形映像直接拷貝到顯示窗口內(nèi)存,快速完成將虛擬畫布中圖像顯示到實際窗口的任務。整個過程的關鍵代碼如下:
void CGdiDrawDlg::OnWave()
{
CWnd*pWnd=GetDlgItem(IDC_WAVE);
CClientDC dc(pWnd);
Graphics g(dc.m_hDC);
CRect clientrect;
GetClientRect(&clientrect);
CRectrect (clientrect.left,clientrect.top,clientrect.Width(),clientrect.Height());
Bitmap bmp(rect.Width(),rect.Height());//——創(chuàng)建虛擬畫布
Graphics gTmp(&bmp);//——獲取虛擬畫布的
Graphics引用
SolidBrush br(Color(255,0,0,0)); //定義背景畫刷
gTmp.FillRectangle (&br,0,0,rect.Width (),rect.Height()); //定義填充背景
Pen pen(Color(255,255,50,50),1);//定義畫筆及其屬性pen.SetWidth(1); //設置畫筆線寬
gTmp.SetSmoothingMode (SmoothingModeHighQuality);//反鋸齒平滑顯示
for(i=0;i< sizeof(inBuffer);i++)
{
gTmp.DrawLine(&pen,i,inBuffer[i],i+1,inBuffer[i+1]);
//根據(jù)inBuffer里面的數(shù)據(jù)在虛擬畫布上繪圖
}
g.DrawImage (&bmp,0,0); //將虛擬畫布中的圖形映像繪制到實際窗口
}
圖2是該卡在6 Ms/s采樣率下對22 kHz正弦波的采樣結果,對于如此高速率的數(shù)據(jù)流,任何軟件都無法完成對所有采樣點的同步實時顯示,所以本軟件目前也只能完成對該信號數(shù)據(jù)的分段抽樣顯示,抽樣率為20幀/秒,所以對于軟件的繪圖效率部分還有待進一步研究和提高。綜上所述,GDIPlus雙緩存技術是Windows平臺支持的高效圖形顯示方案,通過該技術在本設計中的應用表明,它實現(xiàn)了高效、平滑的波形顯示效果,使得動態(tài)波形快速顯示的閃爍問題得以有效解決,能滿足工程設計要求。
圖2 控制軟件運行圖Fig.2 Running diagram of control software
[1]錢峰.EZ-USB FX2單片機原理編程及應用[M].北京:北京航空航天大學出版社,2006.
[2]Chand M.GDI+圖形程序設計[M].韓江,等譯.北京:電子工業(yè)出版社,2005.
[3]Kruglinski D J, Wingo S.Visual C++6.0技術內(nèi)幕[M].北京:北京希望電子出版社,1999.
[4]CypressSemiconductor.CypressCyAPIprogrammer’s reference[EB/OL].(2003)[2010-03-20].http://www.mikrocontroller.net/attachment/34631/CyAPI.pdf.
[5]陳輝,李遠.基于USB2.0的數(shù)據(jù)采集卡[J].自動化技術與應用,2008,27(6):91-93 CHEN Hui,LI Yuan.A data acquisition card based on USB2.0[J].Techniques of Automation and Applications,2008,27(6):91-93
[6]張國輝,胡聞達,李慧智.基于GDI+的緩沖區(qū)建立及邊界描述方法[J].測繪科學技術學報,2010,27(3):229-232 ZHANG Guo-hui, HU Wen-da, LI Hui-zhi.A way to establish buffer area and describe boundary based on GDI+[J].Journal of Geomatics Science and Technology,2010,27(3):229-232.