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.