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