Previous Page Table Of Contents Next Page


Bitte beachte die Copyrighthinweise.

La11-ww3

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

4.1 Prinzip

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.


Creative Commons Lizenzvertrag
Dieses Werk ist lizenziert unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Österreich Lizenz.
[http://www.FLR.at/]
Letztes Update vom 25. Jul. 1999 von Florian Rosenauer

Previous PageTop Of Page Next Page

Powered by Transit