Forum: Projekte & Code Phasenanschinttsteuerung


von Markus Schiesser (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hier eine kleine Demo zum Dimmen von Lampen.

Dimmer.c ist das GNU C Programm fuer den AVR
Scaletest.pl ist ein Program zum Steuern der acht Lampen am AVR. Es ist
ein kleines Perl Script, dass die Erweiterungen Tk und SerialPort
benoetigt. Ich habe das ganze unter Linux getestet, ein Anpassung auf
Windows sollte kein grosses Problem sein.

Beide Programme sind sehr einfach gestrickt und sollen nur eine kleine
Demonstration der Moeglichkeiten des AVR darstellen. Das Programm kann
bis zu acht Lampen unabhaenging von einander steuern.

Eine kurze Beschreibung:

Ein Nulldurchgang der 230 Volt Wechselspannung loest einen Interrupt
aus. Dieser startet den 8Bit Timer0 dessen Vorteiler das Clock Signal
durch acht teilt. Hat der Timer 0xFF erreicht loest er einen Interrupt
aus. Die Variable counter wird um eins erhoeht und die seriel
uebertragenen Werte werden mit der counter Variablen verglichen und bei
Bedarf der entsprechende Port aktiviert.

Die Anzahl der einzeln zu steuernend Lampen kann noch beliebig erhoeht
werden.

viel Spass beim Spielen und Probieren.... Jedoch vorsicht wenn ihr mit
230 Volt arbeitet

markus

von Michael (Gast)


Lesenswert?

Mal für Doofe :-)

kannst Du die Berechnungen, die Du am Anfanfag des C-Programm anstellst
mal dokumentieren?

10ms(50Hz/2) / 0,25us (4MHz) = 40000 cycle            OK
40000 cycle / 8(prescaler) = 5000 counts per 10ms     OK
(wobei ich davon aus gehe, dass der Timer einfach nicht so oft
laufen muss richtig?)

5000 counts / 100 = 50                                ??
255 - 50 = 205 => 0xCD                                ??
0xCD + 0x07 (delays) = 0xD4                           ??
(wofür benötigt man das?)

Noch was, weiß jemand wie da eine linearisierung rein passt?


Michael

von Jan-Willem Tielen (Gast)


Lesenswert?

Hallo,

weil ich holländisch bin, kann es sehr gut sein das mein Deutsch nicht
fehlerfrei ist. Entschuldigung dafur.

Markus, ich bin selbst auch beschäftigt gewesen mit das Programmieren
von einem Dimmer. Ich wollte eine Schaltung machen die wirkt wie den
bekannten SLB0587. Also mit einem Schalter kann schon alles gesteuert
werden (ein, aus, Phasenanschinttsteuerung). Mein Programm benutzt das
gleiche Principe wie du. Das einzige Problem jetzt ist der
Nulldurchgang Detectierung im Hardware. Wie hast du das gemacht? Es
gelingt mir nicht um es auf die richtige Zeiten zu empfangen.

Michael, was die linearisierung berifft, in Elektor (Juni 2002 wennn
ich mich nicht irre) hat mal eine DMX Dimmerschaltung gestehen. Da
brauchen Sie eine linearisierung, im Artikel sind linearisierungs
Kurven gezeichnet. Vielleicht ist mit einer Nachschlagentabelle das
einfach zu implementieren.

Jan-Willem

von Michael (Gast)


Lesenswert?

Hallo Jan-Willem,

danke für den Tipp, ich hab mir die Datei gleich mal angesehen aber
leider ist da nur die Hardware drin beschrieben, über die Software
schweigen die sich leider aus.

Michael

von Michael Wilhelm (Gast)


Lesenswert?

Hallo Markus,
beim Lesen deines Quellcodes ist mir folgendes aufgefallen: du
definierst ein 8 Byte großes Feld für den Empfang der seriellen Daten.
In der Empfangsroutine fragst du deine Zählvariable nach dem Empfang
ab, sodaß Feld 8 beschrieben wird. Jedoch wird das Feld von 0 bis 7
adressiert. Weiterhin, wie synchronisierst du die Daten, wenn der PC
nach dem Controller eingeschaltet wird?

MW

von Markus Schiesser (Gast)


Lesenswert?

Hallo Michael zu einer ersten Frage

ich moechte  die Lampen in 100 Schritten dimmen koennen. Desshalb
benoetige ich 100 Timer Interrupts pro 10ms . Darum wir der Timer mit
einem Wert geladen in dem Fall 0xD4. Dieser Wert setzt sich aus 255
(Zaehler ueberlauf) – 50 counts pro Skaleneinheit + 0x07 delays
zusammen.

Ich hoffe, dass ich es einwenig verstaendlich erklaert habe

So long

markus

von Markus Schiesser (Gast)


Lesenswert?

Hallo Jan-Willem,

Der Nulldurchgangs detector funktioniert folgender massen:

220V Wechselspannung auf Brueckengleichrichter, die Gleichspannung
steuert einen Optokoppler an ueber einen Vorwiderstand. Der Ausgang vom
Optokoppler wird bei jedem Null durchgang  auf high gezogen. Das ganze
geht dann noch auf einen Schmittrigger in den Microcontroller

markus

von Markus Schiesser (Gast)


Lesenswert?

Hallo Michael,

Ja hab da wohl ein Byte verschaenkt, war eigentlich mal gedacht fuer
die Syncronisation von Computer und Controller.
Das Perl script sendet bei jeder Aenderung alle acht Werte an den
Controller und das funktioniert so gut, dass ich keine Syncronisation
benoetige

Gruss

markus

von Michael Wilhelm (Gast)


Lesenswert?

Hallo Markus,
etwas eleganter ist es, wenn du einen 16-bit Timer mit Input Capture
nimmst.Der Nulldurchgang friert den Timer ein,der Timer wird
zurückgesetzt und jetzt kannst anhand des Sollwertes einen Output
Compare Register laden. Wenn es viele Lampen zu steuern gilt, kannst du
im Hauptprogramm mittels Polling einen Portpin setzen. Beispiel: du
empfängst meinetwegen einen DMX Wert von dezimal 100. Deinen ICP Wert
teilst du durch 256 und multiplizierst mit 100. Das Ergebnis ziehst du
von ICP Wert ab.Wenn der Timer diesen Wert erreicht hat mußt du den
Triac triggern. Funktioniert echt gut. Und in den ICP Routine zuerst
alle Triacs sperren und neu berechnen. Während des Nulldurchgangs
passiert ja eh nichts.
MW

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.