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