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 |
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)
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 | } |
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.
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.
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.
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:
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.