mikrocontroller.net

Forum: Projekte & Code Phasenanschinttsteuerung


Autor: Markus Schiesser (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan-Willem Tielen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Schiesser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Schiesser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Schiesser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.