REFERAT-MenüDeutschGeographieGeschichteChemieBiographienElektronik
 EnglischEpochenFranzösischBiologieInformatikItalienisch
 KunstLateinLiteraturMathematikMusikPhilosophie
 PhysikPolitikPsychologieRechtSonstigeSpanisch
 SportTechnikWirtschaftWirtschaftskunde  



Dimmer


Dimmer








Realisierung einer mikroprozessorgesteuerten Dimmerschaltung über I2C-Bus mit VisualBasic.



 










Aufgabenstellung


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.



Schaltungen


Prinzipschaltung






In der Prinzipschaltung wurde die Leitung und der R6 (Pull-Up) für die Resetschaltung des uP nicht berücksichtigt.

Schaltung für Layout


Layout





Bauteilwerte




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






Schaltungserklärung


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.



Dimensionierung


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



Oszillogramme




Diese Meßergebnisse wurden am 4.2.98 mit der Programmversion "dimmer5" aufgenommen.

(Bei 200 V Versorgungsspannung)


Programme und Flußdiagramme

Programmversion von Bögner & Zeman




* 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


Weiterbearbeitung des Bögner & zeman - programmes


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













Abschließende Fehlerbehebung


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.












Fehleranalyse


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.




Neue Schaltung


Prinzipschaltung



Bei der Prinzipschaltung wurde wieder auf die Einzeichnung der Resetleitung und des Reset-Pull-Up's R6 verzichtet.












Schaltung für Layout

Anhang








Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen