Lokale Peripheriefunktionen

III. PWM (Pulse Width Modulator)

In diesem Tutorial wird gezeigt, wie mit den JControl-Geräten PWM-Signale generiert werden können. Dazu wird die Java-Klasse PWM vorgestellt.

Vorraussetzungen: Für dieses Tutorial wird eine Installation der JControl/IDE sowie ein JControl-Modul (SmartDisplay, Stamp, Sticker oder PLUI) benötigt.

Download: http://www.jcontrol.org/examples/PWMExample.zip Dieses Tutorial mit allen Quelltexten und Ressourcen als JControl/IDE-Projekt (ZIP-Archiv)



Die PWM-Kanäle

Neben der direkten Ansteuerung der GPIO-Kanäle über die Klasse GPIO ist es mit Hilfe der Klasse PWM möglich, für einige interne oder externe Pins der JControl-Module eine Puls-Weiten-Modulation zu programmieren. Diese Funktionalität wird beispielsweise von der Klasse Buzzer benutzt, um Töne zu generieren. Die Klasse Backlight setzt PWM ein, um die Helligkeit der Hintergrundbeleuchtung (z.B. des JControl/SmartDisplay-Moduls) zu regulieren. Welche Pins über PWM-Kanäle angesteuert werden können, hängt vom eingesetzten JControl-Modul ab und kann der API Dokumentation http://www.jcontrol.org/docs/api/jcontrol/io/GPIO.html von GPIO oder den Produkt-Datenblättern http://www.domologic.com/support/ch1/index_de.html entnommen werden.

Hinweis: Da die Prozessoren der JControl-Module lediglich einen Frequenzgenerator aufweisen, sind die folgenden zwei Punkte zu beachten:

Erzeugung eines Signals: Auf dem PWM-Ausgang 0 soll ein Rechtecksignal mit einer Frequenz von 2000Hz und gleichlangen High- und Low-Zyklen generiert werden. Der folgende Quelltext erledigt das unter Verwendung der Klasse PWM:

1    import jcontrol.io.PWM;
2    
3    /**
4     * This example demonstrates the usage of class <code>PWM</code>.
5     */
6    public class PWMExample {
7      /** PWM frequency */
8      int frequency = 2000;
9      /** PWM channel */
10      int  channel = 0;
11      /** PWM duty cycle */
12      int duty = 127;
13     
14      /**
15       * Set PWM frequency, duty cycle and turns the signal on.
16       */
17      public PWMExample() {
18        PWM.setFrequency(frequency);
19        PWM.setDuty(channel, duty);
20        PWM.setActive(channel, true);
21      }
22    
23      /**
24       * Main method. Program execution starts here.
25       */
26      public static void main(String args[]) {
27        new PWMExample();
28       
29        for (;;) {} // sleep
30      }
31    }
Listing 1: PWMExample.java

Durch einen Aufruf der PWM-Funktion setFrequency wird zunächst die gewünschte Frequenz (in Hertz) eingestellt. Die Methode setDuty bestimmt dann das Tastverhältnis mit einer Auflösung von 8 Bit und wird somit in einem Wertebereich von 0 bis 256 angegeben. 0 steht für das minimale Tastverhältnis (0%), und 256 für das maximale Tastverhältnis (100%). Der Wert 128 entspricht demnach einem Tastverhältnis von 50%. Anschließend wird im obenstehenden Listing der Puls-Weiten-Generator mit dem Aufruf der Methode setActive aktiviert.

Hinweis: Ein PWM-Ausgang liefert ein Rechtecksignal, dessen LOW-Potenzial eine Spannung von 0V aufweist und dessen HIGH-Potenzial gleich der Versorgungsspannung des JControl-Moduls ist.

Bild 1 zeigt das vom JControl-Modul ausgegebene Signal auf dem PWM-Kanal 0 nach Hochladen und Ausführen obigen Programms. Die Messwerte unseres Oszilloskopes zeigen, dass die generierte Frequenz exakt 2000Hz entspricht.

Bild 1: Oszilloskop-Aufnahme eines 2kHz PWM-Signals



Anpassen des Signalverlaufs

Verändern eines PWM-Signals: Das PWM-Signal soll nun dahingehend modifiziert werden, dass das Tastverhältnis nur ein Viertel der Periode einnimmt (25%). Wir passen den Parameter beim Aufruf der Methode setDuty entsprechend an:

11    /** PWM duty cycle */
12     short duty = 64;

Das folgende Bild 2 zeigt die Reaktion des PWM-Ausgangs auf diese Änderung. Wie erwartet ist der Low-Zyklus des Signals nun dreimal so lang wie der High-Zyklus. Die Frequenz dagegen wurde nicht beeinflusst.

Bild 2: PWM-Signal nach Änderung des duty cycle

Mit dem Puls-Weiten-Modulator läßt sich übrigens auf sehr einfache Weise ein Digital-Analog-Wandler realisieren: Durch einen nachgeschalteten Tiefpaß (bestehend aus einem Widerstand und einem Kondensator) wird das Ausgangssignal geglättet. Eine Veränderung des Tastverhältnisses würde sich dann direkt auf die Amplitude des analogen Ausgangssignals auswirken.

Um die aufgeführten Beispiele nachvollziehen zu können, genügt es, ein Projekt mit der JControl/IDE anzulegen und die Klasse PWMExample hinzuzufügen. Die genaue Lokalisation der PWM-Kanäle an Ihrem JControl-Modul können Sie dem zugehörigen Datenblatt http://www.domologic.com/support/ch1/index_de.html entnehmen.



Kontrolle von I/O-Signalen im Simulator

Abschließend soll gezeigt werden, wie durch JControl generierte Hardware-Signale mit dem (in der JControl/IDE integrierten) JControl-Simulator grafisch kontrolliert werden können. Erstellen Sie ein neues JControl/IDE-Projekt und fügen Sie das kompilierte PWMExample von oben dem Projekt hinzu. Klicken Sie dann auf den Button "Simulation starten". Nachdem sich der Simulator geöffnet hat, wählen Sie den Menüpunkt "Pin I/O" im Menü "Peripheriekomponenten". Es öffnet sich der in Bild 3 dargestellte Dialog:

Bild 3: Hardwaresignale im JControl-Simulator kontrollieren

Aktivieren Sie "PWM-Aktivität anzeigen" und bestätigen Sie die Auswahl mit "OK". Daraufhin öffnet sich der nachfolgend abgebildete "PWM Viewer", der für unser PWMExample die erwartete Frequenz von 2000Hz und eine Pulsweite von 128 anzeigt. Natürlich können neben dem "PWM Viewer" auch Anzeigeinstrumente für die GPIO-Kanäle sowie für die ADC-Aktivität aktiviert werden.

Bild 4: Der PWM Viewer des JControl-Simulators



© 2000-2006 DOMOLOGIC Home Automation GmbH. All Rights Reserved.