Forum: Mikrocontroller und Digitale Elektronik PWM mit AVR


von max (Gast)


Lesenswert?

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

von Jens D. (Gast)


Lesenswert?

software pwm ;)

gruss

von Slowflyer (Gast)


Lesenswert?

- 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)

von Borny (Gast)


Lesenswert?

wieso nicht einfach 4 Transistoren, an deren Basis du einfach den PWM
Ausgang legst?

von Heinz (Gast)


Lesenswert?

Für 12V Glühlampen brauchst du keine PWM. Da reicht es bei DC die
Spannung zu steuern oder bei AC eine Phasenanschnitts-Dimmer.

von Max (Gast)


Lesenswert?

Hallo Heinz,

wie würde das ohne PWM und mit einem AVR gehen??

Grüße MAx

von TravelRec. (Gast)


Lesenswert?

@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.

von Florian Labermeyer (Gast)


Lesenswert?

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

von TravelRec. (Gast)


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?

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.

von TravelRec. (Gast)


Lesenswert?

@ 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.

von Rahul (Gast)


Lesenswert?

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...

von TravelRec. (Gast)


Lesenswert?

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 ;-).

von Florian Labermeyer (Gast)


Lesenswert?

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!

von TravelRec. (Gast)


Lesenswert?

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