Für bestimmte Anwendung, wie zum Beispiel die Steuerung von Gleichstrommotoren über einen Motortreiber, werden häufig PWM-Signale benötigt. Sollen diese mit Mikroprozessoren erzeugt werden ist die Umsetzung meist relativ einfach, da direkt PWM-Ausgänge genutzt werden können und diese einfach zu programmieren sind. Wenn das erzeugende System (z.B. Foxboard G20 mit ARM9) mit einem Betriebssystem wie Linux versehen ist, dann ist die Umsetzung von PWM-Ausgängen meist aufwendiger. Viele Lösungen nutzen dann das GPIO-Interface und erzeugen das PWM-Signal über ein Programm im Userspace. Diese Technik wird auch als Bit-Banging bezeichnet, da hier jede Veränderung am Pin in Software realisiert werden muss. Damit kann allerdings das Timing nur unzureichend eingehalten werden und es sind auch nur geringe Träger-Frequenzen möglich.
Besser Ergebnisse erzielt man mit einem PWM-Treiber, der die Timer-Einheiten des ARM9-Prozessors, in diesem Fall des Atmel AT91SAM9G20 nutzt. Im vorliegenden Kernel-Modul für das Foxboard G20 wird ein zwei-kanaliger 12-Bit-PWM-Generator mit Trägerfrequenz um die 10 kHz prototypisch umgesetzt. PWM0 ist an J7 Pin 9 verfügbar, PWM1 liegt an J7 Pin 10 an. Für die Signalmasse kann jeder Massepin genutzt werden.
Zum Kompilieren des Moduls muss das richtige Verzeichnis mit den Kernelquellen (vorkonfiguriert und kompiliert) in make_modul.sh eingetragen werden, momentan ist der Quellcode für Kernel 2.6.31 angepasst und es wird ein Cross-Compiler genutzt. Nach dem Kompilieren kann das Kernel-Modul auf das Zielsystem aufgespielt werden, das Laden erfolgt mit insmod.
Das Setzen des Duty-Cycle kann dann mit
echo 2048 > /sys/devices/platform/atmel_pwm/pwm0
beziehungsweise
echo 2048 > /sys/devices/platform/atmel_pwm/pwm1
durchgeführt werden. Für den Duty-Cycle können Werte im Bereich 1-4096 genutzt werden, dies entspricht einem Duty-Cycle zwische 0% und 100%.
Der Quellcode für den Hardware-PWM-Treiber steht unter at91_g20_pwm.tar.gz zur Verfügung.









Kommentare