Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Pulsweiten-Modulation (PWM) - Teil 1

Weitere Informationen zur PWM findet man auch unter:

Impulsmodulationsverfahren

 

Es gibt eine Reihe von Verfahren, mit deren Hilfe analoge Signale als Impulse gesendet werden können; dazu gehören unter anderen:

  • Pulsamplituden-Modulation (PAM -> pulse-amplitude-modulation)
  • Pulsweiten-Modulation (PWM -> pulse-width-modulation)
  • Pulscode-Modulation (PCM -> pulse-code-modulation)

Ich werde mich in diesem Abschnitt nur mit der Pulsweiten-Modulation beschäftigen, bei der die Impulsbreite bei konstanter Amplitude proportional zur aktuellen Signalamplitude ist.

 

Mit Hilfe eines Mikrocontrollers lässt sich die PWM relativ einfach umsetzen. Mikrocontroller wie zum Beispiel ein Arduino oder ESP haben nur digitale Ausgänge. Das heißt, die Spannung am Ausgang ist entweder 0 V oder 5 V bzw. 3,3 V (je nach verwendetem Board); eine dort angeschlossene LED wird entweder hell leuchten oder gar nicht leuchten. Zwischenwerte gibt es nicht.

 

Wird der Ausgang schnell hintereinander gleich lang ein- und ausgeschaltet (Rechteckspannung), liegt der Mittelwert der Ausgangsspannung nicht mehr bei UBetrieb, sondern nur noch bei ca. UBetrieb/2 Volt, mit der Folge: die LED wird schwächer leuchten (Dimm Effekt). Dabei sollte die Frequenz der Rechteckspannung so hoch sein, dass ein Flackern oder Flimmern der LED nicht mehr beobachtbar ist.

 

Dies lässt sich in einem ersten einfachen Experiment zeigen.

Übung 1 - Helligkeit einer LED verändern - PWM Teil 1

 

Material

  • 1x ESP8266 D1 mini o.ä.
  • 1x LED
  • 1x Widerstand, 220 Ohm
  • 1x Oszilloskop (PicoScope 2000 Series)
  • diverser Steckdraht (M-M)

 

Das Programm

 

/*****************************************
Einstieg in die PWM mit einem ESP8266l D1 mini

******************************************/
const int ledPin =  D0;      // LED -> D0

void setup() {  pinMode(ledPin, OUTPUT);
}

 

void loop() {
  digitalWrite(ledPin, HIGH);;
  delay(1);
  digitalWrite(ledPin, LOW);;
  delay(9);
}

Wie arbeitet das Programm?

Die LED ist mit D0 verbunden. Im Setup() wird D0 als Ausgang deklariert.

In der Loop-Schleife wird D0 für 1 ms über die Funktion digitalWrite() auf HIGH (LED an) und für 9 ms auf LOW (LED aus) gesetzt; dies geschieht mit einer Frequenz f = 100 Hz. (s. Abb. 1a).

 

 

Abb. 1a

Periodendauer: 10 ms,  Frequenz: 100 Hz.

Zustand HIGH: 1 ms,  Zustand LOW: 9 ms.

Der Quotient aus Periodendauer zu Einschaltzeit wird als Tastverhältnis bezeichnet und als Prozentwert angegeben..

Tastverhältnis: 10 %.

 

Ändert man in einem zweiten Durchgang die beiden delay-Werte im Programm auf 5 ab (Tastverhältnis: 50%), ergibt sich die folgende Darstellung (s. Abb. 1b):

 

 

 

 

 

 

 

 

 

Abb. 1b

Periodendauer: 10 ms.

Zustand HIGH: 5 ms,  Zustand LOW: 5 ms.

 

Tastverhältnis: 50 %.

 

Abb. 1c zeigt den Kurvenverlauf bei einem Tastverhältnis von 90%.

 

 

 

 

 

 

 

Abb. 1c

Periodendauer: 10 ms.

Zustand HIGH: 9 ms,  Zustand LOW: 1 ms.

 

Tastverhältnis: 90 %.

 

Das Ergebnis: Je höher das Tastverhältnis ist, desto heller leuchtet die LED.

 

Will man die Frequenz der Rechteckschwingung von 100 Hz auf 200 Hz erhöhen und damit das leichte Flackern der LED verringern, dann müssen die delay-Werte im Programm angepasst werden (s. Abb. 1d).

 

 

 

 

 

 

Abb. 1d

Periodendauer: 5 ms.

Zustand HIGH: 1 ms Zustand LOW: 4 ms.

 

Tastverhältnis: 5 %.

 

Fazit

 

Wir haben gesehen, dass sich mit einem digitalen Ausgang eine LED durchaus in ihrer Helligkeit verändern lässt; dazu muss nur die Pulsdauer/Pulsweite und ggf. die Frequenz an das jeweils vorliegende Problem angepasst werden. Häufige Anwendungen des Verfahrens aus Übung 1 (man nennt es auch Pulsweiten-Modulation oder kurz PWM) sind:

  • Dimmen von LEDs
  • Audiosignale erzeugen
  • Geschwindigkeit von Gleichstrommotoren verändern
  • Signalmodulierung von IR-LEDs bei Fernbedienungen

