Dimmer
Realisierung einer
mikroprozessorgesteuerten Dimmerschaltung über I2C-Bus mit
VisualBasic.
Weiterbearbeitung der von Bögner & Zeman (5 HNA 97) entwickelten Schaltung einschließlich Fehlerbehebung. In weiterer Folge dann Ansteuerung über I2C-Bus und Benutzeroberfläche mit Visual Basic programmieren.
Nach Aufbau der Schaltung und Programmierung des vorhanden Programmes (aus der Dokumentation von Bögner & Zeman) stellten wir folgende Fehler fest :
) Die Lampe flackerte in unregelmäßigen Abständen.
) Die Routine für die Dünkler-Einstellung dauerte länger als jene für die Heller-Einstellung.
In der Prinzipschaltung wurde die Leitung und der R6 (Pull-Up) für die Resetschaltung des uP nicht berücksichtigt.
Baut. |
Wert |
Baut. |
Wert |
R1 |
10k/10W |
C1 |
1mF/16V |
R2 |
390 k |
C2 |
10 nF |
R3 |
39 k |
C3 |
mF |
R4 |
330 E |
C4 |
40 pF |
R5 |
10 k |
C5 |
40 pF |
R6 |
10 k |
Z1 |
5V6 |
R7 |
330 E |
Z2 |
5V6 |
R8 |
10 k |
D1 |
1N4004 |
R9 |
1 M |
D2 |
1N4004 |
R10 |
100 k |
D3 |
1N4004 |
Der erste Teil der Schaltung (R1, Z1, D1, C1) dient dazu, um die Versorgungsspannung für den Inverter zu erzeugen. Über die Zenerdiode werden die 5,6 V erzeugt und mit dem C1 geglättet. Der zweite Teil (R2, R3, Z2) dient dazu, um das Eingangssignal für den Inverter zu liefern (ca. 50 Hz-Rechteck) und gewährleistet die Nulldurchgangsdetektion. R4 und R6 sind die Vorwiderstände für die LED des Optokopplers bzw. Optotriacs. Über den Optokoppler bzw. Optotriac wird der Laststromkreis vom mP-Stromkreis getrennt. Da der Optokoppler einen Open-Kollektor-Ausgang hat, wurde R5 als Pull-Up-Widerstand verwendet. C3 wird auf Versorgungsspannung (325 V) geladen. R9 muß genügend groß sein, um zu gewährleisten, daß der Strom durch R9 unter dem Zündstromminimum bleibt. R8 muß so dimensioniert werden, daß der Strom IGT in dem vom Datenblatt gegebenen Bereich liegt. C2 wurde über die im Datenblatt angeführte Impulsbreite dimensioniert.
Für R4 und R6 :
Annahme : I = 10 mA
UD = 1,5 V T R4 = R6 = = 350 W T
R4 = R6 = 330 W
R5 gewählt als Pull-Up mit R5 = 10 kW
Dimensionierung des Laststromkreises :
Laut Datenblatt : Typische Haltezeit des Zündstromes : tGT = 2 ms. (Gewählt : 15 ms)
Bereich des Zündstromes : IGT = 1..35 mA. (Gewählt : 32,5 mA)
Berechnung : R7 = = 10kW R8 > = 326 kW gewählt R8 = 1 MW
R9 = C2 = = 10 nF
Berechnung des C3 :
Annahme: t = 8 msec..Zeit, welche der Kondensator hat, um sich auf 325 V aufzuladen.
U 325 V (Kondensatorspannung)
= 230 = 325,269 V (tatsächlicher Spitzenwert)
U = T t = = 9,665
t = R C T C3 = = gewählt: C3 = 10 uF
Diese Meßergebnisse wurden am 4.2.98 mit der Programmversion "dimmer5" aufgenommen.
(Bei 200 V Versorgungsspannung)
* PROGRAMM : dimmer1.asm *
charin code 3027h ;Char in hide
port11 equ 91h ;Port-Pin 1.1
zeitv equ R3 ;Feineinstellung (Tastatur)
malzeitv equ 60d ;Grobeinstellung (Konstante)
; ** ** ** ** ********* ISR ** ** ** ** *************
org 8003h
jmp INTERRUPT
; ** ** ** ** ** HAUPTPROGRAMM ** ** ** ** *****
org 8200h
mov zeitv,#2d ;Maximale Helligkeit
setb port11 ;Finsterniss
orl tcon,#01h ;IT0 Flanken-aktiv (neg. Flanke)
setb ea ;Alle enabled
setb ex0 ;Externer Int. enabled
ABFRAGE:
call charin ;Zeichen einlesen
mov R0,A ;Zeichen ins Register retten
subb A,#64h ;Wenn Zeichen=d dann A=0
jz DUENKLER ;Wenn A=0 dann DUENKLER
mov A,R0 ;Gerettetes Zeichen wieder in Akku
subb A,#68h ;Wenn Zeichen=h dann A=0
jz HELLER ;Wenn A=0 dann HELLER
jmp ABFRAGE ;Wenn keines der beiden dann ABFRAGE
DUENKLER:
mov a,zeitv
subb a,#67d ;Kontrolle ob Lampe dunkel
jz ABFRAGE ;Wenn jaABFRAGE
mov a,zeitv
inc a ;zeitv um einen Wert vergrößern duenkler
mov zeitv,a ;wieder zurückschreiben
jmp ABFRAGE
HELLER:
mov a,zeitv
subb a,#2d ;Kontrolle ob Lampe voll leuchtet
jz ABFRAGE ;Wenn jaABFRAGE
mov a,zeitv
dec a ;zeit um einen Wert verringern heller
mov zeitv,a ;wieder zurückschreiben
jmp ABFRAGE
; ** ** ** ** *** UNTERPROGRAMM ** ** ** ** ****
INTERRUPT:
SPRUNG:
mov a,zeitv
TIME0:
dec a ;Zeitverzögerung abhängig von zeitv
mov r2,#malzeitv ;Allgemeine Zeitverzögerung (Konstante)
;R2 (Malzeitv) dient als konstante Zeitver-
;zögerung
TIME1:
djnz r2,TIME1 ;Malzeitkonstante decrementieren
;Wenn nicht Null dann TIME1
;Wenn Null dann Kontrolle ob A (zeitv) 0 ist
jnz TIME0 ;Wenn nicht Null dann TIME0
;Wenn A=0 und R2=0 dann :
clr port11 ;Ausgabe des Zündimpulses (Leuchtphase)
;(60*zeitv)
mov r4,#100d ;Konstante Zeitverzögerung
LOOP1:
djnz r4,LOOP1 ;Wenn Konstante Verzögerung abgelaufen, dann :
setb port11 ;Kein Zündimpuls (Dunkelphase) (100)
mov r5,#255d ;Allgemeine Zeitverzögerung
LOOP2:
mov r6,#16d
LOOP3:
djnz r6,LOOP3
djnz r5,LOOP2 ;Verschachtelte Zeitschleife (LOOP2/3)
clr port11 ;Zündimpuls (Leuchtphase) (16*255=4080)
mov r4,#100d ;Allgemeine Zeitverzögerung
LOOP4:
djnz r4,LOOP4
setb port11 ;Kein Zündimpuls (dunkelphase) (100)
RETI
END
Dokumentation : Diese Version ist die ursprüngliche Version aus der Dokumentation von Bögner & Zeman.
Aufgetretene Fehler : ) Lampe flackert in unregelmäßigen Abständen
) Funktion DÜNKLER dauert länger als HELLER
Ursache: ) Dadurch, daß die Lampe flackert, wurden über die Leitungen aufgetretene Spikes in den Beginn der Schaltung rückgekoppelt Lampe flackert.
) Die Ursache warum DÜNKLER länger dauert als HELLER konnte noch nicht gefunden werden
Fehlerbehebungsversuch :
Zuerst versuchten wir, über einen Tiefpaß die Störimpulse wegzufiltern. Da die Spikes aber so kurz waren, daß der Tiefpaß sie nicht wegfiltern konnte, versuchten wir in einer neuen Version des Programmes die im System aufgetretenen Spikes softwaremäßig auszuschalten, indem wir zu Beginn des Interrupts eine Routine einfügten, in der bei einem High-Zustand am Port-Pin 3.2 (externer Interrupt) die Interrupt-Serviceroutine sofort verlassen wird. (Interrupt wird bei Low am Pin 3.2 ausgelöst). Bei einem Low-Zustand am Pin muß dieser mindestens so lange sein, daß der mP die in den Akku hineingeschriebene Konstante von 10d bis 0d dekrementieren kann kurze Spikes werden nicht anerkannt.
Einzufügende Routine nach INTERRUPT :
push acc ;damit Inhalt aus Akku nicht verloren geht
mov a,#10d
s: jb p3.2,r ;wenn Bit am Port gesetzt (kein Interrupt) - ISR verlassen
dec a
jnz s ;wenn Akku = 0 dann ISR weiter baerbeiten
Und am Ende des Programmes :
r: pop acc ;Inhalt aus Akku wiederherstellen
RETI ;ISR verlassen
Dokumentation : Das Flackern blieb trotz Softwareänderung bei 230V gleich. Durch Zufall stellten wir fest, daß die Schaltung bei nur 200V tadellos funktionierte. Daraufhin untersuchten wir, ob dieses Flackern sich auch bei der alten Programmversion durch eine 200V-Versorgung ausschalten läßt. Wir stellten fest, daß die Schaltung mit der alten Programmversion bei 200V-Versorgungsspannung trotzdem noch ein wenig flackerte T Softwaremäßige Spikefehlerbehebung war ein voller Erfolg
Zu behebende Fehler : ) Spannungsversorgung 200V
) DÜNKLER langsamer als HELLER
Fehlerbehebungsversuch
Aufgrund der Tatsache, daß bei Tastendruck auf <d> die Routine für DÜNKLER aus irgendeinem unerklärlichen Grund langsamer durchlaufen wird als HELLER (Festgestellt am Oszilloskop durch die Phasenverschiebung der Impulse zur Netzfrequenzbei <d> langsamer) ließen wir die Tastaturabfrage weg und ließen den mP intern von dünkler auf heller regeln. In diesem neuen Programm wurde die Routine ABFRAGE logischerweise gelöscht.
* PROGRAMM : dimmer3.asm *
charin code 3027h ;Char in hide
port11 equ 91h ;Port-Pin 1.1
zeitv equ R3 ;Feineinstellung (Tastatur)
malzeitv equ 60d ;Grobeinstellung (Konstante)
; ** ** ** ** ******* ISR ** ** ** ** **********
org 8003h
jmp INTERRUPT
; ** ** ** ** ** HAUPTPROGRAMM ** ** ** ** *****
org 8200h
mov zeitv,#3d ;Maximale Helligkeit
setb port11 ;Finsterniss
orl tcon,#01h ;IT0 Flanken-aktiv (neg. Flanke)
setb ea ;Alle enabled
setb ex0 ;Externer Int. enabled
DUENKLER:
mov a,zeitv
subb a,#67d ;Kontrolle ob Lampe dunkel
jz heller ;Wenn jawieder heller
mov a,zeitv
inc a ;zeitv um einen Wert vergrößern duenkler
mov zeitv,a ;wieder zurückschreiben
mov r0,#030h ;so oft <d> bis ganz dunkel
z11:
mov r7,#0ffh
z12: djnz r7,z12
djnz r0,z11
jmp duenkler
HELLER:
mov a,zeitv
subb a,#2d ;Kontrolle ob Lampe voll leuchtet
jz duenkler ;Wenn jawieder duenkler
mov a,zeitv
dec a ;zeit um einen Wert verringern -> heller
mov zeitv,a ;wieder zurückschreiben
mov r0,#030h ;so oft <d> bis ganz dunkel
z21:
mov r7,#0ffh
z22: djnz r7,z22
djnz r0,z21
jmp heller
; ** ** ** ** *** UNTERPROGRAMM ** ** ** ** ****
INTERRUPT:
push acc
mov a,#10d
s: jb p3.2,r
dec a
jnz s
SPRUNG:
mov a,zeitv
TIME0:
dec a ;Zeitverzögerung abhängig von zeitv
mov r2,#malzeitv ;Allgemeine Zeitverzögerung (Konstante)
;R2 (Malzeitv) dient als konstante Zeitver-
;zögerung
TIME1:
djnz r2,TIME1 ;Malzeitkonstante decrementieren
;Wenn nicht Null dann TIME1
;Wenn Null dann Kontrolle ob A (zeitv) 0 ist
jnz TIME0 ;Wenn nicht Null dann TIME0
;Wenn A=0 und R2=0 dann :
clr port11 ;Ausgabe des Zündimpulses (Leuchtphase)
;(60*zeitv)
mov r4,#100d ;Konstante Zeitverzögerung
LOOP1:
djnz r4,LOOP1 ;Wenn Konstante Verzögerung abgelaufen, dann :
setb port11 ;Kein Zündimpuls (Dunkelphase) (100)
mov r5,#255d ;Allgemeine Zeitverzögerung
LOOP2:
mov r6,#16d
LOOP3:
djnz r6,LOOP3
djnz r5,LOOP2 ;Verschachtelte Zeitschleife (LOOP2/3)
clr port11 ;Zündimpuls (Leuchtphase) (16*255=4080)
mov r4,#100d ;Allgemeine Zeitverzögerung
LOOP4:
djnz r4,LOOP4
setb port11 ;Kein Zündimpuls (dunkelphase) (100)
r: pop acc
RETI
END
Dokumentation
: ) Wie erwartet waren
bei der automatischen Heller/Dünkler - Einstellung beide Routinen gleich schnell. Daraus folgerten wir, daß
der Fehler in der Tastaturabfrage liegen muß (Wir probierten das alte
Programm nochmals mit anderen Tasten als <h> und <d> aus, was
aber den Fehler nicht beeinflusste). Da wir diesen Fehler aber nur als
Feinheit ansahen, wollten wir uns damit nicht allzu lange aufhalten und
begannen mit dem I2C-Bus-Programm. Zu behebende Fehler :
) Spannungsversorgung 200 V ) DÜNKLER langsamer
als HELLER
Programmvorbereitung zur I2C-Bus-Ansteuerung
Nachdem eine andere Gruppe unserer Klasse sich schon seit Semesterbeginn mit dem I2C-Bus beschäftigt hat, übernahmen wir das Slave-Programm dieser Gruppe und fügten es in unserer Dimmer-Programm ein. Wir bemerkten, das der Empfang der vom Master geschickten Daten nicht korrekt war. Nach langen Überlegungen kamen wir zu dem Schluß, daß durch die am Ende des Programms vorhandenen Zeitschleifen das Programm ständig in der ISR bleibt und dadurch den Interrupt vom Master nicht bearbeiten kann. Aus diesem Grund versuchten wir, die Zeitschleifen durch Timer zu ersetzen, die dann bei einem Overflow in eine ISR springen. Da diese zweite ISR sehr kurz wäre, würde die Kommunikation zwischen Master und Slave nicht beeinflusst werden. Das Programm ist dem ursprünglichen Programm vom Ablauf her sehr ähnlich, bis auf die Tatsache, daß die Software-Verzögerung und die 10 msec-Verzögerung über das Timer 0 - Interrupt gesteuert werden. Die Einstellung der Impulsbreite erfolgt nach wie vor über die Zeitschleife.
* PROGRAMM : dimmer5.asm *
charin code 3027h ;Char in hide
port11 equ 91h ;Port-Pin 1.1
zeitv equ R3 ;Feineinstellung (Tastatur)
malzeitv equ 60d ;Grobeinstellung (Konstante)
n1 data 21h
n2 data 22h
; ** ** ** ** ******* ISR ** ** ** ** **********
;********** Exterener Interrupt
org 8003h ;Externer Interrupt /INT0
jmp inter1
;**** Timer0, Mode1 16bit
org 800bh ;Timer 0 overflow-Interrupt
ljmp inter2
; ** ** ** ** ** HAUPTPROGRAMM ** ** ** ** *****
org 8200h
mov zeitv,#0d ;Maximale Helligkeit
setb port11 ;Finsternis
orl tcon,#01h ;IT0 Flanken-aktiv (neg. Flanke)
setb ea ;Alle enabled
setb ex0 ;Externer Int. enabled
;Timer0 init
anl tmod,#11110000b ;Werte für Timer 1 beibehalten
orl tmod,#00000001b ;16-bit-Timer
anl tcon,#11001100b ;Werte für Timer 1 beibehalten
orl tcon,#00000010b ;Interrupt-Edge-Flag setzen
setb et0 ;Timer0 Interrupt enablen
ABFRAGE:
call charin ;Zeichen einlesen
mov R0,A ;Zeichen ins Register retten
mov A,R0
subb A,#64h ;Wenn Zeichen=d dann A=0
jz DUENKLER ;Wenn A=0 dann DUENKLER
mov A,R0 ;Gerettetes Zeichen wieder in Akku
subb A,#68h ;Wenn Zeichen=h dann A=0
jz HELLER ;Wenn A=0 dann HELLER
jmp ABFRAGE ;Wenn keines der beiden dann ABFRAGE
DUENKLER:
mov a,zeitv
subb a,#24d ;Kontrolle ob Lampe dunkel
jz ABFRAGE ;Wenn jaABFRAGE
mov a,zeitv
inc a ;zeitv um einen Wert vergrößern -> duenkler
mov zeitv,a ;wieder zurückschreiben
jmp ABFRAGE
HELLER:
mov a,zeitv
;Kontrolle ob Lampe voll leuchtet
jz ABFRAGE ;Wenn jaABFRAGE
mov a,zeitv
dec a ;zeit um einen Wert verringern -> heller
mov zeitv,a ;wieder zurückschreiben
jmp ABFRAGE
; ** ** Interrupts ** ** *
;********* Periode starten
org 8300h ;externer Interrupt
inter1: push acc ;Akku in Stack retten
clr tr0 ;Timer 0 stoppen
clr tf0 ;Flag löschen
mov a,#5d ;Schleife für Spike-Fehlerbehebung
s: jb p3.2,aus ;
dec a ;
jnz s ;
clr ex0 ;externen Interrupt disablen
mov a,#0ffh ;Softwaremäßige Verzögerung :
subb a,zeitv ;In Timer-Register TH0/TL0 werden die neuen Werte geschrieben
mov th0,a
mov a,#0h
mov tl0,a
setb tr0 ;Timer starten
aus: pop acc ;Akkuinhalt wieder aus Stack holen
reti
;********* Zündimpuls positive Halbwelle + Warten zwischen den beiden Impulsen
org 8350h ;Timer 0 - Interrupt
inter2: push acc ;Akkuinhalt in Stack retten
clr tr0 ;Timer stoppen
clr tf0 ;Timer-Flag löschen
clr port11 ;Zündimpuls
mov n1,#100d ;Einstellung der Impulsbreite
LOOP2p: djnz n1,loop2p
setb port11 ;Zündimpulsende
mov th0,#0dch ;Einstellung der 10 msec Zeitverzögerung über Timer 0
mov tl0,#0efh
setb tr0 ;Starten des Timer 0
mov dptr,#800Ch ;Interrupt auf 8400h verbiegen
mov a,#84h
movx @dptr,a
mov dptr,#800Dh
mov a,#00h
movx @dptr,a
pop acc ;Akkuinhalt aus Stack holen
reti
;********* Zündimpuls positive Halbwelle
org 8400h
inter3: push acc ;Akkuinhalt in Stack retten
clr tr0 ;Timer 0 stoppen
clr tf0 ;Timer-Interrupt-Flag löschen
setb ex0 ;Externen Interrupt wieder zulassen
clr port11 ;Zündimpuls
mov n1,#100d ;Einstellung der Impulsbreite
LOOP2n: djnz n1,loop2n
setb port11 ;kein Zündimpuls
mov dptr,#800Ch ;Interrupt wieder auf 8300h verbiegen
mov a,#83h
movx @dptr,a
mov dptr,#800Dh
mov a,#50h
movx @dptr,a
pop acc ;Akkuinhalt wieder aus Stack holen
reti
END
Nach Abschluß der Vorbereitung des Programmes für die I2C-Bus - Ansteuerung traten trotzdem noch immer die bekannten 2 Fehler auf :
) Die Versorgungsspannung durfte nicht höher als 215 V sein.
) Die Funktion Dünkler war langsamer als Heller.
Wir programmierten zuerst einmal die Ansteuerung des mP-Boards über Visual Basic. Bei diesem Programm konnte über einen Regler die Helligkeit der Lampe verstellt werden. Bei diesem Programm trat der Heller-Dünkler-Fehler nicht auf. Da wir in Zukunft ohnehin nur über Visual Basic mit dem mP-Board kommunizieren werden, war dieser Fehler für uns hiermit ausgeschaltet.
Der Versorgungsspannungsfehler konnte nicht so einfach ausgeschaltet werden. Nach langwierigen Schaltungsanalysen bemerkte ich, daß die Leitung für die Gate-Ansteuerung des TRIAC´s wie bei der Prinzipschaltung über der 230 V-Leitung mit den beiden Dioden lag. Interessanterweise stellte ich fest, daß die Lampe auch flackerte, wenn das Programm gar nicht gestartet wurde, d.h. an das Gate des TRIAC´s gar keine Spannung kam. Ich folgerte daraus das das Gate von irgendwo genügend Spannung bekommen muß, daß der TRIAC zünden kann. Ich trennte den Diodenzweig (D2, D3) auf und stellte fest, daß der TRIAC jetzt nicht mehr zünden konnte. Das Gate des TRIAC´s braucht nur ca. 1,5 V, daß der TRIAC zünden kann. Ich nahm an, daß die notwendige Gatespannung über eben diese Leitung mit den beiden Dioden kommen mußte. Für die Fehlerbehebung konnte ich mit dem Versuchsaufbau auf Lochrasterplatte nicht mehr viel machen, daher entschloß ich mich, das Layout anzufertigen und die Schaltung dann nochmals aufzubauen und zu überprüfen.
Nachdem die Schaltung mit dem fertigen Layout aufgebaut wurde, stellte ich fest, daß das Verhalten der Schaltung genauso ist, wie bei dem Versuchsaufbau. Der einzige Ausweg erschien mir, die Schaltung mit dem neuen Opto-Triac BRT 12 H (siehe Datenblätter im Anhang) aufzubauen und dadurch die Ansteuerschaltung des Triac's BTA 12 CW wegzulassen. Der BRT 12 H ist in der Lage, die Lampe direkt mit den von dem mP erzeugten Signal anzusteuern.
Nach dem Aufbau der Schaltung mit dem neuen Opto-Triac funktionierte die Schaltung auf Anhieb einwandfrei.
Bei der Prinzipschaltung wurde wieder auf die Einzeichnung der Resetleitung und des Reset-Pull-Up's R6 verzichtet.
Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen