湖南工業(yè)職業(yè)技術(shù)學(xué)院電氣工程學(xué)院 賀力克
湖南工業(yè)大學(xué)交通工程學(xué)院 易吉良
快速傅里葉變換(FFT)采用時間抽取或頻率抽取方式大大提高了傅里葉變換的運算效率。但在旋轉(zhuǎn)變壓器解碼和電能質(zhì)量分析等應(yīng)用領(lǐng)域,由于信號采樣率很高,同時這些應(yīng)用中FFT算法的運算量很大,在DSP芯片中很難實現(xiàn)實時處理。本文介紹一種采用TMS320F28335DSP實現(xiàn)高速信號采集并實時進行FFT運算的方法,為基于FFT的大運算量算法的實時應(yīng)用提供一種解決方案。
以采用DSP解碼的旋轉(zhuǎn)變壓器解碼系統(tǒng)為例,其系統(tǒng)結(jié)構(gòu)框圖如圖1所示。從圖1可以看出,旋轉(zhuǎn)變壓器的三路信號Vc、Vs和Ve通過信號調(diào)理電路轉(zhuǎn)換為滿足DSP內(nèi)置AD端口需要的電壓信號V1~V3。
圖1 旋轉(zhuǎn)變壓器解碼系統(tǒng)框圖
一般上述三路信號的頻率為5KHz~10KHz,需要AD的采樣頻率為50KHz~200KHz。以10KHz信號頻率和100KHz采樣頻率為例,若在分析數(shù)據(jù)過程中截取10周期數(shù)據(jù),則待分析信號的時長為0.1ms。在上述條件下,若要做到實時運算,則芯片要在0.1ms內(nèi)要處理完數(shù)據(jù)采樣、算法運算和其他數(shù)據(jù)通信等事務(wù)。如果每次數(shù)據(jù)采樣都需要CPU參與,而FFT沒有高效算法的情況下,一般的DSP芯片很難做到實時性。TI公司的TMS320F28335DSP芯片設(shè)計了直接存儲器訪問技術(shù)(DMA),AD采樣的數(shù)據(jù)直接傳送到指定的數(shù)據(jù)緩沖區(qū),不需要CPU在每個采樣周期都參與數(shù)據(jù)傳輸,只需在完成一定量的數(shù)據(jù)采集后,才通過中斷通知CPU執(zhí)行相關(guān)操作。另外,該芯片的軟件開發(fā)資源非常豐富,包括開發(fā)環(huán)境CCS和資源包controlSUITE,為高數(shù)據(jù)采樣率和大運算量的實時應(yīng)用提供了支持。
DMA提供了外設(shè)和存儲器之間的一種直接硬件傳輸數(shù)據(jù)的方式,可以大大減少CPU的開銷。為了簡要描述DMA的工作原理,以ADC采樣結(jié)果傳輸?shù)絉AM的過程為例,描述TMS320F28335的DMA如何直接將AD采樣的數(shù)據(jù)傳輸?shù)街付ǖ腞AM中。
圖2中DMA的工作首先要分配好源地址和目的地址,在本例中,源地址就是AD采樣結(jié)果寄存器,而目的地址就是存放采樣結(jié)果的數(shù)據(jù)緩沖區(qū)RAM。DSP傳輸數(shù)據(jù)要用到數(shù)據(jù)總線,而這些總線都是共享的,也就是說只有在傳輸數(shù)據(jù)時才能占用。而DMA的傳輸觸發(fā)是通過中斷實現(xiàn)的,即AD一旦完成了采樣就發(fā)出中斷信號,通知DMA將結(jié)果寄存器的數(shù)據(jù)取走,這時DMA就要占用數(shù)據(jù)總線,傳完數(shù)據(jù)就會自動釋放總線。而當(dāng)數(shù)據(jù)緩沖區(qū)填滿的新的數(shù)據(jù)后,可以設(shè)置DMA發(fā)出中斷,通知CPU對緩沖區(qū)的數(shù)據(jù)進行處理,這樣,CPU只需在DMA中斷時才提取數(shù)據(jù),節(jié)省了大量的CPU時間。
圖2 TMS320F28335DMA原理
根據(jù)上述DMA原理,使用DMA需要對相關(guān)寄存器做設(shè)置,在初始化程序中,主要利用如下幾個C語言函數(shù):(1)DMACH1AddrConfig( ):該函數(shù)用來配置DMA的源地址和目的地址。(2)DMACH1BurstConfig( ):該函數(shù)用于配置每幀DMA傳輸?shù)臄?shù)據(jù)量,以及每次傳輸源地址和目標(biāo)地址改變的步長。(3)DMACH1TransferConfig( ):該函數(shù)用于配置傳輸幀數(shù)量,以及幀地址步長。(4)DMACH1Wrap-Config( ):該函數(shù)用于定義進行循環(huán)傳輸,以及相應(yīng)的源地址和目的地址與步長。(5)DMACH1ModeConfig( ):這個函數(shù)有10個參數(shù)需要配置,關(guān)系到DMA的中斷使能和工作模式等。每個參數(shù)的具體含義需結(jié)合數(shù)據(jù)手冊中的DMA工作流程加以理解,限于篇幅,不再贅述。
在DMA完成DMACH1TransferConfig( )函數(shù)定義的數(shù)據(jù)幀后,就需要產(chǎn)生中斷,執(zhí)行interrupt void local_DINTCH1_ISR( )中斷函數(shù),在該函數(shù)中執(zhí)行FFT等算法程序。
FFT是很多應(yīng)用中的算法。在DSP中實現(xiàn)FFT有兩種方案,一種是直接根據(jù)FFT的定義編寫程序;另一種是利用TI的FFT庫函數(shù)實現(xiàn)。作者對兩種方案進行了測試,發(fā)現(xiàn)庫函數(shù)有更高的運算效率,下面主要介紹庫函數(shù)的應(yīng)用方法。
庫函數(shù)利用壓縮算法實現(xiàn)FFT,使得計算效率得到了很大提高。其實整個庫函數(shù)除了FFT外,還有求IFFT和求幅值等函數(shù)。庫函數(shù)的源碼在controlSUITE目錄下可以找到,基本都是采用匯編語言編寫。庫函數(shù)的詳細(xì)的使用方法可以從TI公司官網(wǎng)下載文檔C28x-FPU-LIB-UG.pdf進行了解。這里主要介紹在使用庫函數(shù)過程中需要注意一些細(xì)節(jié),如輸入數(shù)據(jù)是否對齊、處理結(jié)果存放在哪些緩沖區(qū)等。
使用庫函數(shù)只要在CCS工程中添加C28x_FPU_Lib.lib庫文件和FPU.h頭文件,然后就可以直接調(diào)用FFT相關(guān)函數(shù),包括:(1)CFFT_f32( ):該函數(shù)用于計算FFT,注意該函數(shù)的參數(shù)是復(fù)數(shù)格式,在DSP中需要用兩個單元分別存放實部和虛部,且實部在前,虛部在后。(2)ICFFT_f32( ):該函數(shù)用于計算IFFT,其參數(shù)要求與CFFT_f32( )一樣。(3)abs_SP_CV_2( ):該函數(shù)用于求復(fù)數(shù)的幅值,三個參數(shù)分別是存放幅值結(jié)果,輸入的復(fù)數(shù)和數(shù)據(jù)長度。
圖3 CCS調(diào)試界面
在使用庫函數(shù)求FFT時對數(shù)據(jù)存放的存儲單元有特殊要求,即對齊某個地址,這就需要在存儲器分配文件*.cmd中對相應(yīng)數(shù)據(jù)變量進行說明。*.cmd文件中用到兩條分配存儲單元,即指令MEMORY和SECTIONS。其中MEMORY用于說明系統(tǒng)中有哪些可用的存儲器,而SECTIONS用于將定義的變量分配到可用的存儲器中。為了滿足FFT庫函數(shù)的要求,在SECTIONS指令中需要用到如下說明:
該語句的含義是將FFTRAML3s數(shù)據(jù)段定位到數(shù)據(jù)空間PAGE1的RAML3存儲器中,當(dāng)然PAGE1和RAML3是在MEMORY指令中定義好的。同時可以注意到,該指令后面還有ALIGN(512)的說明,它是保證FFTRAML3s對齊512個存儲單元,對齊的意思是該數(shù)據(jù)段的起始地址應(yīng)保證最低的N位為0,N要滿足:2N≥512。這樣CCS給FFTRAML3s分配的地址最低9位就是0。這樣做的目的是滿足DSP芯片的高效尋址方式,以使FFT算法快速執(zhí)行。
采用TMS320F28335開發(fā)板進行測試,系統(tǒng)時鐘頻率位150MHz,利用DMA技術(shù)高速采樣,采樣頻率100kHz。利用庫函數(shù)計算128點FFT,測得需要機器周期為5926,如圖3所示??梢运愠鲎?28點的FFT時間為:5926×6.67ns=0.039766ms,而128數(shù)據(jù)時間為0.128ms,因此,在上述條件下能夠?qū)崿F(xiàn)FFT的實時運算。
綜上所述,利用TMS320F28335的DMA技術(shù)和FFT庫函數(shù),能夠?qū)崿F(xiàn)數(shù)據(jù)的高頻采集和FFT算法的快速運算,滿足對信號采集和頻譜分析的實時性要求極高的應(yīng)用場合。