Digitální filtr
vloženo:30.07.2008
Blikání displeje, neklidná hodnota, poskakování nejnižšího řádu - tak se dá popsat nepříjemný problém při zobrazování údajů na displeji. Něco měříme, např. A/D převodníkem, a při zobrazení se to tak rychle mění, že to skoro nejde přečíst. Příčin může být několik. Špatné měření, nevhodný převodník atd. Samotná měřená hodnota také není vždy ideální, bez šumu, bez rušivých zákmitů apod.
Když nestačí hardwarové řešení, nabízí se ještě programové. Od jednoduchého průměru z několika vzorků, až po složité výpočty. Ty ale zabírají hodně programové paměti. Proto na ustálení hodnoty používám jednoduchý prográmek - filtr s plovoucí diferencí. Do výsledku sice vnáší malou chybu (výstup = vstup - 0 až n), zato je ale velmi stabilní. A pro běžné aplikace (termostat, regulátor tlaku, vlhkosti, atd.) je chyba zanedbatelná.
Princip filtru je jednoduchý, každá nová naměřená hodnota se porovná s minulým výstupem filtru (se starou hodnotou). Při porovnávání mohou nastat 4 možnosti. Pokud je vstup menší, nebo příliš velký než stará hodnota, vstup se rovnou přenese na výstup. Další možnost nastává, když se vstupní hodnota pohybuje v diferenčním pásmu, potom výstup zůstává stejný, neměnný!!! A nakonec poslední možnost, vstup je mírně nad diferenčním pásmem, v takovém případě bude výstup stará hodnota+1. Po několika průchodech filtrem se diferenční pásmo přesune na vstupní hodnotu a výstup bude opět stabilní.
Modelový příklad:
A/D převodník generuje hodnoty 0 až 1023. Konstanty (4 a 10) zvolíme na základě testování.
Simulace filtru v Excelu DIF07.xls (19 kB)
Podprogram DIF.asm (811 B) je odladěn pro mikroprocesory PIC16Fx
;Diference, odstraní chvění na nejnižších bitech. ;VSTUP: A1,2=nová hodnota, B1,2=stará hodnota ;VYSTUP: B1,2=výsledek DIF ;A - B = C MOVF B1,W SUBWF A1,W ;A1-B1=W MOVWF C1 ;uložit MOVF B2,W BTFSS STATUS,C ;kladné? ADDLW 1 ;B2+1=W SUBWF A2,W ;A2-B2=W MOVWF C2 ;uložit ;C2 = nenulové? (AB+255) ; MOVF C2,F BTFSS STATUS,Z ;C2=0? GOTO ADB ;NE, nová hodnota z A ;C1 > 10? (A>B+10) MOVF C1,W SUBLW 10 ;10-C1 BTFSS STATUS,C ;kladné? GOTO ADB ;NE, nová hodnota z A ;C1 <= 4? (A<=B+4) MOVF C1,W SUBLW 4 ;4-C1 BTFSC STATUS,C ;záporné? RETURN ;NE, stará hodnota z B ;C1 > 4 (A>B+4) INCFSZ B1,F ;stará hodnota B+1 RETURN ; INCF B2,F ; RETURN ADB MOVF A1,W ;přesun nové hodnoty A do B MOVWF B1 ; MOVF A2,W ; MOVWF B2 ; RETURN
(pouze pro nekomerční účely, only for non-commercial purposes)