一種基于DDS和Qt的“所見(jiàn)即所得”波形發(fā)生器
信號(hào)/槽機(jī)制是Qt的一個(gè)中心特征,用于對(duì)象間的通訊。繪圖事件(paintEvent)采用雙緩沖機(jī)制。雙緩沖技術(shù)是一種GUI編程技術(shù),它指的是在一個(gè)不在屏幕上的位圖上渲染一個(gè)物件并把此位圖拷貝到屏幕上,常用于消除閃爍和提供一個(gè)快速用戶界面。該程序采用了Qpixmap類來(lái)實(shí)現(xiàn)雙緩沖。
2.3 驅(qū)動(dòng)程序設(shè)計(jì)
Linux設(shè)備驅(qū)動(dòng)程序是系統(tǒng)內(nèi)核的一部分,運(yùn)行于內(nèi)核態(tài)。其可以以兩種方式被編譯和加載:直接編譯進(jìn)Linux內(nèi)核和編譯成一個(gè)可加載和刪除的模塊,通過(guò)modprobe/insmod和rmmod來(lái)加載和卸載驅(qū)動(dòng)模塊。該系統(tǒng)即采用字符設(shè)備驅(qū)動(dòng)。在系統(tǒng)內(nèi)部,I/O設(shè)備的存/取通過(guò)一組固定的入口點(diǎn)來(lái)進(jìn)行,具體到Linux系統(tǒng),設(shè)備驅(qū)動(dòng)程序所提供的這組入口點(diǎn)由一個(gè)文件操作結(jié)構(gòu)file_operation來(lái)向系統(tǒng)進(jìn)行說(shuō)明。該系統(tǒng)的驅(qū)動(dòng)函數(shù)需要提供3個(gè)函數(shù)調(diào)用,read函數(shù)用于讀取DDS運(yùn)行狀態(tài),write函數(shù)用于向DDS寫(xiě)入?yún)?shù)和波形數(shù)據(jù),ioctl函數(shù)用于復(fù)位/啟動(dòng)/停止DDS。另外還需要打開(kāi)(open)和關(guān)閉設(shè)備函數(shù)(close)。File_operatio的定義如下:
驅(qū)動(dòng)程序在wave_ioctl,wave_wirte,wave-read等幾個(gè)函數(shù)中具體實(shí)現(xiàn)。所需的波形參數(shù)和數(shù)據(jù)通過(guò)Qt程序打包,調(diào)用write函數(shù)(對(duì)應(yīng)驅(qū)動(dòng)程序中的wave_wrtie函數(shù))一次性寫(xiě)入DDS模塊。最終將驅(qū)動(dòng)程序編譯為模塊文件(*.ko),通過(guò)命令modprobe和rmmod來(lái)加載和卸載驅(qū)動(dòng)模塊。
3 系統(tǒng)操作及測(cè)試
(1)設(shè)置波形參數(shù),包括繪圖模式,時(shí)間軸刻度,輸出延時(shí)等。
(2)繪制波形,并作相應(yīng)的修改,最終完成波形繪制。在松開(kāi)觸摸筆之后Qt程序根據(jù)所選擇的波形繪制模式對(duì)波形進(jìn)行處理和優(yōu)化并重新顯示出來(lái)。
(3)點(diǎn)擊單次觸發(fā)模式或重復(fù)(循環(huán))觸發(fā)模式,此時(shí)Qt程序提取時(shí)間軸刻度參數(shù),轉(zhuǎn)換為DDS中可控分頻器的分頻參數(shù),并將這些參數(shù)和處理后的波形數(shù)據(jù)打包傳輸給DDS模塊,輸出延時(shí)完畢則啟動(dòng)DDS,即產(chǎn)生與所繪波形相同的實(shí)際電信號(hào),達(dá)到“所見(jiàn)即所得”的效果,如圖5所示(時(shí)間刻度為100μs)。
4 結(jié)語(yǔ)
任意波形發(fā)生器是現(xiàn)代電子技術(shù)的一個(gè)新發(fā)展,本文給出了一種基于DDS和Qt的任意波形發(fā)生器的整體設(shè)計(jì)方案,分析了DDS在FPGA中的實(shí)現(xiàn)和Linux下Qt程序的設(shè)計(jì)。該設(shè)計(jì)最大的特點(diǎn)是“所見(jiàn)即所得”,即繪制何種波形就可立即產(chǎn)生何種波形,非常直觀,從而以滿足各種電路測(cè)試,通信等領(lǐng)域快速產(chǎn)生任意波形信號(hào)的要求。
評(píng)論