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 - 0n), 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é?  (A<B nebo A>B+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