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