Statistik

Besucher

Montag: -

Dienstag: -

Mittwoch: -

Donnerstag: -

Freitag: -

Samstag: -

Sonntag: -

Online: -

Knowhow - Intelligente Software-PWM

Knowhow

Intelligente Software-PWM

Eine Software-PWM für AVRs für bis zu 8 Kanäle auf einem Port oder mehr als 8 Kanäle auf mehreren Ports und geringer CPU-Auslastung. Damit lassen sich sehr schnell Projekte mit Leuchtspielereien aufziehen.

Beschreibung


Eine PWM (PulsWeitenModulation) ist ein Verfahren um elektrische Verbraucher in ihrer Leistung durch schnelle Ein- und Ausschaltvorgänge zu regeln. Das grundlegende Prinzip möchte ich hir mal nicht weiter erläutern, dazu habe ich folgende Links:

Wikipedia - Pulsweitenmodulation
RoboterNETZ - Pulsweitenmodulation


Warum Software-PWM?
Da es am AVR hardwaremäßig nur zwei..drei.., höchstens vier Hardware-PWM Kanäle gibt, diese zwar relativ hochfrequent betrieben werden können aber dies meistens nicht nötig ist, habe ich nach einer Möglichkeit gesucht das ganze per Software im AVR zu realisieren, und das bei relativ geringer CPU-Auslastung. Ein solches Verfahren wurde bereits in einem Artikel auf Mikrocontroller.net vorgestellt.

Mikrocontroller.net - Soft-PWM

Davon inspiriert wollte ich mir so etwas mal selbst schreiben, natürlich hätte ich auch die vorgefertigte Lösung verwenden und versuchen zu verstehen können aber da war mir der Lerneffekt zu gering. Herausgekommen ist eine Software-PWM die entweder auf einem einzigen Port oder auch auf mehreren Ports läuft. Es lassen sich massenweise PWM-Kanäle definieren und jedem davon einen eigenen Port und Portpin zuweisen. Die PWM-Frequenz liegt so zwischen 122 und 488Hz, je nachdem wie viele Takte die ISR benötigt damit sich nichts überschneidet.


Was bedeutet eigentlich 8-Bit PWM?
Bei der Erstellung der PWM bin ich auch auf eine Problematik gestoßen: Was bedeutet 8-bit PWM eigentlich? Gibt es einen Zustand bei dem der Kanal ganz aus oder ganz an ist? Eine 8-Bit Zahl umfasst 256 Zustände, also Zahlen von 0 bis 255. Die meisten PWM-Implementationen teilen das so auf, dass es von 0 bis 254 zunächst 255 Zustände als Helligkeitsabstufungen gibt und der Wert 255 (also der 256. Zustand) bedeutet, dass der Kanal "ganz an" ist. Der Wert 0 bedeutet also nicht, dass der Kanal da "ganz aus" ist sondern auf der niedrigsten PWM-Stufe. Manche machen es auch umgekehrt, 0 bedeutet "ganz aus", 1-255 sind dann Helligkeitsabstufungen wobei 255 eben nicht "ganz an" bedeutet sondern nur "fast ganz an", "ganz an" wäre dann der Wert 256, demnach der 257. Zustand. Da aber eine 8-bit PWM eben nur 256 Zustände umfasst geht das nicht. Man hat nun die Möglichkeit den Zustand "ganz an" oder "ganz aus" für jeden Kanal in einem extra-Bit zu speichern womit man für jeden Kanal 257 Zustände erreicht, oder man teilt den Wertebereich anders auf: 0 bedeutet dann "ganz aus", 1-254 sind Helligkeitsabstufungen und 255 bedeutet dann "ganz an". Das ist meines Erachtens die beste Lösung da sie alle Zustände enthält und trotzdem in 8-Bit Speicherstellen passt. Dies lässt sich am einfachsten bewerkstelligen indem man einen Timer mit Compare-Interrupt immer bis 254 anstatt bis 255 zählen lässt. PWM-Kanäle mit dem Wert 0 werden garnicht erst angeschaltet, PWM-Kanäle mit dem Wert 255 garnicht erst ausgeschaltet. Der eigentliche Wertebereich bei dem wirklich PWM stattfindet umfasst also nur 254 Zustände.




Programm


Hier sind die drei verschiedenen Versionen der Software-PWM, eine für einen Port, eine für zwei Ports und eine für drei. Um die PWM um einen weiteren Port zu erweitern bedarf es kaum mehr als ein wenig Copy&Paste an den entsprechenden Stellen. Alle laufen auf einem ATmega8 und lassen zur Demonstration eine Sinus-Welle auf mehreren LEDs laufen.

Es liegen jeweils zwei Versionen im selben Projekt vor. Bei einer Version wird der Zeigertausch durch die ISR iniziiert, bei der der sync-Version wird das Hauptprogramm während der pwm_update()-Funktion angehalten und wartet auf eine Synchronisation. Das hat in verschiedenen Fällen besser funktioniert und verhindert, dass öfter wie die PWM-Frequenz geupdated wird (und somit manche Updates verschluckt würden), hat allerdings auch den Nachteil, dass das Hauptprogramm die ganze Zeit auf die Synchronisation warten muss.

Download:
Soft-PWM für ATmega8




Video


Hier mal noch ein Video von der 3-Port Sinus Demo mit 22 LEDs. Taugt schon fast zu nem Deko-Effekt wenn mans entsprechend verpacken würde.

MyVideo:
Software-PWM Demo