八通道探傷數(shù)據(jù)實時傳輸模塊驅(qū)動設(shè)計
探傷系統(tǒng)中需要進行驅(qū)動設(shè)計的模塊主要分為兩大類。第一類是與超聲波探傷功能相關(guān)的信號處理部分,主要通過 FPGA 實現(xiàn),包括實時波形傳輸模塊、硬件實時報警和報警波形存儲模塊以及參數(shù)配置模塊等,這些模塊涉及到的主要是 FPGA 中的高速信號處理以及數(shù)據(jù)流向 ARM傳輸?shù)墓δ埽c系統(tǒng)性能關(guān)系密切,需要對其中的控制算法進行重點優(yōu)化設(shè)計。第二類是 ARM系統(tǒng)的外設(shè)驅(qū)動部分,主要有 RTC 實時時鐘模塊、DAC 增益控制模塊、ADC 電池電量監(jiān)控模塊、LCD 驅(qū)動、LCD 背光亮度控制模塊以及矩陣鍵盤驅(qū)動。這些外設(shè)與探傷功能沒有直接關(guān)系,卻是組成 ARM 嵌入式系統(tǒng)不可缺少的部分。
八通道探傷數(shù)據(jù)實時傳輸模塊驅(qū)動設(shè)計
探傷系統(tǒng)的前端模擬部分采用八通道高速 ADC 進行采樣,采樣速率為 40M,10bit。在 FPGA中,對八通道的高速數(shù)據(jù)需要進行非均勻壓縮處理,將高速數(shù)據(jù)流壓縮為 ARM 處理器可處理的低速數(shù)據(jù)流。在 FPGA 中設(shè)置了八個 FIFO,分別存儲八路通道壓縮后的波形數(shù)據(jù)。ARM 系統(tǒng)需要從 FIFO 中讀入波形數(shù)據(jù)并進行實時的波形顯示,這對系統(tǒng)的實時性要求非常高。為了保證 FPGA 能夠向 ARM 子系統(tǒng)及時高效地傳輸探傷數(shù)據(jù),探傷系統(tǒng)采用了中斷方式進行控制。由于軟件同時只顯示一個通道的波形,因此 FPGA 中通過八選一數(shù)據(jù)選擇器對八通道進行選擇,每次只發(fā)送需要進行顯示的通道的中斷。中斷的選擇通過該設(shè)備驅(qū)動程序中的 ioctl()實現(xiàn),在ioctl()函數(shù)中,修改內(nèi)核空間的通道號變量,并且向 FPGA 中的通道選擇寄存器寫入相應(yīng)的通道號控制字就可以實現(xiàn)顯示通道的切換。
以重復頻率 50Hz 為例,F(xiàn)PGA 對波形數(shù)據(jù)進行非均勻壓縮后,每隔 20ms 發(fā)送一個中斷信號給 ARM,ARM 模塊接收到中斷后,由 Linux 操作系統(tǒng)負責處理中斷,調(diào)用該設(shè)備驅(qū)動程序中的中斷服務(wù)子程序。在中斷處理程序中,首先通過通道號變量確定需要進行傳輸?shù)耐ǖ溃⒋_定需要讀入 FIFO 數(shù)據(jù)的端口地址。然后通過 insw()調(diào)用,從 FPGA 中的 FIFO 中讀取探傷波形數(shù)據(jù)到操作系統(tǒng)的內(nèi)核空間。接下來需要與應(yīng)用程序通信,通知波形數(shù)據(jù)已經(jīng)到達。驅(qū)動程序與進程的通信屬于進程間通信,Linux 中進程間通信方式包括管道(Pipe)、FIFO、信號(Signal)、共享內(nèi)存(Shared Memory)以及套接字(Socket)等。其中信號既可以用于兩個進程之間進行通信,也可以用于內(nèi)核與進程之間的通信,但內(nèi)核只能向進程發(fā)送信號而不能接收信號。
驅(qū)動程序采用了異步通信的機制來實現(xiàn)與應(yīng)用程序的通信。當驅(qū)動程序從 FIFO 中讀取完畢波形數(shù)據(jù)后,向應(yīng)用程序發(fā)送信號 SIGIO。應(yīng)用程序接收到 SIGIO 信號后,再調(diào)用驅(qū)動中的 read()方法,從內(nèi)核空間讀取波形數(shù)據(jù)進行實時顯示。這種方法在一定程度上實現(xiàn)了軟件意義上的中斷機制。與反復輪詢方法相比,減少了系統(tǒng)的開銷,提高了系統(tǒng)的運行效率。