Forum: Mikrocontroller und Digitale Elektronik Leider wieder einer der PWM nicht versteht


von Max (Gast)


Lesenswert?

Hallo! :-)

Ich will bald mal eine RGB-LED ansteuern und dazu brauche ich das 
besagte PWM. Im Grunde weiß ich wie es funktioniert, aber irgendwie doch 
nicht. :)
Ich fang einfach mal an! :-)

Nehmen wir an ich habe einen Mega8 mit einer Frequenz von 8Mhz. So jetzt 
mach ich einen PWM Timer CPU/256. Sprich hat mein Timer hat jetzt ca. 
3kHz. also würde er bei einem 8 Bit Timer 256*3k pro. Sek einmal 1 und 0 
machen? Und bei einem 16 Bit 65536*3k pro. Sek einmal 1 und 0 machen?

Damit kann man ja noch keine LED zum blinken bringen. Also müsste ich 
jetzt eine Software PWM mit Interrupts machen?! Doch wie würde die PWM 
bzw. der Code (möglichst C) aussehen, wenn die LED 1 Sek. an und 1 Sek. 
aus.

Sicherlich könnte man das mit delay machen, aber das würde mir später 
nicht weiterhelfen! :)

Ich will nämlich eine RGB LED (wie oben schon erwähnt) ansteuern. Und da 
geht ja rot, grün, blau bis 255. Also brauche ich eine PWM Routine, 
womit ich sowas machen kann. Zum Beispiel eine ausgedachte Farbe R:120 
G:234 B:255.

Ist das irgendwie verständlich?! :-) Ich hoffe es... Würde mich freuen, 
denn ich hab so eine ganz spezielles Geschenk für meine Freundin vor. 
;-)


Lieben Grüße
Max

von Kai G. (runtimeterror)


Lesenswert?

Ich geb die Fragen einfach mal zurück:
- Pulsweitenmodulation
- Soft-PWM
- AVR PWM

Ich denke mal, die Artikel hast du alle gelesen. Eigentlich sollten die 
alle deine Fragen beantworten. Wenn du einen konkreten Abschnitt nicht 
verstanden hast, können wir das gerne weiterdiskutieren.

Habe aber grade Langeweile:

>Nehmen wir an ich habe einen Mega8 mit einer Frequenz von 8Mhz.

Roger!

>So jetzt mach ich einen PWM Timer CPU/256. Sprich hat mein Timer hat jetzt ca. 
3kHz.

öhm... nö ;)
Die Timer/Counter-Frequenz liegt bei
8 MHz / 256 = 31,25 kHz
Komma lässt grüßen :)

>also würde er bei einem 8 Bit Timer 256*3k pro. Sek einmal 1 und 0 machen?

Ein Timer macht keine 1 oder 0 - ein Timer tickt vor sich hin. Der mit 
dem Timer assoziierte Counter wird bei dem von dir gewählten Teiler alle 
256 Takte um eins erhöht.
Der Counter erreicht irgendwann einen Grenzwert und fängt wieder am 
Anfang an. Das Limit für den Überlauf kann man einstellen (gibt ein paar 
vorgegebene Grenzen). Ein 8-Bits Timer kann maximal bis 255 zählen und 
springt dann auf 0 zurück. Bei einem 16-Bits-Timer liegt das Limit 
analog bei 65535. Auf das Ereignis des Überlaufs kann man mittels eines 
Interrupts reagieren.

Bei deiner oben genannten Timer-Frequenz läuft ein 8 Bits Timer
31,25 kHz / 256 ~= 122 Hz
122 mal pro Sekunde über - das ist deine PWM-Frequenz, mit der die LED 
flimmert. 122 Hz sind als untere Grenze ok, solange sich die LED nicht 
relativ zum Betrachter bewegt.

Immer wenn der Zähler auf 0 zurückspringt wird nun die LED 
eingeschaltet. Je heller sie sein soll, desto länger muss sie an 
bleiben. Nehmen wir eine Helligkeit von 210 (0..256) als Beispiel: Der 
Counter wird durch den Timer kontinuierlich erhöht. Nach jeder Erhöhung 
wird der Counter mit der Soll-Helligkeit verglichen. Sobald er den Wert 
überschritten hat, wird die LED ausgeschaltet. Den relativen Anteil, den 
die AN-Phase an einem Intervall hat nennt man Duty-Cycle. In unserem 
Beispiel
210 / 256 = 0,8203125 ~= 82%
Bleibt die LED die ganze Zeit an (256 von 256), so hat die die maximale 
Helligkeit mit einem Duty-Cycle von 100%