Das Programm aus Übung 1 ist aus Darstellungsgründen sehr einfach gehalten.

PWM-Pins benutzen

 

Ein Blick in das Datenblatt eines ESP8266 zeigt, das bei diesem Modul alle digitalen Ausgänge auch sogenannte PWM-Ausgänge sind. Sie lassen sich mit der Funktion

  • analogWrite()

in der folgenden Form ansprechen:

  • analogWrite(pinPWM, DutyCycle)

 

Dabei bedeuten: pinPWM  - verwendeter PWM-Pin, DutyCycle - Tastverhältnis.

DutyCycle kann Werte zwischen 0 und 255 annehmen. Das schauen wir uns jetzt in der nachfolgenden Übung 2 an.

Übung 2 - Helligkeit einer LED verändern - PWM - Teil 2

 

Material

  • 1x ESP8266 D1 mini o.ä.
  • 1x LED
  • 1x Widerstand, 220 Ohm
  • 1x Oszilloskop (PicoScope 2000 Series)
  • diverser Steckdraht (M-M)

 

Das Programm

 

/*****************************************
Einstieg in die PWM mit einem ESP8266l D1 mini

******************************************/
const int ledPin =  D0;      // LED -> D0

void setup() {  pinMode(ledPin, OUTPUT);
}

 

void loop() {
  analogWrite(ledPin, 25); // DutyCycle ca. 9,7%
}

Wie arbeitet das Programm?

Die LED ist mit D0 verbunden. Im Setup() wird D0 als Ausgang deklariert.

In der Loop-Schleife wird D0 über die Funktion analogWrite() mit einem DutyCycle von 9,7% auf HIGH und für 90,3% auf LOW gesetzt; dies geschieht mit einer zunächst unbekannten Frequenz.

Die Überprüfung mit einem Oszilloskop ergibt eine Periodendauer T von 1ms bzw. Frequenz f von 1 kHz; das ist der Wert, der auch im Datenblatt eines ESP8266 in der Voreinstellung zu finden ist (s. Abb. 2).

 

 

 

 

 

 

 

 

Abb. 2

PWM Signal am ESP8266:

Periodendauer: 1 ms

Frequenz: 1 kHz

Dutycycle: 9,7 %

 

Die Funktion

  • analogWriteFreq()

erlaubt auch das setzen einer Frequenz. In welchem Bereich das möglich ist, kann dem Datenblatt des jeweilig benutzen Boards entnommen werden. In Übung 3 wird diese Funktion angewendet und mit einem Oszilloskop überprüft.

 

 

Übung 3 - Helligkeit einer LED verändern - PWM - Teil 3

 

Material

  • 1x ESP8266 D1 mini o.ä.
  • 1x LED
  • 1x Widerstand, 220 Ohm
  • 1x Oszilloskop (PicoScope 2000 Series)
  • diverser Steckdraht (M-M)

 

Das Programm

 

/*****************************************
Einstieg in die PWM mit einem ESP8266l D1 mini

******************************************/
const int ledPin =  D0;      // LED -> D0

void setup() {  pinMode(ledPin, OUTPUT);
}

 

void loop() {

  analogWriteFreq(1300);
  analogWrite(ledPin, 100); // DutyCycle ca. 39%
}

 

 

 

 

 

Abb. 3

PWM Signal am ESP8266:

Periodendauer: 0,769 ms

Frequenz: 1,3 kHz

Dutycycle: 39 %

 

Die Funktion

  • analogWriteResolution()

erlaubt auch das setzen des Tastverhältnisses (dutycycle). In welchem Bereich das möglich ist, kann dem Datenblatt des jeweilig benutzen Boards entnommen werden, das Aufschluss darüber gibt, welcher Timer für den jeweiligen PWM-Pin verantwortlich ist und welche Auflösung dieser hat (z.B. 8-, 10- oder 12-Bit).

In Übung 4 wird diese Funktion angewendet und mit einem Oszilloskop das Ergebnis überprüft.

 

 

Übung 4 - Helligkeit einer LED kontinuierlich verändern - PWM - Teil 4

 

Material

  • 1x ESP8266 D1 mini o.ä.
  • 1x LED
  • 1x Widerstand, 220 Ohm
  • 1x Oszilloskop (PicoScope 2000 Series)
  • diverser Steckdraht (M-M)

 

Das Programm

/*******************************************************
Einstieg in die PWM mit einem ESP8266
analogWriteFreq      : PWM Frequenz, hier 20 kHz
analogWriteResolution: 10 Bit  
Dutycycle            : 0% - 100% oder 0 - 1023
********************************************************/
const int ledPin =  D0;      // LED -> D0

void setup() {  
  pinMode(ledPin, OUTPUT);
  analogWriteFreq(20000);
  analogWriteResolution(10);
}

 

void loop() {
    for (int duty = 0; duty < 1023; duty++) {
        analogWrite(ledPin, duty);
        delay(2);
    }
}

250521

Druckversion | Sitemap
© Reinhard Rahner - Gettorf