Blog

Software-PWM mit AVR

In diesem Artikel soll eine einfache Lösung für die Realisierung einer Software-Puls-Weiten-Modulation (PWM) vorgestellt werden. Als Hardware-Board wird ein Arduino Uno Board verwendet, als IDE kommt das Atmel AVR Studio 6 in Kombination mit einem AVR ISP mkII zum Einsatz. Der Quellcode der zu diesem Artikel gehörenden Dateien kann unter https://github.com/lxrobotics/miscellaneous (Verzeichnis software_pwm).

Für die Realisierung der PWM wird die Compare Match Funktionalität des Timers 1 herangezogen. Bei der Compare Match Funktionalität wird der Wert eines speziellen Registers (in diesem Fall das Output Compare Register 1 A = OCR1A) mit dem aktuellen Wert des Timers 1 verglichen. Ist der Wert in OCR1A gleich dem Wert in TCNT1 (Zählregister von Timer 1) so wird der Interrupt TIMER1_COMPA_vect ausgelöst. Dieser Sachverhalt ist in nachfolgender Abbildung dargestellt:

software_pwm_ocr_fixed

Aus der Abbildung ist ersichtlich, dass der zeitliche Abstand zwischen den Aufrufen der Interrupt Service Routine immer konstant ist. Verändert man den Wert von OCR1A, so kann ein PWM-Signal mit veränderlichem Duty-Cycle durch das Setzen bzw. Nicht-Setzen eines Pins in der ISR erzeugt werden:

software_pwm_ocr_variable

Dieses Prinzip macht sich der nachfolgend dargestellte Beispielcode zunutze und lässt die LED auf dem Arduino Board im Verhältnis 500 ms eingeschalten zu 250 ms augeschalten (also 2 : 1) blinken. Die Konstanten, welche zum aktuellen Wert des OCR1A Registers dazuaddiert werden müssen, berechnen sich wie folgt:

Code:

0
  Related Posts