Diesen kontinuierlichen Vergleich mit dem Counter muss man nicht manuell 
machen. Der ATMega8 hat drei getrennt voneinander einstellbare 
Vergleichswerte, die beim Überschreiten automatisch einen Interrupt 
auslösen können. Auf den kann man dann entsprechend reagieren.

Oder man lässt dem ATMega8 direkt die gesamte Arbeit machen und lässt 
sich das fertige Vergleichsergebnis an den drei dafür vorgesehenen I/Os 
ausgeben und klemmt die drei LEDs dran - fertig.

Der Controller muss nach der Initialisierung dann nichts mehr weiter tun 
als die Vergleichswerte zu ändern, wenn die Farbe geändert werden soll.

So, der Rest ist Hausaufgabe.

von Max (Gast)


Lesenswert?

Ok hab ich also doch nicht so falsch verstanden. Nur dämlich 
ausgedrückt. Es sei mir verziehen, da es schons ehr spät war. :-) Ja die 
Beiträge habe ich,oben gelesen. Und scheinbar auch so ungefähr 
verstanden. Ok bei dem 0 und 1 habe ich mich vielleicht falsch 
ausgedrückt was ich meine! ;-) Aber deine Antwort hat mir gezeigt, dass 
meine damaligen Gym Lehrer doch recht hatte. "Mein Ausdruck" :-D

>Counter wird durch den Timer kontinuierlich erhöht. Nach jeder Erhöhung
>wird der Counter mit der Soll-Helligkeit verglichen.

Ok den Teil habe ich verstanden (jipi). Das wäre ja jetzt bei 120 Hz. 
Das kann ich ja, wie du schon sagst wunderbar für die RGB LED nehmen. 
Für mein Beispiel kann ich die LED also maximal bei einer Frequenz von 
31.25kHz betreiben?! Wenn ja könnte ich doch gleich den Counter vom 
Timer selber nehmen. TCNT0?! Was wäre ein Grund, diese Frequenz 
eventuell nicht zu nehmen?! Trägheit der Diode bei fließenden 
Farbüberläufen!? Hmm...

Ansonsten dickes Dankeschön Kai! :-)

Gruß Max

von Kai G. (runtimeterror)


Lesenswert?

Kein Problem.

>Für mein Beispiel kann ich die LED also maximal bei einer Frequenz von
>31.25kHz betreiben?!

Ja, wenn du einen Teiler von 1 statt 256 nimmst.

>Wenn ja könnte ich doch gleich den Counter vom Timer selber nehmen. TCNT0?!

Solltest du immer machen, bzw. dem Controller den Vergleich mit dem 
Register überlassen. Auch wenn du einen anderen Teiler als 1 nimmst 
solltest du das machen.

>Was wäre ein Grund, diese Frequenz eventuell nicht zu nehmen?!
Welche? 122 Hz oder 31,25 kHz?

122 Hz ist evtl zu langsam, wenn die Person "mit den Augen darüber 
fliegt" oder wenn sich die LED bewegt.

Bei 31,25 kHz bist zu u.U. am Senden! Außerdem erhöhen sich die 
Schaltverluste und nicht jede Schaltung/Treiber kommen mit der Frequenz 
klar.

Mit einem Teiler von 64 fährst du wahrscheinlich ganz gut:
8000000 Hz  64  256 ~= 500 Hz
Das sollte sich auch mit Digicams noch ganz gut abfilmen lassen, oder 
dass das Bild aufgrund von Interferenz flimmert - keine Gewähr ;)

>Trägheit der Diode bei fließenden Farbüberläufen!? Hmm...
"Farbüberläufe" sind ja nichts anderes als Farbänderungen pro Sekunde. 
Da begnügt sich das menschliche Auge mit 15 Hz bis 30 Hz (Vergleiche 
Fernsehbild, Framerate beim Zocken) - das hat aufgrund der anderen 
Größenordnung nichts mehr mit der PWM-Frequenz zu tun. Die Trägheit der 
LED spielt sich in ganz anderen Größenordnungen ab (im ps/ns-Bereich) 
und ist bei korrekter Beschaltung vernachlässigbar.

Noch was: beim ATmega8 musst du beide Timer verwenden um alles in 
Hardware zu machen. Timer 1 hat zwei programmierbare Vergleichswerte, 
Timer 2 hat einen.

Hoffe, das hilft dir weiter

Gruß

Kai

von Max (Gast)


Lesenswert?

Oha ja! :)

Morgen kommen die Sachen von Reichelt. Also das wird eine langes 
Wochenende mit wenig bis gar kein Schlaf! :-D Ich halt dich auf dem 
laufenden.

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.