牛夢毫,周前柏,師璟桐,康穎,楊光
(航空工業(yè)西安航空計算技術(shù)研究所,陜西西安,710065)
模擬量采集功能是嵌入式系統(tǒng)中至關(guān)重要的功能,以最具代表性的航空系統(tǒng)為例,航空系統(tǒng)的各子系統(tǒng)例如航電系統(tǒng)、飛控系統(tǒng)、機(jī)電系統(tǒng)等通常包括大量的模擬信號,中央管理設(shè)備根據(jù)這些模擬量轉(zhuǎn)換后的數(shù)字信號產(chǎn)生特定的控制輸出來實現(xiàn)各個系統(tǒng)不同的控制功能,模擬量采集的精度和可靠性也影響整個機(jī)載系統(tǒng)運(yùn)行的穩(wěn)定性和可靠性[1]。在嵌入式系統(tǒng)中模擬量采集易受嵌入式系統(tǒng)內(nèi)部或外部噪聲干擾,產(chǎn)生震蕩,失真等問題,這極大地影響了嵌入式產(chǎn)品功能以及整個交聯(lián)系統(tǒng)的魯棒性。
目前對此問題的解決方法主要為在產(chǎn)品的硬件設(shè)計中加入濾波器[2],加強(qiáng)電磁兼容性設(shè)計[3]等,此類方法雖然可以有效濾除部分噪音干擾,但對于小成本嵌入式產(chǎn)品而言這類方法生產(chǎn)成本過高;還有一些方法在產(chǎn)品的軟件設(shè)計中加入插值濾波[4],平滑濾波[5]等,此類方法雖然可以有效濾除部分噪音干擾,但也僅適用部分系統(tǒng)平臺;本文設(shè)計了一種基于STM32 單片機(jī)運(yùn)行的模擬量采集濾波算法,采用較小的成本進(jìn)行噪聲濾除。實驗結(jié)果表明,本文提出的算法能夠較好地濾除噪聲干擾,提升了模擬量采集的準(zhǔn)確率。
在數(shù)字信號處理領(lǐng)域,傅里葉變換具有非常重要的意義,它可以將復(fù)雜的數(shù)字信號分解為若干簡單數(shù)字信號,從而方便選擇出有用的信號。
傅立葉原理表明:任何連續(xù)測量的時序或信號,都可以表示為不同頻率的正弦波信號的無限疊加。而根據(jù)該原理創(chuàng)立的傅立葉變換算法利用直接測量到的原始信號,以累加方式來計算該信號中不同正弦波信號的頻率、振幅和相位。
傅里葉變換對于在時空中連續(xù)的模擬量信號是適用的,但是此次主要處理對象是已經(jīng)經(jīng)過A/D 轉(zhuǎn)換后的模擬量信號并且存儲在主存的數(shù)字信號,而對于離散信號的變換只有離散傅立葉變換(DFT)才能被適用,對于計算機(jī)來說只有離散的和有限長度的數(shù)據(jù)才能被處理,傅里葉變換和離散傅里葉變換的區(qū)別展示如圖1 所示。快速傅里葉變換(FFT)也只不過是離散傅立葉變換(DFT)的一種快速的算法。
圖1 傅里葉變換與離散傅里葉變換對比
數(shù)字計算機(jī)采樣得到的數(shù)字信號,可以進(jìn)行FFT 變換。N 個采樣點(diǎn),經(jīng)過FFT 之后,可以得到N 個點(diǎn)的FFT 結(jié)果。為了方便進(jìn)行FFT 運(yùn)算,通常N 取2 的整數(shù)次方。
快速傅里葉變換算法預(yù)設(shè)采樣頻率為Fs,信號頻率F,采樣點(diǎn)數(shù)為N,經(jīng)過快速傅里葉變換算法的變換結(jié)果就是一個為N 點(diǎn)的復(fù)數(shù)向量組,其中返回的每一個點(diǎn)就對應(yīng)著一個頻率點(diǎn)大小,該點(diǎn)的模值即為該頻率值下的幅度特性。
快速傅里葉變換算法假設(shè)原始信號的峰值為A,那么返回結(jié)果除了第一個點(diǎn)直流分量之外的每個點(diǎn)的模值就是A的N/2 倍。每個點(diǎn)的相位可以認(rèn)為是在該頻率下的信號的相位。第一個點(diǎn)表示直流分量,即表達(dá)該點(diǎn)頻率為零,而第N+1 個點(diǎn)則表示采樣頻率Fs,這中間被N-1 個點(diǎn)平均分成N 等份,每個點(diǎn)的頻率依次增加。假設(shè)某點(diǎn)n 所表示的頻率為:Fn=(n-1)*Fs/N。Fn 所能分辨到頻率為Fs/N,如果采樣頻率Fs 為512Hz,采樣點(diǎn)數(shù)為512 點(diǎn),則可以分辨到1Hz。512Hz 的采樣率采樣512 點(diǎn),剛好是1 秒,也就是說,采樣1 秒時間的信號并做FFT,則結(jié)果可以分析精確到1Hz,如果采樣5 秒時間的信號并做FFT,則結(jié)果可以分析精確到0.2Hz。要提高頻率分辨率,則必須增加采樣點(diǎn)數(shù),也即采樣時間。頻率分辨率和采樣時間是倒數(shù)關(guān)系。
上述大致介紹了快速傅里葉變換的思想與使用,本文將使用快速傅里葉變換與其逆變換作為本文所設(shè)計軟件算法的主要組件,以及分析軟件濾波與硬件濾波相比的優(yōu)勢與不足。
本文所提出的模擬量采集濾波算法運(yùn)行在stm32 型號的單片機(jī)上,是基于經(jīng)典的模擬量采集電路設(shè)計的,該電路包括了用于采集模擬量輸入的信號調(diào)理電路,用于采集并將模擬量轉(zhuǎn)換為數(shù)字信號的A/D 轉(zhuǎn)換芯片,以及用于控制以及與A/D 轉(zhuǎn)換芯片通信的FPGA 芯片。為了能夠較好地驗證該軟件算法的實際效果,系統(tǒng)硬件電路實現(xiàn)減少了部分濾波措施,實驗所用系統(tǒng)的結(jié)構(gòu)圖如圖2 所示。
圖2 系統(tǒng)結(jié)構(gòu)圖
該嵌入式系統(tǒng)中為了避免成本過高,體積過大,并以實現(xiàn)小型化、輕量化的設(shè)計思路為指導(dǎo),多路開關(guān)電路可根據(jù)模擬量采集數(shù)量,PCB 面積選擇合適模擬開關(guān)電路,此處系統(tǒng)設(shè)計選擇4 路多路開關(guān),通過FPGA 邏輯控制切換通道采集,沒有一對一采集設(shè)計需求。采集模擬量采集信號首先輸入進(jìn)A/D 轉(zhuǎn)換芯片,并由A/D 轉(zhuǎn)換芯片轉(zhuǎn)換為數(shù)字信號輸入給FPGA,暫存在FPGA 的寄存器堆中,最后由stm32芯片周期性讀取并記錄。
考慮到系統(tǒng)本身的噪聲輸入,算法優(yōu)先對該模擬量的模擬地進(jìn)行測試,作為后續(xù)模擬量輸入采集的比較基準(zhǔn)。本文設(shè)計模擬量采集濾波算法由STM32 芯片執(zhí)行,算法流程如圖3 所示。
圖3 算法流程圖
(1)在系統(tǒng)對應(yīng)模擬量接口空載情況下,STM32 芯片發(fā)送指令給FPGA,采樣頻率為1024Hz,采集1024 個模擬量樣本點(diǎn),并對采集到結(jié)果進(jìn)行快速傅里葉變換,并將采樣結(jié)果記為Zx。
(2)在系統(tǒng)對應(yīng)模擬量接口負(fù)載情況下,STM32 芯片發(fā)送指令給FPGA,采樣頻率為1024Hz,采集1024 個模擬量樣本點(diǎn),并對采集到結(jié)果進(jìn)行快速傅里葉變換,并將采樣結(jié)果記為Zy。
(3)對最終量Zx-Zy 進(jìn)行快速傅里葉逆變換,得到重構(gòu)后的樣本值,即為濾波后的采樣信號,并對其滑動濾波后求取平均值,作為此次模擬量采集參考值。
其中該算法中使用的滑動濾波算法使用滑動窗口大小為64,步長為32,其該算法流程如下:
(1)對采集到的1024 個模擬量按照時序記錄并選擇64 個樣本點(diǎn)求取平均值,并依時序向前滑動16 個樣本點(diǎn)的步長,重復(fù)此操作,直到無法向前滑動,將該步驟得到結(jié)果記為A1;
(2)對A1 中64 個經(jīng)過初步濾波的樣本點(diǎn)選擇8 個樣本點(diǎn)求取平均值,并依時序向前滑動8 個樣本點(diǎn)的步長,重復(fù)此操作,直到無法向前滑動,將該步驟得到結(jié)果記為A2;
(3)對A2 求取平均值,所得到的結(jié)果即為此次滑動濾波結(jié)果。
選擇滑動濾波算法由于滑動濾波能夠更有效地濾除尖峰信號,其示意圖如圖4所示。
圖4 滑動濾波示意圖
關(guān)于該算法中一些關(guān)鍵參數(shù)的選擇問題進(jìn)行說明:選擇STM32 的采樣頻率1024Hz,采樣點(diǎn)1024 個主要為了快速傅里葉變換由時域信號轉(zhuǎn)換為頻域信號后分辨率為1Hz,這樣可以讓快速傅里葉變換與快速傅里葉逆變換的內(nèi)存開銷在4MB 級別,可以適配較多嵌入式系統(tǒng)的內(nèi)存容量,而且在MHz 級別的主頻單片機(jī)上可以將響應(yīng)時間控制在1s~5s 之間,不會導(dǎo)致過長的系統(tǒng)延遲;滑動濾波算法中滑動窗口64 和步長16,滑動濾波算法本質(zhì)是對該時間序列進(jìn)行一維卷積操作,窗口大小即為卷積核的大小,如果卷積核尺寸過小則滑動濾波會退化為求取平均值濾波,一般根據(jù)經(jīng)驗公式而言,假設(shè)序列長度為N,則滑動窗口選擇在N1/2到2 倍N1/2之間。
為了驗證該濾波算法的有效性,搭建了具有復(fù)雜電磁干擾的系統(tǒng)運(yùn)行環(huán)境,并選擇以下兩種方法作為參考對照:
(1)STM32 芯片對FPGA 采集的數(shù)據(jù)不做任何處理,直接作為此次模擬量采集的參考值,下文簡稱方法a;
(2)STM32 芯片發(fā)送指令給FPGA,采樣頻率為1024Hz,采集1024 個模擬量樣本點(diǎn),但僅對這些樣本點(diǎn)做平滑濾波后取平均值,作為此次模擬量采集的參考值,下文簡稱方法b。
特此說明,本文所提出的模擬量狹義指代的是電壓輸入,電流輸入,電阻輸入,頻率輸入等模擬量信號,而所有模擬量輸入信號在硬件輸入形式的本質(zhì)只有兩種:即電壓輸入與電流輸入,因此本文只選取了最具代表性的電壓輸入與電流輸入作為此次模擬量濾波實驗的驗證項目。
電壓信號與電流信號作為最基本兩種模擬量信號,本質(zhì)上是電路中的電磁場信號的變換,所以任何系統(tǒng)內(nèi)部或外部的電磁場擾動都可能會對這兩種模擬量信號產(chǎn)生干擾,但是一般情況下這些噪聲相對于電路系統(tǒng)中的基準(zhǔn)電壓都非常小,基本可以忽略不計。但是如果系統(tǒng)外部存在一個強(qiáng)電磁干擾源,例如大功率用電設(shè)備,就可能會對系統(tǒng)的輸入接口上產(chǎn)生一個較強(qiáng)擾動,從而影響該輸入電路的正常工作。本文在設(shè)計驗證實驗時反向利用了此特點(diǎn),方法即為將該嵌入式系統(tǒng)的模擬量輸入接口從嵌入式系統(tǒng)的引腳引出,另一端連接一個微型天線結(jié)構(gòu)的銅制導(dǎo)體,這些端口可以將附近環(huán)境中的電磁擾動以較大功率傳輸?shù)角度胧较到y(tǒng)的內(nèi)置輸入接口電路上;而后本文將實驗環(huán)境選擇在有8 臺200W 以上的大功率用電設(shè)備周圍,用這些大型設(shè)備的關(guān)斷來模擬外部電磁干擾的強(qiáng)度。并且為了模擬電磁干擾信號的隨機(jī)性,會選擇在實驗中隨機(jī)開啟或關(guān)斷一些設(shè)備,制造一些電磁擾動的尖峰,來觀察本文所設(shè)計的模擬量濾波算法是否具有魯棒性。
實驗選擇0V 電壓,5V 電壓,0A 電流,2A 電流作為4路模擬量輸入信號,負(fù)載端為恒流恒壓源,實驗記錄5 次模擬量采集結(jié)果,實驗結(jié)果如表1 所示。
表1 實驗結(jié)果表
從實驗結(jié)果可以推知,本文所提出的濾波算法能夠有效濾除噪聲尖峰,以及噪聲的直流分量;而且對比方法b,該算法能夠更好避免模擬量超差問題。
本次實驗雖然驗證了本文所提出的模擬量采集濾波算法相較于平滑濾波算法能夠更好的濾除噪音,但依然存在對噪音尖峰超差的問題,這也從一定層面反映了僅依靠軟件濾波的局限性,在對于較大的尖峰,浪涌等噪聲信號的濾波上一般硬件濾波具有更明顯的效果,所以為了追求更強(qiáng)的安全性與可靠性,未來應(yīng)該追求軟硬件有機(jī)結(jié)合的濾波方式,采取一定體系化,系統(tǒng)化的濾波設(shè)計,應(yīng)該作為此類工作將來的一個重要方向。
本文提出了一種基于STM32 單片機(jī)的模擬量采集濾波算法,該算法雖然在一定程度解決了模擬量輸入采集的精度問題,但是該算法依然存在很多改進(jìn)的空間。從時間復(fù)雜度和空間復(fù)雜度來看,方法a 的時間復(fù)雜度為O(1),空間復(fù)雜度為O(1);方法b 的時間復(fù)雜度為O(n),空間復(fù)雜度為O(n);本文所提出算法的時間復(fù)雜度為O(n2),空間復(fù)雜度為O(n2),如果為了獲得更好的濾波效果而將n 值取得過大,將會極大地占用嵌入式系統(tǒng)的內(nèi)存資源,并且會對系統(tǒng)響應(yīng)的實時性造成影響。未來工作的主要方向就是對該算法空間復(fù)雜度與時間復(fù)雜度的優(yōu)化。