賈玉姣,劉亞斌,張秀磊
(北京航空航天大學(xué)自動(dòng)化科學(xué)與電氣工程學(xué)院,北京100191)
基于高速多通道采集模塊的數(shù)字化儀軟件設(shè)計(jì)
賈玉姣,劉亞斌,張秀磊
(北京航空航天大學(xué)自動(dòng)化科學(xué)與電氣工程學(xué)院,北京100191)
基于高速數(shù)字化儀硬件設(shè)備,針對數(shù)字采集系統(tǒng)軟件設(shè)計(jì)的關(guān)鍵技術(shù)從設(shè)備驅(qū)動(dòng)程序、動(dòng)態(tài)鏈接庫接口函數(shù)封裝、應(yīng)用軟件設(shè)計(jì)三個(gè)層次進(jìn)行了詳細(xì)闡述。采用VS2008,在Win7系統(tǒng)下設(shè)計(jì)了WDF驅(qū)動(dòng)程序并實(shí)現(xiàn)了DMA傳輸;設(shè)計(jì)封裝了操作設(shè)備的接口函數(shù);用C#語言及多線程技術(shù)設(shè)計(jì)實(shí)現(xiàn)了多通道數(shù)據(jù)高速傳輸、實(shí)時(shí)顯示及存儲(chǔ)系統(tǒng),實(shí)驗(yàn)測試結(jié)果穩(wěn)定可靠。
數(shù)字化儀;WDF;DMA;高速
數(shù)字化儀(Digitizer)是電子測量領(lǐng)域中一種基于PC的常用測量儀器,和示波器相似的是,它也是一種用來觀察、測量、記錄各種瞬時(shí)物理現(xiàn)象,以波形方式顯示其與時(shí)間關(guān)系的電子儀器,它開放式的結(jié)構(gòu)和靈活的軟件等特性已經(jīng)超越了一般示波器[1]?;赑C的數(shù)字化儀主要優(yōu)勢在于它的靈活性,它可以工作在開放式的PC環(huán)境中,一個(gè)PC主機(jī)可以安裝任何其他數(shù)字化儀的顯示陣列、工具卡和控制軟件等。系統(tǒng)就可以按照用戶的需要進(jìn)行配置。
本文所研究的高速多通道數(shù)據(jù)采集系統(tǒng),是基于PXIExpress總線的模塊化信號采集設(shè)備,具有4個(gè)獨(dú)立通道、高采樣分辨率、大數(shù)據(jù)容量以及高速數(shù)據(jù)傳輸?shù)汝P(guān)鍵技術(shù)的數(shù)字化儀軟件系統(tǒng)。包括完整的從底層驅(qū)動(dòng)、接口動(dòng)態(tài)鏈接庫到應(yīng)用分析處理軟件。
高速數(shù)字化儀有如下硬件指標(biāo):輸入阻抗50 Ω和1 MΩ可選;4個(gè)并行AD采集通道,14位采樣精度,最高采樣速率125 MS/s;輸入信號量程±1 V和±10 V可選;每個(gè)通道最大采樣深度4M字,最大預(yù)采樣深度8K字。為實(shí)現(xiàn)以上技術(shù)指標(biāo),數(shù)字化儀包含如下模塊:模擬信號調(diào)理模塊,實(shí)現(xiàn)單端轉(zhuǎn)差分,阻抗匹配,量程選擇等功能;AD采集轉(zhuǎn)換模塊,將SMA接口接收的模擬信號轉(zhuǎn)換為14位數(shù)字量信號并傳給控制模塊;控制器,采用FPGA作為邏輯算法控制器;板載內(nèi)存,存儲(chǔ)控制器處理過的數(shù)據(jù),計(jì)算機(jī)讀取數(shù)據(jù)的位置;PXIe通信模塊,實(shí)現(xiàn)與上位機(jī)通過PXIe通信;時(shí)鐘管理模塊,為AD采集、板載內(nèi)存提供時(shí)鐘;電源管理模塊,為其他模塊提供高品質(zhì)電源。數(shù)字化儀硬件總體設(shè)計(jì)方案如圖1所示。
圖1 數(shù)字化儀硬件總體設(shè)計(jì)圖
由于微軟已經(jīng)停止對Windows XP系統(tǒng)的維護(hù),故選擇在Win7系統(tǒng)下開發(fā);而從Windows Vista系統(tǒng)開始,驅(qū)動(dòng)程序開發(fā)需要用到微軟新一代驅(qū)動(dòng)程序開發(fā)模型WDF。WDF包括一整套對驅(qū)動(dòng)程序進(jìn)行開發(fā)設(shè)計(jì)、發(fā)布、維護(hù)的部件,WDF支持面向?qū)ο蟮?,基于事件?qū)動(dòng)機(jī)制的驅(qū)動(dòng)程序設(shè)計(jì)思想;WDF實(shí)現(xiàn)了一些驅(qū)動(dòng)程序所必須的基本特性,為驅(qū)動(dòng)程序提供缺省的處理,并管理與操作系統(tǒng)的交互,這使設(shè)計(jì)者能夠集中精力在特定硬件設(shè)備的處理上,而不是操作系統(tǒng)自身,從而大大簡化設(shè)計(jì)[2]。WDF定義了一個(gè)驅(qū)動(dòng)模型,提供了開發(fā)內(nèi)核模式驅(qū)動(dòng)程序(KMDF)和用戶模式驅(qū)動(dòng)程序(UMDF)的框架。一個(gè)即插即用的KMDF設(shè)備驅(qū)動(dòng)程序包括:一個(gè)DriverEntry例程;一個(gè)EvtDriverDeviceAdd例程,類似于WDM的AddDevice例程;一個(gè)或多個(gè)I/O隊(duì)列;一個(gè)或多個(gè)I/O事件回調(diào)例程,類似于WDM的DispatchXxx例程;支持的即插即用和電源管理回調(diào)例程;支持的WMI回調(diào)例程,用于管理計(jì)算機(jī)系統(tǒng);其他回調(diào)例程,如對象的清除例程、中斷處理例程、DMA例程等[3]。
2.1中斷處理
中斷是外設(shè)主動(dòng)申請與計(jì)算機(jī)交互的唯一方式。WDF的中斷處理分為兩部分:中斷處理例程EvtInterruptIsr,延遲過程調(diào)用EvtInterruptDpc。中斷處理例程是在中斷服務(wù)例程被調(diào)用時(shí)通過讀取PEX8311的中斷狀態(tài)寄存器來判斷是否是來自目標(biāo)設(shè)備的中斷;若是,則清除當(dāng)前中斷標(biāo)記并寫相應(yīng)中斷屏蔽寄存器位,暫時(shí)不再處理新的中斷;然后調(diào)用延遲過程調(diào)用例程,在空閑時(shí)實(shí)現(xiàn)更多更復(fù)雜的操作。因?yàn)橹袛嗵幚砝踢\(yùn)行在DIRQL(Device Interrupt ReQuest Level)中斷級別上,幾乎可以屏蔽所有系統(tǒng)內(nèi)和外部設(shè)備的中斷請求,所以處理時(shí)間應(yīng)該盡可能短,以提高系統(tǒng)的響應(yīng)速度。而中斷延遲處理例程運(yùn)行在DISPATCH_LEVEL級別上,可以在延遲過程調(diào)用例程中做大部分的中斷處理工作。
本例數(shù)字化儀設(shè)備主要分為兩類中斷:本地中斷和DMA傳輸完成中斷。本地中斷包括AD轉(zhuǎn)換完成中斷、FIFO中斷、數(shù)據(jù)轉(zhuǎn)移完成中斷,共4個(gè)通道,12個(gè)中斷。中斷處理流程如圖2所示。
圖2 數(shù)字化儀中斷處理流程圖
2.2DMA數(shù)據(jù)傳輸實(shí)現(xiàn)
利用中斷和DMA相結(jié)合的方式采集數(shù)據(jù),可以最大限度地提高CPU的工作效率,并且能夠及時(shí)保存采集的數(shù)據(jù),減少丟幀現(xiàn)象和誤碼率[4]。DMA傳輸方式無需CPU直接控制傳輸,通過硬件為RAM與I/O設(shè)備開辟一條直接傳送數(shù)據(jù)的通路,使CPU的效率大為提高。由于數(shù)字化儀需要實(shí)現(xiàn)高速大數(shù)據(jù)量傳輸,故采取DMA(Direct Memory Access)傳輸,在DMA傳輸過程中CPU可以進(jìn)行其他工作。一個(gè)完整的DMA傳輸過程包括4個(gè)步驟:DMA請求、DMA響應(yīng)、DMA傳輸、DMA結(jié)束。在數(shù)字化儀設(shè)備的WDF驅(qū)動(dòng)程序中,DMA傳輸實(shí)現(xiàn)流程如下:
1)在驅(qū)動(dòng)程序初始化過程中,即Digitizer_EvtDeviceAdd例程中,創(chuàng)建一個(gè)DMA適配器對象WDFDMAENABLER,一個(gè)DMA傳輸對象WDFDMATRANSACTION,和一個(gè)公用緩沖區(qū)對象WDFCOMMONBUFFER,三者結(jié)合控制DMA傳輸過程;
2)當(dāng)應(yīng)用程序向驅(qū)動(dòng)發(fā)起讀數(shù)請求,驅(qū)動(dòng)接收到I/O Request時(shí),使用WDFCOMMONBUFFER公用緩存區(qū)作為DMA讀緩沖區(qū),初始化DmaTransaction對象,啟動(dòng)DMA傳輸;
3)驅(qū)動(dòng)程序調(diào)用WdfDmaTransactionExecute啟動(dòng)DMA傳輸時(shí),系統(tǒng)框架會(huì)調(diào)用啟動(dòng)傳輸前注冊的回調(diào)例程Digitizer_EvtProgramDma進(jìn)行寄存器配置,以正確啟動(dòng)DMA操作;由于數(shù)字化儀Local端總線位寬為32位,需要設(shè)置DMA傳輸位寬為32位;一次可以傳輸4個(gè)字節(jié)數(shù)據(jù),提高數(shù)據(jù)傳輸速率;
4)當(dāng)DMA傳輸完成時(shí)會(huì)通過中斷通知驅(qū)動(dòng)程序,驅(qū)動(dòng)程序在中斷延遲處理例程EvtInterruptDpc中完成最終DMA傳輸,同時(shí)將公用緩存區(qū)中的數(shù)據(jù)拷貝到I/O Request包中。
在驅(qū)動(dòng)程序的設(shè)計(jì)過程中,必須考慮到應(yīng)用程序接口的設(shè)計(jì),良好的驅(qū)動(dòng)程序設(shè)計(jì)必須從應(yīng)用程序設(shè)計(jì)出發(fā)[5]。為方便上層應(yīng)用程序使用,對驅(qū)動(dòng)的操作和通信部分封裝成動(dòng)態(tài)庫DLL。它是驅(qū)動(dòng)層和應(yīng)用程序?qū)舆M(jìn)行通信的橋梁,同時(shí)為應(yīng)用程序?qū)犹峁┝朔奖阏{(diào)用的應(yīng)用接口函數(shù)。
3.1動(dòng)態(tài)鏈接庫接口函數(shù)
數(shù)字化儀各項(xiàng)功能是通過應(yīng)用程序調(diào)用DLL的導(dǎo)出函數(shù)來實(shí)現(xiàn)的,DLL接口函數(shù)封裝了與硬件設(shè)備交互的具體細(xì)節(jié),只提供統(tǒng)一的接口給應(yīng)用程序調(diào)用。動(dòng)態(tài)鏈接庫中接口函數(shù)主要分三類,如表1所示:
1)設(shè)備打開關(guān)閉函數(shù):Digitizer_OpenDevice根據(jù)指定設(shè)備號打開數(shù)字化儀硬件設(shè)備;Digitizer_CloseDevice關(guān)閉已打開的設(shè)備;
2)功能函數(shù):Digitizer_Reset恢復(fù)數(shù)字化儀設(shè)備默認(rèn)配置狀態(tài);Digitizer_Config根據(jù)指定通道,配置工作參數(shù);Digitizer_SetInterruptLevel根據(jù)指定通道,設(shè)置設(shè)備中斷通知級別,既設(shè)備緩存FIFO中數(shù)據(jù)量達(dá)到設(shè)定值時(shí)產(chǎn)生中斷,通知應(yīng)用程序讀數(shù);Digitizer_StartAD啟動(dòng)AD采集;Digitizer_ StopAD停止AD采集;
3)數(shù)據(jù)接收轉(zhuǎn)換函數(shù):Digitizer_Receive接收指定通道的AD采集數(shù)據(jù);Digiziter_RecvCompleted指定通道數(shù)據(jù)接收是否完畢;DoubleToUshort將double類型數(shù)據(jù)轉(zhuǎn)換成對應(yīng)14位采樣值;UshortToDouble將14位ADC采樣值數(shù)據(jù)轉(zhuǎn)換成實(shí)際信號量值
說明:
1)外部觸發(fā)實(shí)現(xiàn)是通過全局變量控制的,在Digitizer_ StartAD對應(yīng)的驅(qū)動(dòng)函數(shù)中若為內(nèi)部觸發(fā),則正常寫開啟AD寄存器;若為外部觸發(fā),則做好初始化工作(開啟中斷等)后寫外部觸發(fā)使能寄存器,等外部觸發(fā)信號為高電平時(shí)底層自動(dòng)開啟AD轉(zhuǎn)換。
2)預(yù)采樣功能可以實(shí)現(xiàn)在電平觸發(fā)或外部觸發(fā)時(shí)對觸發(fā)點(diǎn)之前的信號進(jìn)行讀取顯示和分析。存儲(chǔ)深度包括預(yù)觸發(fā)深度和觸發(fā)深度兩部分,預(yù)采樣深度表示在觸發(fā)到來前被存儲(chǔ)下來的數(shù)據(jù)量,觸發(fā)深度表示在觸發(fā)到來后被存儲(chǔ)下來的數(shù)據(jù)量[6]。預(yù)采樣FIFO中的數(shù)據(jù)在觸發(fā)之前一直在刷新,時(shí)刻保持最新的數(shù)據(jù)直到觸發(fā)開始。為此需要先讀取正式采樣的數(shù)據(jù),再讀取預(yù)采樣數(shù)據(jù),才能保證預(yù)采樣數(shù)據(jù)是觸發(fā)點(diǎn)之前的數(shù)據(jù)。
3.2高速數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)
由于本文數(shù)字化儀具有4個(gè)獨(dú)立通道,每個(gè)通道采樣率最高達(dá)到125Msps,所以若4個(gè)通道滿速率工作的話,每秒鐘產(chǎn)生的數(shù)據(jù)量為:125M*2Byte*4≈1GB的數(shù)據(jù)。而33MHz的PCI總線的最高速率只有133MBps,PCI Express x1總線的最高傳輸速率也只有476MBps。若4個(gè)通道同時(shí)全速率工作所產(chǎn)生的數(shù)據(jù)量遠(yuǎn)超過系統(tǒng)的處理能力,因此設(shè)計(jì)時(shí),硬件板卡自身每個(gè)通道帶有4M*32的SDRAM緩存,且不能連續(xù)工作過長時(shí)間。
系統(tǒng)接收端,在驅(qū)動(dòng)程序中采用DMA結(jié)合應(yīng)用程序使用的Windows完成端口I/O模型,實(shí)現(xiàn)數(shù)據(jù)盡可能的高速傳輸。下面介紹使用完成端口(IOCP)實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)倪^程。完成端口的建立步驟如下:
1)創(chuàng)建一個(gè)完成端口內(nèi)核對象
調(diào)用系統(tǒng)API函數(shù)CreateIoCompletionPort(),返回一個(gè)IOCP句柄。
hIocp=CreateCreateIoCompletionPort(INVALID_HANDLE, NULL,NULL,0);
2)將設(shè)備句柄與I/O完成端口關(guān)聯(lián)
可與完成端口關(guān)聯(lián)的內(nèi)核對象除了設(shè)備對象外,還可以是Win32文件對象,網(wǎng)絡(luò)套接字等。將已經(jīng)打開的設(shè)備句柄與IOCP內(nèi)核對象關(guān)聯(lián)起來,綁定時(shí)仍然使用CreateIo CompletionPort,只是參數(shù)不同:
CreateIoCompletionPort(hDevice,hIocp,CK_RECV,0);
3)創(chuàng)建工作者線程
前兩步相當(dāng)于只是建立了消息隊(duì)列等結(jié)構(gòu),對句柄進(jìn)行了關(guān)聯(lián),具體I/O讀寫操作還是要靠工作線程來完成,這里可以建立數(shù)量是CPU核心數(shù)兩倍的工作線程。
CreateThread(NULL,0,WorkerThread,thParam,CREATE_SUSPENDED,NULL);
在工作者線程中對消息隊(duì)列進(jìn)行輪詢,如果有已經(jīng)完成的I/O請求,系統(tǒng)會(huì)將該I/O加入完成端口維護(hù)的消息隊(duì)列,然后調(diào)度一個(gè)空閑工作線程對消息報(bào)進(jìn)行處理。工作線程調(diào)用GetQueuedCompletionStatus()函數(shù)來輪詢消息隊(duì)列的狀態(tài)或者進(jìn)入睡眠狀態(tài)。
完成端口的初始化代碼實(shí)現(xiàn)如下:
工作者線程完成具體的數(shù)據(jù)傳輸任務(wù),調(diào)用系統(tǒng)函數(shù)ReadFile()向驅(qū)動(dòng)程序發(fā)起DMA讀數(shù)任務(wù),在讀數(shù)I/O請求完成后將讀取的數(shù)據(jù)寫入DLL內(nèi)部各通道的緩沖區(qū)當(dāng)中。
在應(yīng)用軟件設(shè)計(jì)中,采用Windows下的Visual studio 2008開發(fā)平臺(tái),基于.Net框架下的WinForm窗體應(yīng)用程序,整體用戶界面如圖3所示。界面控件選用NI MeasureStudio 8.6工具軟件包。
圖3 數(shù)字化儀軟件用戶界面
數(shù)字化儀應(yīng)用軟件采用三層架構(gòu)設(shè)計(jì),即表現(xiàn)層,業(yè)務(wù)邏輯層,數(shù)據(jù)訪問層。在每一層中都有對應(yīng)的組件,完成對應(yīng)的功能模塊,同時(shí)系統(tǒng)還提供一些通用的組件來提供一些通用服務(wù)。
1)表現(xiàn)層:實(shí)現(xiàn)用戶與系統(tǒng)的交互,提供一組控制接口給用戶選擇,并接收用戶的輸入。同時(shí),將采集的數(shù)據(jù)信號以波形的形式呈現(xiàn)給用戶。
2)業(yè)務(wù)邏輯層:處理所有業(yè)務(wù)邏輯,對用戶的輸入進(jìn)行處理。主要工作包括:定義、初始化全局變量;設(shè)定數(shù)字化儀的工作模式;對采集的數(shù)據(jù)信息進(jìn)行分析提取有用信息等。調(diào)用數(shù)據(jù)訪問層接口,并為表現(xiàn)層提供服務(wù)。
3)數(shù)據(jù)訪問層:該層是對業(yè)務(wù)邏輯層的擴(kuò)展,實(shí)現(xiàn)對數(shù)據(jù)的操作。從數(shù)字化儀獲取數(shù)據(jù)反饋給業(yè)務(wù)邏輯層處理;將需要保存的數(shù)據(jù)按照指定格式持久化到本地磁盤文件中。
數(shù)字化儀模塊實(shí)現(xiàn)了4路獨(dú)立的AD采集通道,復(fù)雜的前端調(diào)理電路及高頻噪聲,造成每個(gè)通道都有采集誤差,降低了采樣精度。為了保證通道的采樣精度,模塊增加了誤差補(bǔ)償功能,消除了一些固定誤差的影響。誤差主要分為偏置誤差和增益誤差兩種,模塊誤差補(bǔ)償功能就是針對這兩種誤差進(jìn)行數(shù)據(jù)處理。通道誤差補(bǔ)償前需要獲取每個(gè)通道的誤差信息,而每個(gè)通道在不同量程、不同輸入阻抗情況下,誤差不同,需要分別進(jìn)行誤差測量。即先在0V輸入下測試零位電壓,電壓值取反即為偏置補(bǔ)償值,然后輸入滿量程電壓,此時(shí)的采集電壓即為增益誤差補(bǔ)償值。經(jīng)測試誤差補(bǔ)償完成后測量精度可達(dá)0.1%。同時(shí)數(shù)字化儀系統(tǒng)可以精確實(shí)現(xiàn)電平觸發(fā)、外部觸發(fā)及預(yù)采樣功能,并能精確計(jì)算正弦及方波等信號的頻率。
本文在VS2008環(huán)境中編寫了數(shù)字化儀的測試系統(tǒng),通過調(diào)用驅(qū)動(dòng)程序,實(shí)現(xiàn)了對高速數(shù)字化儀的控制。經(jīng)實(shí)驗(yàn)驗(yàn)證,數(shù)字化儀在14位分辨率,單通道最大采樣速度為125Msps條件下,達(dá)到預(yù)定的設(shè)計(jì)指標(biāo),可以滿足大多數(shù)采樣需要。該數(shù)字化采用了DMA數(shù)據(jù)傳輸模式,極大地提高了數(shù)據(jù)傳輸速度,可廣泛應(yīng)用于各種軍事和工業(yè)領(lǐng)域,具有十分廣闊的前景。
[1]柏向春.寬帶高精度數(shù)字化儀應(yīng)用軟件設(shè)計(jì)[D].成都:電子科技大學(xué),2008.
[2]王蘭英,居錦武.Windows平臺(tái)驅(qū)動(dòng)程序新架構(gòu)分析[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008(1):109-112.
[3]武安河.Windows設(shè)備驅(qū)動(dòng)程序WDF開發(fā)[M].北京:電子工業(yè)出版社,2009.
[4]王波,郭建.基于PCI設(shè)備的DMA傳輸建模與分析[J].計(jì)算機(jī)測量與控制,2011(19):972-974.
[5]易偉,徐欣,孫兆林.基于WDF的PXIe接口驅(qū)動(dòng)程序開發(fā)[J].微處理機(jī),2011(8):86-92.
[6]付寧,趙浩然,梁宇,等.PXI數(shù)字化儀的觸發(fā)設(shè)計(jì)[J].電子測量技術(shù),2012(8):116-119.
Digitizersoftware design based on high-speed multi-channel acquisition module
JIA Yu-jiao,LIU Ya-bin,ZHANG Xiu-lei
(School of Automation Science and Electrical Engineering,Beihang University,Beijing 100191,China)
Combined with the hardware equipment of digitizer,the key problems and resolutions in the development of software of high speed data acquisition and analysis system are discussed.It is discussed from three aspects-device driver,driver interface encapsulation and application software.Firstly,the basic frame and operational mechanism of WDF are analyzed thoroughly.Using VS2008,under Win7 system design WDF driver and implements the DMA transfer;design encapsulates the interface functions to operate the equipment;using C#language and multi-threaded design and implementation of the multi-channel high-speed data transmission,real-time display and storage system.Experiments show that the system is stability.
digitizer;WDF;DMA;high-speed
TN98
A
1674-6236(2016)12-0077-04
2015-07-02稿件編號:201507017
賈玉姣(1990—),女,山東濰坊人,碩士研究生。研究方向:檢測技術(shù)及自動(dòng)化裝置。