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
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
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
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.