|
Bitte beachte die Copyrighthinweise.
Digitale Filter
1 Aufgabenstellung
·
Aufbau und Programmierung eines digitalen Hochpassfilters mittels des
80C537.
Eingangssignal-Messung über ADC, Ausgabe über Puffer und
R2R-Netzwerk.
· Rechnerische Ermittlung der Zeitkonstante.
2 Schaltung
Das R2R-Netzwerk wurde auf einer Steckplatine, die zwei 4049er auf einer Lötleiste aufgebaut.
Der Analogeingang P7.0 wurde mit einer Zenerdioden/Widerstandskombination geschützt. Die Puffer dienen dazu, Ungenauigkeiten der Portspannungen des Microcontrollers weitgehend auszuschalten.
3 Testprogramm
Zum Test der Hardware und des R2R-Netzwerks wurde folgendes Testprogramm ausgeführt.
Es handelt sich dabei im Prinzip um das Hochpassprogramm, nur wird in der Interruptroutine der eingelesene Analogwert von Port 7.0 (ADC0) auf Port 4 (R2R-Netzwerk) ausgegeben.
FilterA.asm
;*********************************************************************
; Editor: Rosenauer, Schnabel @ HTBLA Karlstein, Austria
; Datum: 19/Dez/1997 Klasse/Gruppe/Kat.Nr : IV-EA/-/--
;*********************************************************************
; Sprache : ASM fuer 80C537
; Programm Nr. : VEA Labor 11 (Gamp)
; Version : 0.20 mit Spannungsfolger
; Kurzbeschreibung : digitales Filter (Hochpass) NUR TEST von ADC
; Eingang: Port 7.0 (AD-Wandler0)
; Ausgang: Port 4 ueber R2R-Netzwerk
;*********************************************************************
#include 537.inc
; -- Definitionen --
MD0 .equ $E9
MD1 .equ $EA
MD2 .equ $EB
MD3 .equ $EC
MD4 .equ $ED
MD5 .equ $EE
; -- Konstanten --
n .equ 15 ;Multiplikator, ab 2 (!) bis 15
t .equ 255 ;fuer TMR2 Reloadwert, ca. 90 bis 255
; -- Variablen --
Reset .equ P1.0 ;Port fuer Reset
Out .equ P4 ;Ausgang ist Port 4
ADC .equ $00 ;ADC Zwischenspeicher
InL .equ $01 ;Werte nach Summierstelle
InH .equ $02
MulL .equ $03 ;Werte Rueckfuehrung mul
MulH .equ $04
DivL .equ $05 ;Werte Rueckfuehrung div
DivH .equ $06
Rest .equ $07 ;Hilfsregister
.org $0000
ljmp start
.org $002B ;TMR2 Interruptvektor
ljmp TMR2Int
start .org $0100 ; -- Hauptprogramm --
mov InL,#$00 ;InL nullsetzen
mov InH,#$00 ;InH nullsetzen
mov Out,#$00 ;Out nullsetzen
mov DivL,#$00 ;Ergebnis Rueckfuehrung nullsetzten
mov DivH,#$00 ;Ergebnis Rueckfuehrung nullsetzten
mov A,#$FF ;Berechnen des Reloadwertes TMR2
subb A,#t
; -- Init TMR2 --
orl T2CON,#%00010000 ;Timer 2 Auto-Reload Ein
anl T2CON,#%01110000
mov CRCH,#$FF ;Reloadwert fuer Timer 2H
mov CRCL,A ;Reloadwert fuer Timer 2L
mov TH2,#$FF ;Anfangswert fuer Timer 2H
mov TL2,A ;Anfangswert fuer Timer 2L
setb ET2 ;Timer 2 Overflow-Interrupt
setb T2I0 ;Timer 2 Ein
setb EAL ;Enable all Int.
Loop jb Reset,Loop ;Warteschleife (bis P1.0 auf Low)
clr EAL ;Disable all Int.
clr T2I0 ;Disable TMR2-Int.
ljmp start
; == Interruptroutinen ==
TMR2Int clr TF2 ;T2 Interrupt-Flag loeschen
mov DAPR,#$00 ;A/D Wandlung starten
;(Referenzspannung = 5V)
Busy jb BSY,Busy ;Warten bis AD-Wandlung fertig
mov A,ADDAT ;Digitalwert auf A schreiben
cpl a ;wegen invertierender Puffer!
mov P4,a
reti
.end
Kanal 1: UOUT; Kanal 2: UIN
Das Programm und das R2R-Netzwerk funktionierten einwandfrei, wie an folgendem Oszilloskopbild zu erkennen ist:
4 Hochpass
Folgendes Flussdiagramm ergibt einen Hochpass.
In der Software wurde aus Genauigkeitsgründen die Multiplikation vorgezogen.
Die Zeitverzögerung DT (t>0) ergibt sich direkt aus der TMR2 Interruptfrequenz.
4.2 Programm
Nach dem Interrupt wird der Analogwert eingelesen, eine gewisse Zeit (die konstant ist, da keine bedingten Sprünge vorhanden sind) verarbeitet und danach ausgegeben. Somit können sich auch von dieser Seite keine Probleme ergeben.
Die schnellste Interruptfrequenz ergibt sich somit aus der Zeit für die Abarbeitung der Interruptprozedur. Durch Abzählen der Befehlsschritte wurde sie auf ca. 90 bis 95 geschätzt, dies ist zugleich der geringste Reloadwert für den TMR2!
Filter3.asm:
;*********************************************************************
; Editor: Rosenauer, Schnabel @ HTBLA Karlstein, Austria
; Datum: 19/Dez/1997 Klasse/Gruppe/Kat.Nr : IV-EA/-/--
;*********************************************************************
; Sprache : ASM fuer 80C537
; Programm Nr. : VEA Labor 11 (Gamp)
; Version : 0.30
; Kurzbeschreibung : digitales Filter (Hochpass) GEHT
; Eingang: Port 7.0 (AD-Wandler0)
; Ausgang: Port 4 ueber R2R-Netzwerk
;*********************************************************************
#include 537.inc
; -- Definitionen --
MD0 .equ $E9
MD1 .equ $EA
MD2 .equ $EB
MD3 .equ $EC
MD4 .equ $ED
MD5 .equ $EE
; -- Konstanten --
n .equ 3 ;Multiplikator, ab 2 (!) bis 15
t .equ 255 ;fuer TMR2 Reloadwert, ca. 90 bis 255
; -- Variablen --
Reset .equ P1.0 ;Port fuer Reset
Out .equ P4 ;Ausgang ist Port 4
ADC .equ $00 ;ADC Zwischenspeicher
InL .equ $01 ;Werte nach Summierstelle
InH .equ $02
MulL .equ $03 ;Werte Rueckfuehrung mul
MulH .equ $04
DivL .equ $05 ;Werte Rueckfuehrung div
DivH .equ $06
Rest .equ $07 ;Hilfsregister
.org $0000
ljmp start
.org $002B ;TMR2 Interruptvektor
ljmp TMR2Int
start .org $0100 ; -- Hauptprogramm --
mov InL,#$00 ;InL nullsetzen
mov InH,#$00 ;InH nullsetzen
mov Out,#$00 ;Out nullsetzen
mov DivL,#$00 ;Ergebnis Rueckfuehrung nullsetzten
mov DivH,#$00 ;Ergebnis Rueckfuehrung nullsetzten
mov A,#$FF ;Berechnen des Reloadwertes TMR2
subb A,#t
; -- Init TMR2 --
orl T2CON,#%00010000 ;Timer 2 Auto-Reload Ein
anl T2CON,#%01110000
mov CRCH,#$FF ;Reloadwert fuer Timer 2H
mov CRCL,A ;Reloadwert fuer Timer 2L
mov TH2,#$FF ;Anfangswert fuer Timer 2H
mov TL2,A ;Anfangswert fuer Timer 2L
setb ET2 ;Timer 2 Overflow-Interrupt
setb T2I0 ;Timer 2 Ein
setb EAL ;Enable all Int.
Loop jb Reset,Loop ;Warteschleife (bis P1.0 auf Low)
clr EAL ;Disable all Int.
clr T2I0 ;Disable TMR2-Int.
ljmp start
; == Interruptroutinen ==
TMR2Int clr TF2 ;T2 Interrupt-Flag loeschen
mov DAPR,#$00 ;A/D Wandlung starten
;(Referenzspannung = 5V)
Busy jb BSY,Busy ;Warten bis AD-Wandlung fertig
mov A,ADDAT ;Digitalwert auf A schreiben
mov ADC,ADDAT ;ADDAT zwischenspeichern
add A,DivL ;Digitalwert mit Ergebnis des Filters
;addieren
mov InL,A ;A auf InL schreiben
clr A ;A nullsetzen
addc A,DivH ;DivH mit Carry addieren
mov InH,A ;A auf InH schreiben
; -- Filter Rueckfuehrung --
; In*(n-1)/n = Div
mov MD0,#(n-1) ;In mit (n-1) multiplizieren (schreiben)
mov MD4,InL
mov MD1,#$00
mov MD5,InH
nop ;rechnen
nop
nop
nop
mov MulL,MD0 ;In mit (n-1) multiplizieren (lesen)
mov MulH,MD1
mov Rest,MD2
mov Rest,MD3
mov MD0,MulL ;Mul durch n dividieren (schreiben)
mov MD1,MulH
mov MD4,#n
mov MD5,#$00
nop ;rechnen
nop
nop
nop
mov DivL,MD0 ;Mul durch n dividieren (lesen)
mov DivH,MD1
mov Rest,MD4
mov Rest,MD5
; -- Filter Ausgabe berechnen --
; In/n = Out
mov MD0,InL ;In durch n dividieren (schreiben)
mov MD1,InH
mov MD4,#n
mov MD5,#$00
nop ;rechnen
nop
nop
nop
mov a, MD0 ;In durch n dividieren (lesen)
mov Rest,MD1
mov Rest,MD4
mov Rest,MD5
; -- Ausgabe HP --
mov Rest,A ;ADC-A = Out
mov A,ADC
subb A,Rest
add A,#$7F
cpl a ;falls mit Invertierer!
mov Out,a
reti ;[TMR2Int]
.end
Nach dem Starten des Programms wurde festgestellt, dass für einen Tiefpass noch 256/2 » 127 addiert werden musste (Ist im obigen Programm und dem HP-Prinzip bereits eingetragen).
Danach erhielt man folgendes Bild (es sollte nun eine Zeitkonstante von etwa 2ms realisiert werden, die sich mit den Werten t=120 u. n=15 zufälligerweise ergab <g>):
Kanal 1: UOUT; Kanal 2: UIN
Zeitkonstante:
Abgelesener Wert: t = 1,8 ms.
Berechneter Wert (Formel s. Pkt. 4.5): t = 1,74 ms.
Es wurden nun mit verschiedenen Werten für t und n Messungen durchgeführt.
4.3 Werte: t = 255 und n = 15
Kanal 1: UOUT; Kanal 2: UIN (3c.gif)
Kanal 1: UOUT; Kanal 2: UIN; übersteuert (3d.gif)
Zeitkonstante:
Abgelesener Wert: t = 3,5 ms.
Berechneter Wert (Formel siehe Pkt. 4.5): t = 3,70 ms.
4.4 Werte: t = 255 und n = 3
Kanal 1: UOUT; Kanal 2: UIN (3e.gif)
Kanal 1: UOUT; Kanal 2: UIN; übersteuert (3f.gif)
Zeitkonstante:
Abgelesener Wert: t » 0,7 ms.
Berechneter Wert (Formel siehe Pkt. 4.5): t = 0,629 ms.
4.5 Berechnung der Zeitkonstanten
Da UHochpass = 1 UTiefpass gilt, ist die Zeitkonstante beider Systeme gleich. Es muss somit nur der untere Teil des Flussdiagramms (vgl. Punkt 4.1), also der Tiefpassteil berechnet werden.
Auf das System wird ein Rechteckimpuls (Sprungfunktion) angelegt. Es gilt somit:
fi+1 = [fi · (n-1) + s(i)] · n-1
z · F(z) z · f0 = [F(z) · (n-1) + ] · n-1
Mit f(0) = 0 erhält man:
F(z) =
f(i) =
Der Laufindex i gibt hierbei praktisch die Anzahl der DTs (Interupts) an.
Die Zeit t ist erreicht, wenn f(i) = 1 e-1 = 63,21% ist:
f(i) = 1 e-1
® i = -
t = - · DT
Eine Berechnung mittels Differenzengleichungen lieferte das gleiche Ergebnis.
Da der Microcontroller mit einer Taktfrequenz von 1MHz läuft, kann der im Programm eingestellte Reloadwert t direkt in ms eingesetzt werden.
5 Interpretation der Messergebnisse
Mit Microcontroller können relativ einfach digitale Filter realisiert werden. Besonderer Vorteil ist die einfache Verstellbarkeit der Filterkoeffizienten.
Die Berechnung stimmt sehr gut mit der Praxis überein, die Ungenauigkeiten dürften auf Messfehler zurückzuführen sein.
Verbesserungswürdig wäre nur noch das Verhalten bei einer Übersteuerung: Im Programm müsste in diesem Fall der Ausgangswert auf einen Maximalwert begrenzt werden.