Hallo zusammen Ich würde gerne mit dem Atmega48 (Hardware ist gesetzt, da bereits vorhanden!) 3 Phasen PWM zur Dimmung von einer RGB Led erzeugen. Leider hat der Mega nur einen Counter mit 16bit und dieser hat nur 2 OutputCompares. 8bit PWM genügt mir leider nicht. 12bit wäre das minimum und 16bit wäre perfekt. In Software könnte man dies ja mittels Intterupt machen. PWM Frequenz: 100HZ = T = 10ms Bei 16bit 10ms/65535 = 0.000152ms = 152nS = 6.57MHz ist für einen Interrupt viiiel zu schnell! Bei 12bit 10ms/4096 = 0.00244ms = 2.44uS = 409kHz immer noch sehr schnell für einen Interrupt. Die eigentlichen PWM Werte (DutyCycle) werden in der Anwendung kontinuierlich angepasst. Die LED soll ständig ändernde Farbverläufe anzeigen. Wie würdet ihr dieses Problem lösen? Danke schonmal!
:
Bearbeitet durch User
Musst du sonst noch iwas anderes in Software machen, oder kannst du busy-spinnen ?
matrixstorm schrieb: > Musst du sonst noch iwas anderes in Software machen, oder kannst > du > busy-spinnen ? Es gibt noch einen HW-Int (INT0) welcher die Fernbedienungssignale (Infrarot) auswerten soll. Ansonsten nichts. Der Mega soll nur die LED ansteuern. Eventuell definierte Farbabläufe von einer Tabelle abarbeiten und R G und B mittels HUE berechnen.
:
Bearbeitet durch User
Holger K. schrieb: > Wie würdet ihr dieses Problem lösen? Mit binär gewichtetem PWM. Damit kommst du auf 8 parallel laufende Kanäle. Beitrag "AVR: Fast-PWM (BAM) 12 Bit für 8 Kanäle"
Holger K. schrieb: > Wie würdet ihr dieses Problem lösen? PDM:
1 | Wert |
2 | | |
3 | ,->--(+)-[Carry]---> PDM |
4 | | | |
5 | | Register |
6 | | | |
7 | '-----' |
Gruß Jobst
:
Bearbeitet durch User
Wenn genug 8-Bit PWM vorhanden sind, würd ich die nehmen und die Zwischenwerte über eine Umschaltung der PWM-Werte machen. Dann musst Du nur alle 256 Zyklen in den Intterrupt. Gegenüber der reinen 16-Bit PWM hast Du sogar noch den Vorteil, daß das z.B. 16 MHz / 65536 = 244 Hz Flimmern nur noch 1/256 der Helligkeit beträgt. Und wenn Du es noch glatter brauchst, berechnest Du die Software-Bits nach dem Delta-Sigma-Prinzip.
Holger K. schrieb: > Bei 16bit > 10ms/65535 = 0.000152ms = 152nS = 6.57MHz ist für einen Interrupt viiiel > zu schnell! > > Bei 12bit > 10ms/4096 = 0.00244ms = 2.44uS = 409kHz immer noch sehr schnell für > einen Interrupt. Ober, da du nur einen PWM-Kanal in Software machen musst, brauchst du nur 2 Interrupts pro Periode, eins fürs Ein- und das Andere fürs ausschalten und nich 2^16.
Timer 1 hat doch 2 Vergleichsregster und mit dem Tiner 2 sind 3 Kanäle vorhanden.
Schau dir mal an, wie das Zabex mit seiner Sofabeleuchtung gelöst hat: http://www.zabex.de/site/sofabeleuchtung.html
max2 schrieb: > t dem Tiner 2 sind 3 Kanäle > vorhanden. Timer2 ist nur 8bit Sonst hätte das gepasst ja!
Holger K. schrieb: > Ich würde gerne mit dem Atmega48 (Hardware ist gesetzt, da bereits > vorhanden!) 3 Phasen PWM zur Dimmung von einer RGB Led erzeugen. > Leider hat der Mega nur einen Counter mit 16bit und dieser hat nur 2 > OutputCompares. > 8bit PWM genügt mir leider nicht. > 12bit wäre das minimum und 16bit wäre perfekt. Für ein RGB-Moodlight reicht Soft-PWM mit ca. 12 Bit. Ca. deswegen, weil man sowieso keine lineare Auflösung braucht und die Dimmstufen besser gleich in exponentieller Abstufung auslegt. Wenn man noch mehr Auflösung braucht, dann BAM in Software. > Wie würdet ihr dieses Problem lösen? Hab schon: Beitrag "noch ein AVR Moodlight"
Wie oben schon erwähnt mit BAM und dann deutlich schneller als 100 Hz, denn die flimmern sehr deutlich, wenn sich Lichtquelle und/oder Betrachter bewegen.
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.