??? 摘? 要: 提出了一種利用數(shù)字濾波器濾除工頻" title="工頻">工頻干擾的快速算法,。這種算法從AVR單片機(jī)內(nèi)部硬件乘法器" title="乘法器">乘法器的特點(diǎn)出發(fā),,采用分配系數(shù)法進(jìn)行低通數(shù)字濾波器設(shè)計(jì)。經(jīng)過VMLAB集成開發(fā)環(huán)境的仿真驗(yàn)證,,算法速度快,、代碼效率高、濾波效果理想,。
??? 關(guān)鍵詞: 單片機(jī)? 定點(diǎn)小數(shù)? FIR? 工頻干擾? 分配系數(shù)法? VMLAB
?
??? 工頻干擾廣泛存在各種工業(yè)現(xiàn)場中,,其產(chǎn)生的途徑主要包括輸電饋線、照明設(shè)備,、發(fā)動(dòng)機(jī)以及各種電子儀器設(shè)備等,。一般可以通過濾波電路消除工頻干擾,但這必將增加硬件結(jié)構(gòu)的復(fù)雜程度,。實(shí)際上,,還可以采用數(shù)字信號(hào)處理的相關(guān)算法,通過軟件濾波器濾除工頻干擾,。軟件濾波算法" title="濾波算法">濾波算法的采用,,無疑會(huì)在簡化電路結(jié)構(gòu)的同時(shí),使系統(tǒng)的硬件資源得到更加充分的利用,,并達(dá)到降低產(chǎn)品成本的要求,。
??? AVR單片機(jī)是Atmel公司生產(chǎn)的8位精簡指令集(RISC)單片機(jī)。與同類單片機(jī)相比,,在運(yùn)算速度,、外設(shè)資源、靈活性等方面性能均衡,,性價(jià)比較高,。AVR單片機(jī)適合C語言開發(fā),Mega系列AVR單片機(jī)還有一個(gè)內(nèi)部硬件乘法器單元,。這些特點(diǎn)都為軟件濾波器的實(shí)現(xiàn)提供了極大的便利,。
1 濾波算法
??? 常用的單片機(jī)濾波算法包括中值濾波、均值濾波、滑動(dòng)平均以及復(fù)合濾波算法等,。工頻干擾的頻率范圍在50Hz附近,,可以采用一個(gè)截止頻率遠(yuǎn)低于50Hz的低通濾波器來濾除工頻干擾。
??? 假設(shè)輸入信號(hào)為x(t),,輸出信號(hào)為y(t),,則一個(gè)RC低通濾波器表達(dá)式為:
??? 連續(xù)時(shí)間信號(hào)經(jīng)過采樣后成為離散時(shí)間信號(hào),低通濾波器的表達(dá)式也變?yōu)椋?BR>???
??? 所以系統(tǒng)的傳遞函數(shù)為:
???
??? 假設(shè)采樣頻率" title="采樣頻率">采樣頻率Fs=500Hz,,a分別取0.8,、0.85、0.9,、0.95,,代入(4)式,利用matlab畫出頻率響應(yīng)曲線,,如圖1,。其中50Hz頻率對(duì)應(yīng)的幅度衰減見表1。
?
2? 定點(diǎn)小數(shù)表達(dá)方式
??? 為了精確構(gòu)造數(shù)字濾波器,,經(jīng)常要用到浮點(diǎn)數(shù)據(jù)和系數(shù),。在進(jìn)行浮點(diǎn)數(shù)乘法運(yùn)算時(shí),針對(duì)AVR單片機(jī)設(shè)計(jì)的C編譯器例如AVR-GCC,,需要加入額外的數(shù)學(xué)庫函數(shù)進(jìn)行編譯,。而這會(huì)使編譯后程序的代碼量增加、處理時(shí)間加長,、處理器的開銷也隨之增加。為了更大限度地降低系統(tǒng)開銷,,提高程序效率,,采用定點(diǎn)小數(shù)表示形式進(jìn)行乘法運(yùn)算是最佳選擇。
??? AVR單片機(jī)是一種8位精簡指令集(RISC)單片機(jī),。其中megaAVR系列內(nèi)部都帶有一個(gè)硬件乘法器,,計(jì)算一次8位乘8位的定點(diǎn)乘法只需2個(gè)時(shí)鐘周期。因此采用8位定點(diǎn)采樣數(shù)據(jù)乘以8位系數(shù)的定點(diǎn)乘法方式完成濾波算法是最高效的,。
??? 低通濾波處理涉及的運(yùn)算形式為一個(gè)純小數(shù)系數(shù)和一個(gè)已知數(shù)據(jù)相乘再相加,。因此將系數(shù)采用定點(diǎn)小數(shù)的表示形式,對(duì)于提高算法速度是至關(guān)重要的,。
??? 可以定義一種8位定點(diǎn)小數(shù)表示形式——Q8數(shù),,其各位權(quán)系數(shù)如下:
??? Q8數(shù)的表示范圍從0到1-2-8=0.99609375,每兩個(gè)數(shù)之間的間隔是2-8(0.00390625),,其所能表達(dá)的純小數(shù)共有28=256個(gè),。例如11011000就表示2-1+2-2+2-4+2-5=0.84375,而11011001就是表示2-1+2-2+2-4+2-5+2-8=0.84765625,因此0.84375和0.84765625之間的純小數(shù)只能用這兩個(gè)數(shù)中的一個(gè)近似表示了,。這對(duì)于乘法計(jì)算的精度有一定的影響,,但是由于濾波公式(3)中的系數(shù)a和(1-a)都是常數(shù),在整體性能穩(wěn)定的情況下,,系數(shù)微小的不確定性對(duì)濾波器整體性能并沒有太大的影響,。
3 分配系數(shù)法原理
??? 從(3)式可知,濾波算法可以用迭代計(jì)算實(shí)現(xiàn),,為保證每個(gè)新的輸出值都可以作為下次計(jì)算的輸入值,,必須使輸出值和輸入值的位寬度一致。AVR單片機(jī)內(nèi)部硬件乘法器的輸出結(jié)果為16位,,兩次乘法運(yùn)算的結(jié)果還要進(jìn)行加法運(yùn)算,,其結(jié)果很有可能超過16位寬度。如果要進(jìn)行迭代計(jì)算,,就要將乘加運(yùn)算的結(jié)果轉(zhuǎn)化成8位表示方式,。一種解決方法是用查表法實(shí)現(xiàn)乘法計(jì)算,這樣運(yùn)算結(jié)果就直接表達(dá)成8位定點(diǎn)數(shù)形式,,不用進(jìn)行表示方式的轉(zhuǎn)化,,但是這種方案要占用額外的硬件存儲(chǔ)空間構(gòu)造一張查找表。
??? 可以從逆向進(jìn)行思考:由(3)式可知,,每個(gè)新的輸出值y(k)都與上一次的輸出值y(k-1)和新的輸入值x(k)有關(guān),。y(k-1)和x(k)都是8位的,因此最大值為0xFF,。為了使a×y(k-1)+(1-a)×x(k)不超過0xFFFF,,兩個(gè)系數(shù)a和(1-a)的和不能超過0xFFFF/0xFF=0x101。實(shí)際上,,a+(1-a)等于“1”,,因此這里的0x101就可以看作“1”。如果取a=0.9,,那么對(duì)應(yīng)地將0x101平均分成10份,,取其中的9份,即0x101×0.9近似等于0xE7,, 相應(yīng)地0.1就等于0x101-0xE7=0x1A,。這里的0xE7可以近似被認(rèn)為是0.9的一種定點(diǎn)Q8數(shù)表示形式,而0.1的定點(diǎn)Q8數(shù)表示形式就是0x1A,。由于濾波器系數(shù)a和(1-a)采用了Q8數(shù)的表示形式,,這種將16位乘加運(yùn)算結(jié)果轉(zhuǎn)化為8位定點(diǎn)數(shù)表示形式的工作就變得簡單了,只需通過移位運(yùn)算,,取y(k)的高8位即可,,對(duì)應(yīng)的C語言代碼為:
??? y(k)=(char)(y(k)>>8)
??? 在C語言編程處理中,并不需要建立一個(gè)數(shù)組來儲(chǔ)存y(k)的值,而只需定義兩個(gè)unsigned char型的變量分別儲(chǔ)存y(k-1)和x(k),。當(dāng)乘加計(jì)算a×y(k-1)+(1-a)×x(k)完成后,,將結(jié)果轉(zhuǎn)化成8位定點(diǎn)數(shù)形式,再將其賦值給y(k-1)所對(duì)應(yīng)的變量即可,。因此采用迭代方式進(jìn)行乘加運(yùn)算后,,整個(gè)運(yùn)算過程只需要兩個(gè)變量和兩個(gè)常數(shù)參加即可。
??? 通過這種處理,,y(k)就可以作為計(jì)算下一次輸出值y(k+1)的一個(gè)已知量,,并繼續(xù)與Q8數(shù)形式的濾波器系數(shù)相乘,得到新的輸出值,。這種處理方式簡化了乘加運(yùn)算的完成過程,,節(jié)省了系統(tǒng)硬件資源,并降低了處理器開銷,。
4 采樣時(shí)間的控制
??? 采用單片機(jī)進(jìn)行數(shù)字信號(hào)處理,,一種有效而準(zhǔn)確的數(shù)據(jù)采集方式就是通過計(jì)數(shù)器中斷服務(wù)程序" title="中斷服務(wù)程序">中斷服務(wù)程序(ISR)控制AD對(duì)輸入信號(hào)進(jìn)行精確采樣。但是(圖2)中斷服務(wù)程序(ISR)的開銷影響了AD采樣時(shí)間間隔的精確度,,同時(shí)如果中斷服務(wù)程序(ISR)的開銷過大,,必然導(dǎo)致AD的最高采樣頻率的降低。因此,,要想獲得精確的采樣頻率,,就必須在盡量減少中斷服務(wù)程序開銷的前提下,適當(dāng)調(diào)整計(jì)數(shù)器中斷的時(shí)間間隔,。這可以通過調(diào)整OCR0的預(yù)置數(shù)來完成,。
?
5 算法流程圖
??? 濾波算法是通過中斷服務(wù)程序(ISR)來完成的,整個(gè)應(yīng)用程序的主函數(shù)main()主要負(fù)責(zé)初始化計(jì)數(shù)器中斷,,并處理其它應(yīng)用,。整個(gè)程序的流程圖如圖3所示。
?
??? 本算法的C語言代碼(附錄A)經(jīng)過AVR-GCC編譯器的編譯后,,“.text”段只有310個(gè)字節(jié),大大節(jié)省了單片機(jī)的flash空間,。
6? 基于VMLAB的濾波系統(tǒng)仿真實(shí)現(xiàn)
??? VMLAB的全稱為:Visual Micro Lab,。它針對(duì)AVR系列單片機(jī)和ST62系列單片機(jī)設(shè)計(jì),是一個(gè)單片機(jī)的虛擬原型框架,,可以提供給用戶一個(gè)真正意義上的虛擬微控制器(MCU)設(shè)計(jì)實(shí)驗(yàn)室,。它具有強(qiáng)大的多窗口、多文件的編輯器,,微控制器的集成開發(fā)環(huán)境,,擁有一系列的集成開發(fā)工具,圖形界面的調(diào)試器,混合模式的模擬-數(shù)字電路仿真器,,代碼質(zhì)量檢查器等,。基于MCU,,它可以仿真出包括模擬元器件在內(nèi)的更多外圍設(shè)備,,并具有交互式器件模擬仿真功能。
??? 假設(shè)有用信號(hào)是2V大小的直流信號(hào),,工頻干擾是峰峰值為1V,,頻率為50Hz的正弦波,建立單片機(jī)AD的輸入信號(hào)表示形式如下:
??? 2+0.5 sin(2π×50×t)
??? VMLAB通過工程文件來管理和控制各種仿真信息,、硬件連接以及顯示I/O電壓波形等,。根據(jù)本算法的特點(diǎn),采用Atmega16作為目標(biāo)單片機(jī),,時(shí)鐘選為8MHz,,建立工程文件。恰當(dāng)設(shè)置OCR0寄存器,,使計(jì)數(shù)器比較匹配中斷的時(shí)間間隔約為2ms,,這樣AD的采樣頻率Fs近似認(rèn)為等于500Hz。經(jīng)過仿真,,對(duì)比結(jié)果如表3,。
?
??? 從表3可以看出:隨著a的增大,算法收斂的時(shí)間變長,,同時(shí)50Hz對(duì)應(yīng)的衰減幅度增加,,衰減的幅度值和理論推導(dǎo)基本一致。另外,,當(dāng)a=0.95時(shí),,DA輸出的均值變小。這主要是進(jìn)行循環(huán)迭代運(yùn)算時(shí),,需要將16位的變量轉(zhuǎn)化為8位表示形式所導(dǎo)致的,。在有用信號(hào)失真較小的情況下,為使濾波器達(dá)到降低工頻干擾的最佳效果,,必須恰當(dāng)選擇a值,。經(jīng)過以上的仿真試驗(yàn)可以發(fā)現(xiàn),當(dāng)a=0.9時(shí),,衰減幅度,、DA輸出均值和算法收斂時(shí)間表現(xiàn)比較均衡,可以作為一般情況下的選擇值,。
??? 將VMLAB中虛擬示波器的顯示數(shù)據(jù)導(dǎo)出到一個(gè)*.cvs文件中,,用matlab讀出這些數(shù)據(jù),,并畫出不同a值對(duì)應(yīng)的輸出響應(yīng),如圖4,。從圖4可以清晰看出不同a值下算法的性能變化的大致走向,。
?
??? 將AD的采樣間隔設(shè)置為4ms,對(duì)應(yīng)的采樣頻率Fs就變?yōu)?50Hz,,其它條件不變,。通過VMLAB進(jìn)行仿真,對(duì)比結(jié)果如表4,、圖5,。
?
?
??? 對(duì)比Fs=500Hz的情況,隨著采樣頻率Fs降低,,50Hz頻率的幅度衰減值會(huì)逐漸增加,。這主要是因?yàn)殡S著采樣頻率降低,低通濾波器的截至頻率fc也隨之降低,,相應(yīng)的濾波器在50Hz處的衰減也就越來越低,。根據(jù)奈奎斯特低通采樣定理,當(dāng)采樣頻率小于100Hz時(shí),,由于信號(hào)頻譜混疊,,濾波器對(duì)50Hz信號(hào)的濾波效果將會(huì)變差。如果只是對(duì)緩變信號(hào)進(jìn)行采樣,,采樣頻率比100Hz稍大即可,。但是隨著采樣頻率的降低,濾波算法的收斂時(shí)間也會(huì)增加,。因此必須在算法的濾波性能和收斂時(shí)間上進(jìn)行折衷考慮,。
??? 本文提出的分配系數(shù)法設(shè)計(jì)數(shù)字濾波器,算法速度快,、代碼效率高,、濾波效果理想,是一種實(shí)用的數(shù)字濾波器設(shè)計(jì)方法,,體現(xiàn)了將算法嵌入到具體硬件的思想,。另一方面,將定點(diǎn)小數(shù)的表示形式進(jìn)行適當(dāng)擴(kuò)展,,這個(gè)算法還可以用于10位或16位AD轉(zhuǎn)換精度的應(yīng)用場合,。
參考文獻(xiàn)
1 ATMEL. AVR201: Using the AVR Hardware Multiplier,Rev.1631C-AVR-06/02
2 ATMEL. AVR223: Digital Filters with AVR, Rev. 2527A-AVR-9/02
3 ATMEL. ATmega16 Data Sheet, Rev. 2466F-AVR-02/03
4 Erick L. Oberstar, Michael J. Narrow Band Filter Implementation On A Low Cost Microcontroller Issues and Performance, HP InfoTech,,2001
5 周航慈. 單片機(jī)應(yīng)用程序設(shè)計(jì)技術(shù)[M]. 北京航空航天大學(xué)出版社,1991