PWM - Pulsweitenmodulation

 

 

Funktionsschema PWM:

 

Bisher haben wir die Ausgänge des Atmega als Schalter benutzt um z.B. eine LED an- oder auszuschalten.

Um aber jetzt zum Beispiel eine LED anzusteuern, die unterschiedl. Farben abstrahlen kann (RGB-LED's), benötigen

wir unterschiedl. Ausgangsspannungen am jeweiligen PIN. Die bisher verwendeten Programmstrukturen sind für diesen

Anwendungsfall denkbar ungeeignet, weil wir wie gesagt einen Ausgang nur an- oder ausschalten können.

Wie kann man jetzt trotzdem eine andere Spannung als 5 oder 0 Volt am Ausgang erreichen ?

Die Antwort darauf ist die Pulsweitenmodulation.

 

Wenn wir einen Ausgang des Mikrocontrollers in schnellen Abständen ein- und ausschalten, erhalten wir eine Rechteckspannung.

 

 

 

Diese Rechteckspannung hat einen geometrischen Mittelwert. Durch eine Veränderung der Pulsbreite, können wir diesen geometrischen Mittelwert

verändern. Dieser Wert ist zwar keine Gleichspannung, trotzdem würde sich die Helligkeit einer LED bei versch. Pulsbreiten ändern.

Die LED leuchtet zwar für einen Bruchteil von einer Sekunde mit der vollen Helligkeit, aber dieses Flackern

wird von unserem Auge als heller oder dunkler interpretiert, je nach Größe der Pulsbreite.

 

 

 

 

 

Programmierung der PWM :

 

Die einfachste Methode zur Programmierung der PWM ist die Verwendung des 16-bit Timers. Dieser muss im PWM-Modus betrieben werden, wofür einige

spezielle Bits in den Registern des Timers gesetzt werden müssen.

 

 

In dem Register TCCR1A haben wir verschiedene Einstellmöglichkeiten, welche in nachfolgenden Tabellen dargestellt sind.

 
WGM11 WGM10 Bedeutung
0 0 PWM-Modus des Timers ist nicht aktiv.
0 1 8-Bit PWM.
1 0 9-Bit PWM.
1 1 10-Bit PWM.

 

COM1A1 COM1A0 Bedeutung
0 0 Keine Wirkung, Pin wird nicht geschaltet.
0 1 Keine Wirkung, Pin wird nicht geschaltet.
1 0 Nicht invertierende PWM.
Der Ausgangspin wird gelöscht beim Hochzählen und gesetzt beim Herunterzählen.
1 1 Invertierende PWM.
Der Ausgangspin wird gelöscht beim Herunterzählen und gesetzt beim Hochzählen.

 

Im später folgendem Beispielprogramm habe ich mich für die 8-Bit und invertierende PWM entschieden.

Der entsprechende Befehl im AVR-Studio würde demnach wie folgt aussehen:

 

    TCCR1A = 0b11000001
 

Es folgen noch Einstellungen in einem zweiten Register, dem TCCR1B.

 

 

Hier werden, wie wir es schon vom 8-bit Timer kennen nur Vorteiler gesetzt, um eine bestimmte Frequenz einzustellen.

Die Werte für den Vorteiler können aus folgender Tabelle entnommen werden:

 
CS12 CS11 CS10 Bedeutung
0 0 0 Stop. Der Timer/Counter wird gestoppt.
0 0 1 CK
0 1 0 CK / 8
0 1 1 CK / 64
1 0 0 CK / 256
1 0 1 CK / 1024
1 1 0 Externer Pin 1, negative Flanke
1 1 1 Externer Pin 1, positive Flanke

Wenn wir den Timer nun mit dem Vorteiler 1024 laufen lassen wollen, lautet der Befehl im AVR-Studio so:

 

    TCCR1B = 0b00000101;

 

Der 16-bit Timer beginnt nun zu zählen bis zur Obergrenze und wieder zurück.

 

Der 16-bit Timer im PWM-Modus zählt nun von 0 bis zur Obergrenze und wieder zurück. Die Obergrenze hängt davon ab, in welchem Modus der

Timer betrieben wird ( 8,9 oder 10 Bit ). Die Einstellung der Auflösung erfolgte ja schon im ersten Schritt ( TCCR1A = 0b11000001; )

Dieser Zusammenhang wird in folgender Tabelle noch einmal verdeutlicht:

 

Auflösung Obergrenze Frequenz
8 255 fTC1 / 510
9 511 fTC1 / 1022
10 1023 fTC1 / 2046

 

 

Als letzten Schritt müssen wir noch den Vergleichswert für den Timer setzen. Dies geschieht auch hier ähnlich wie beim 8-bit Timer:

 

    OCR1A = 200;     // 200 hier nur als Beispiel

 

Die Pulsbreite hängt nun von dem Vergleichswert ab. Wann der Puls ausgelöst wird und wie das mit dem Vergleichswert zusammenhängt, wird aus den

folgenden Grafiken deutlich:

 

 

Man kann erkennen, dass der Puls ausgelöst wird, wenn der Zähler den Vergleichswert übersteigt. Genauso wird der Puls wieder abgeschaltet, wenn der Zähler

den Vergleichswert unterschreitet. Je größer der Vergleichswert, desto kleiner der Puls.

 

 

 

 

Schematische Darstellung der Pulsweitenmodulation :

 

Die PWM als PAP:   hier klicken

 

 

 

 

Quelltext:

 

Einfache Umsetzung in den Quelltext wie oben beschrieben.    hier klicken

 

 

 

Erstes Projekt mit PWM:

 

 

Es soll eine der auf dem myAVR-Board befindlichen LED's gedimmt werden. Das Dimmen soll mit Hilfe eines Potentiometers geschehen.

Die Boardspannung von 5 V, soll mit Hilfe des AD-Wandlers in Zahlenwerte umgewandelt werden. Diese Zahlenwerte stellen nun den Vergleichswert

für das Register OCR1 dar. Somit wird die LED dem entsprechendem Zahlenwert in ihrer Helligkeit beeinflusst. Das Pulsieren der LED wird durch die Trägheit

des menschlichen Auges als heller oder dunkler interpretiert.

 

Programmablaufplan (PAP):    hier klicken

 

Quelltext:   hier klicken

 

komplettes AVR-Studio Projekt hier klicken

 

 

 

Quellen:  

Mikrocontrollerforum:       www.mikrocontroller.net

Internetseite der AT04:    www.info-rlp.de/lernteams/elektrotechnik/mikrocontroller/atmel/pwm_mit_atmel.html

(Autor: Christian Scholzen)