LBotics.at

Sechs der vierzehn I/O PINs (D3, D5, D6, D9, D10, D11) können so verwendet werden, dass an ihnen ein PWM-Signal generiert wird. Dieses kann zum Beispiel dazu dienen um eine LED zu dimmen oder einen Motortreiber anzusteuern und damit die Geschwindigkeit eines Motors zu regeln.

Dazu wird die Funktion analogWrite() bereitgestellt. Die Namensgebung dieser Funktion ist nicht ganz optimal gewählt, da an einem Pin des Arduino Boards keine unterschiedlichen analogen Spannungen erzeugt werden können. Mit dieser Funktion wird die Breite eines Pulses bei einem gepulsten Signal festgelegt bei dem die Spannung aber immer 5V beträgt.

Dimmen einer LED mit Pulsweitenmodulation

Bei einer LED lässt sich die Helligkeit nicht wie bei einer Glühbirne durch das Regeln der Spannung von 0V bis zur maximalen Betriebsspannung ändern. Dennoch gibt es die Möglichkeit mit Hilfe der Pulsweitenmodulation PWM eine LED unterschiedlich hell leuchten zu lassen - zumindest haben wir den Eindruck. An der LED wird ein gepulstes Spannungssignal wie in der Abbildung angelegt.

Die LED wird also laufend aus- und eingeschaltet. Die Länge der Einschaltdauer, die als Pulsbreite oder duty cycle bezeichnet wird, lässt sich steuern. Dabei nehmen wir unterschiedliche Helligkeiten wahr, da unser Sehorgan das eigentliche, sehr schnelle Flackern der LED nicht auflösen kann.

Aufbau und Material
  • 1 LED
  • 1 Widerstand 220Ω

Programmierbeispiel

Mit dem folgenden Programm wird die LED kontinuierlich heller und dunkler. Dazu wird mit der Funktion writeAnalog() an PIN 3 ein PWM Signal erzeugt. Mit dieser Funktion wird die Länge der Pulsweite festgelegt, über welche die Helligkeit der LED gesteuert wird.

In der Variable Helligkeit wird die aktuelle Pulsbreite abgelegt, diese kann zwischen 0 und 255 liegen. Bei jeder Wiederholung der Funktion loop() wird der Wert 5 dazugezählt. Erreicht der Wert der Variable Helligkeit den Wert 255, so wird die Variable WertAenderung mit -1 multipliziert, wird also zu -5. In der Folge wird von 255 bei jeder Wiederholung der Funktion loop() 5 abgezogen bis die Variable Helligkeit den Wert 0 erreicht. Dann ändert sich der Wert der Variable WertAenderung wieder zu +5 und der gesamte Vorgang beginnt von vorne.

int Helligkeit = 0;                              // Definition der Variable Helligkeit und zuweisen des Werts 0
int WertAenderung = 5; // Definition der Variable WertAenderung und zuweisen des Werts 5
void setup()
{
pinMode(3, OUTPUT); // Pin 3 als digitaler Ausgang
}
void loop()
{
analogWrite(3, Helligkeit); // setzen der Pulsweite Pin 3 auf den Wert der Variable Helligkeit
Helligkeit = Helligkeit + WertAenderung; // zum Wert der Variable Helligkeit wird der Wert der Variable WertAenderung addiert
if ((Helligkeit == 0) || (Helligkeit == 255))  // Überprüfung ob der Wert der Variable Helligkeit den minmalen oder maximalen Wert erreicht hat
{
WertAenderung = - WertAenderung; // der Wert der Variable WertAenderung wird mit -1 multipliziert
}
delay(50); // warten für 50 Millisekunden
}
Erklärungen zu diesem Programmierbeispiel

pinMode(pin, mode)

Mit dieser Funktion wird das Verhalten eines der 14 I/O PINs festgelegt.

pin: 0, ..., 13

mode: OUTPUT, INPUT, INPUT_PULLUP

analogWrite(pin, dutycycle)

Mit dieser Funktion kann an einem digitalen Ausgang ein PWM-Signal erzeugt werden. Die Pulsbreite wird beim Aufruf der Funktion mit dem zweiten Parameter duty cycle festgelegt, dem Werte zwischen 0 und 255 übergebenwerden können, was eine Pulsbreite von 0% bis 100% entspricht.

pin: 3, 5, 6, 9, 10, 11

dutycycle: 0,..., 255

if ((Helligkeit == 0) || (Helligkeit == 255)) { ... }

Mit dieser if-Abfrage wird überprüft, ob der Wert der Variable Helligkeit 0 oder 255 ist. In beiden Fällen wird dann der Wert der Variable WertAenderung mit -1 multipliziert: aus +5 wird also -5 und aus -5 wird +5. Dies führt dazu, dass beim Erreichen des Werts 255 wieder begonnen wird hinunterzuzählen und beim Erreichen des Werts 0 begonnen wird hinaufzuzählen. Dieser Vorgang und damit das Heller- und Dunklerwerden der LED wiederholt sich, solange das Programm läuft.

delay(value)

Soll der Programmablauf an einer Stelle unterbrochen werden, so wird die Funktion delay() aufgerufen.

value: ganzzahliger Wert (Wartezeit in Millisekunden)