Grundlagen der Pulsweitenmodulation (PWM):

Der ATmega8 verfügt insgesamt über 3 PWM – Kanäle.
PB3 - - > OC2 (Kanal für PWM)
PB2 - - > OC1B (Kanal für PWM)
PB1 - - > OC1A (Kanal für PWM)
Da der ATmega diverse PWM-Modi (12 Stück) zur Verfügung stellt, werde ich hier nur auf eine geringe Auswahl eingehen.
Im folgenden werde ich den Phase Correct PWM Mode erläutern. Dieser kann dazu verwendet werden, die Drehzahl eines DC-Motors zu steuern oder beispielsweise das Dimmen einer LED zu realisieren. Schaltet man dem PWM-Ausgang noch einen Tiefpass bestehend aus Widerstand und Kondensator nach, so kann man ihn auch als DA-Wandler benutzen. Es ist möglich, Spannungen zwischen 0V und Vcc zu erzeugen.
Zunächst ist es erforderlich, die entsprechenden PINS, welche man als Ausgang für die PWM verwenden möchte, auch als solche zu deklarieren, indem man die entsprechenden Bits im Datenrichtungs-Register (DDRB) setzt. Nun gilt es, die beiden vorhandenen Timer/Counter-Control-Register (TCCR1A und TCCR1B) entsprechend der jeweiligen Aufgabenstellung zu modifizieren.

TCCR1A:

TCCR1B:

Die doppelt gepufferten Output-Compare-Register OC1A/OC1B werden nun ständig mit den Timer/Counter-Werten verglichen. Das Ergebnis dieses Vergleichs kann zur Erzeugung eines PWM-Signales oder eines Signals mit variabler Frequenz genutzt werden. Hierzu muss nur ein entsprechender Wert in die Register geschrieben werden, welcher dann direkten Einfluss auf des Tastverhältnis hat.
Bei einem Compare-Match ist das Auslösen eines Interrupts möglich.

Die folgende Skizze veranschaulicht den auch im Beispielprogramm verwendeten Modus. Der Zähler zählt ständig von 0 bis zum Maximum und wieder zurück. Stimmt der momentane Zählerstand mit einem zuvor festgelegten Zahlenwert überein, so erfolgt am Ausgangs-Pin ein Potentialwechsel (Low -> High; High -> Low). Die Frequenz, also die Geschwindigkeit mit welcher der Controller zählt, wird über den einstellbaren Prescaler festgelegt.

Wie das ganze zu programmieren ist, kann man unter Programme erfahren.

Eine weitere Möglichkeit zur Erzeugung einer PWM ist die Verwendung der Fast-PWM. Bei dieser zählt der Counter nur noch aufwärts und beginnt nach Erreichen der oberen Grenze wieder bei Null.
Die Frequenz der PWM kann man zusätzlich innerhalb großer Bereiche skalieren, indem man die obere Grenze variiert. Für solche Finessen ist allerdings nur noch der Timer1 ausgelegt. Diesen hier zu erklären erübrigt sich. Ein Blick auf die Rubrik Projekte zeigt beispielsweise beim Thema Ultraschall, wie so etwas zu implementieren ist.

 

Zurück zur Startseite.