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.