Hallo, ich habe mit einem ATmega8 einen Dimmer gebaut. Ich kann leider nur 1 Lampe mit dimmen. Gibt es eine Möglichkeit mit einem AVR mehrere Dimmer mit PWM zu realissieren? Bzw welche Möglichkeiten gibt es um ca 4 Lampen(12V/20W) zu dimmen) Gruß Max
- erste Möglichkeit schon von Jens genannt (softwarelastig) - du nimmst einen µC wie z.B. mega88, der bis zu 6 pwm kann - oder eine pwm multiplexen (hardwarelastig)
wieso nicht einfach 4 Transistoren, an deren Basis du einfach den PWM Ausgang legst?
Für 12V Glühlampen brauchst du keine PWM. Da reicht es bei DC die Spannung zu steuern oder bei AC eine Phasenanschnitts-Dimmer.
@Heinz: Die Aussage halte ich für etwas gewagt. Gerade für Ohmsche Lasten eignet sich PWM hervorragend und ist einer leistungsverbratenden DC-Regelung in jedem Fall vorzuziehen. Im Fall von trägen Glühlampen tut´s eine recht niederfrequente Software-PWM (meinetwegen 100Hz Ausgabefrequenz), die über einen Timer erzeugt wird, ohne große Probleme. Da krigste in einem Tiny2313 Controller mindestens 8 von unter und hast dann auch noch genug Platz und Zeit für andere Dinge.
Hallo zusammen, also ich hab auch versucht eine mehrfach PWM mit 3 unabhängigen Kanälen (RGB-Farbwechsel)auf Basis eines 90S2313 zu realisieren: Clock= 3,6 Mhz /PWM Frequenz=1,8 KHz . Das PWM-Signal wird über einen Timer im Sekundentakt verändert (auf-/abdimmen). Aber leider flackerts gelegentlich ein wenig. Ich vermute, es liegt am sekündlichen inkrementieren, das dann zu viel Zeit in anspruch nimmt. Hat hier jemand einen Tip? Gibt`s bei dem angesprochenen ATMega eine fertige Lösung dafür, oder muss man`s immer zu Fuß machen? Danke für die Hilfe! Gruß 2Bob
Vorschlag: Man hat 3 Bytes als Register oder SRAM (eines pro PWM-Kanal), in die man die Werte einschreibt, die proportional zur Helligkeit sind, also 255 voll an und 0 aus. Jetzt baut man sich einen Timer, der mit meinetwegen 100 kHz läuft. Dieser Timer löst einen Interrupt aus, in der ISR wird ein 8-Bit Software-Vergleichs-Zähler hochgezählt und mit den o.g. Werten verglichen. Je nach Vergleich wird der betreffende Portpin des jeweiligen PWM-Kanals auf 1 oder 0 geschaltet. Ein 2. Timer, der im Sekundentakt läuft (oder ein vom ersten Timer heruntergeteilter Software-Zähler) übernimmt dann immer nur dann, wenn der 8-Bit-Vergleichs-Zähler gerade 0 geworden ist, die neuen Werte in die Speicher-Register. Auf diese Weise laufen alle PWMs unabhängig nebeneinander (mit der gleichen Frequenz), können unteschiedliche Helligkeiten fahren und werden immer zeitsynchron übernommen, um eben Flackern (Glitches) zu vermeiden.
RGB-PWM, die vielleicht nicht unbedingt mit den "älteren" AVR geht: 8-Bit-Timer im CTC laufen lassen (wobei CTC auf jeden Fall mit 16bit-Timern geht [hab mir die 8bit Timer noch nicht näher angeguckt]). Man schreibt den jeweiligen Wert in das OCR, schaltet den jeweiligen Pin ein und wartet auf das OCR-Interrupt. In dessen ISR schreibt man dann den Wert für die nächste Farbe ins OCR, und das reihum. Durch die Trägheit des Auges müsste es zum gewünschten Effekt kommen. Für die Sekunden hätte man dann noch gewisse andere Möglichkeite, wobei sich einer der restlichen Timer quasi aufdrängt.
@ Rahul: CTC geht bei der Mega-Serie mit allen Timern, damit verkleistert man sich aber das Hardware-PWM und sämtliche Timer. Der OCR-Vergleich wird dabei übrigens IMMER ohne Glitch ausfgeführt, weil komplett in Hardware gegossen und synchronisiert. Somit erspart man sich das Updaten in der ISR, kann man jederzeit machen.
Wenn es darum geht, NUR eine LED in unterschiedlichen Farben leuchten zu lassen, ist der Kleister ja egal. Für den Ablauf würde ich halt die ISR nehmen und da das OCR aktualisieren und den Pin umschalten. Man im Main auch die Sachen vorbereiten. 1-2 Timer hat man ja noch über...
Jojo - geht alles irgendwie. Ich gucke immer, daß ich mit den Routinen so universell wie möglich bleibe und nicht mehr "verbaue", als ich wirklich brauche. So kann man später Programmteile auf verschiedene Prozis in verschidene Programme einfügen und hat dann schon eine gewisse Struktur und noch Platz für andere Faxen. Für ´ne Leuchte, die maximal mit 200Hz für ein ruhiges Bild getaktet werden muß, verkloppe ich ungerne Hardware-PWMs, die ich für schnelle und saubere Spannungssysnthese beispielsweise brauche - aber ist ja wurscht... Jeder macht´s anders ;-).
Danke für den Tipp! Jetzt funktionierts wunderbar! Das mit den 3 Registern als Zähler-Vergleich hat ich auch so, jedoch hab ich in der ISR des Timers nur alle Ports auf 1 gesetzt und im "laufenden" Programm die 3 Zählerwerte auf das TCNT0-Register verglichen um dann die Ports wieder auf 0 zu steuern. Da ich aber momentan außer des Vergleichs nichts anderes in der Schleife mache, versteh ich aber nicht wirklich warum das Timing nicht klappte. Die Schleife müsste doch (meiner Meinung nach ;-)) in der Zeit zwischen 2 ISR etliche male durchlaufen werden, was für eine ausreichende Auflösung der PWM reichen müßte(?). Oder liegt`s dann tatsächlich an der sekündlichen ISR des Timers1, der das inkrementieren macht? Gruß und schöne Feiertage!
Das weiß ich nicht. Auf jeden Fall ist der Prozi schnell genug, sämtliche Aktualisierungen innerhalb einer ISR zu machen, ohne daß Dir das auffallen würde, wenn Du in derselben ISR auch die PWM-Zähler aktualisierst. Nur wenn Du per Prozessorhauptschleife Dein PWM machst und mit einer ISR dazwischenspringst, kommt Dein Timing durcheinander, weil die Hauptschleife dann sehr schnell ist und die ISR dazwischenfunkt und sämtliche Register mehrfach überfahren werden können. Dann kommt´s zu dem merkwürdigen Flackern. Deshalb: zeitkritische Sachen immer durch eine Timer-ISR laufen lassen und zeitunkritische Sachen in freilaufende Schleifen packen, die ruhig auch mal unterbrochen werden dürfen. Und nicht vergessen, in ISR und Main doppelt genutzte Register am Anfang der ISR zu sichern und am Ende wieder zu restaurieren (insbesondere Statusregister).
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.