Die Pulsweitenmodulation

Die Pulsweitenmodulation (PWM) ist eine Methode zur Erzeugung eines analogen Signals mithilfe eines digitalen Ausgangs. Mit PWM kannst du die Intensität von LEDs steuern, Motoren betreiben und andere Geräte regeln.

Das Arduino-Board verfügt über mehrere PWM-fähige Pins, wie zum Beispiel Pin 9. Du kannst die Funktion "analogWrite()" verwenden, um PWM auf diesen Pins zu nutzen. Dabei wird ein digitales Signal erzeugt, das aus einer Abfolge von HIGH- und LOW-Impulsen besteht. Das Verhältnis von HIGH- zu LOW-Impulsen bestimmt die durchschnittliche Spannung und damit die Intensität des Signals.

Wir haben bereits verschiedene Arten von Pins kennengelernt, wie Digital Output, Digital Input und Analog Input. Eine weitere Art von Pin, die uns noch fehlt, ist der Analog Output. Hinter dem Begriff Analog Output verbirgt sich ein etwas komplexeres Konzept. Obwohl wir dieses Kapitel schnell abhandeln könnten, ist es wichtig, dein Verständnis für die Funktionsweise zu vertiefen, da es für den weiteren Verlauf relevant ist.

Der Arduino verwendet einen 10-Bit-Analog-Digital-Wandler (ADC), um analoge Spannungen in digitale Werte umzuwandeln. Dadurch kann der Arduino präzise Messungen vornehmen. Allerdings verfügt das Arduino Uno nicht über einen Digital-Analog-Wandler (DAC), um echte Spannungswerte zwischen 0 und 5 Volt zu erzeugen. Stattdessen verwendet es die Pulsweitenmodulation (PWM) als klugen Trick, um dennoch unterschiedliche (quasi) Spannungen zu erzeugen.

Du kannst den analogen OUTPUT beispielsweise verwenden, um die Helligkeit einer LED anzupassen oder Motoren schneller oder langsamer drehen zu lassen. Weitere Anwendungen umfassen das Generieren von Audiosignalen oder die Erzeugung von modulierten Signalen, wie sie beispielsweise bei Infrarot-Fernbedienungen benötigt werden.

Wenn du den OUTPUT eines "normalen" digitalen OUTPUTS mit dem eines analogen OUTPUTS vergleichst, wenn das Signal von LOW auf HIGH geschaltet wird, siehst du folgende Unterschiede:

Zu Beginn sind beide Signale auf LOW geschaltet. Eine interessante Situation tritt auf, wenn beide Pins auf HIGH geschaltet werden. Während die digitalWrite() Funktion ihren Zustand beibehält, erzeugt die analogWrite() Funktion kontinuierlich ein Rechtecksignal. Dieses Signal wird automatisch vom Arduino erzeugt und wechselt ständig zwischen Ein und Aus. Ein weiterer Vorteil besteht darin, dass dieses erzeugte Signal einstellbar ist. Lass uns nun die analogWrite() Funktion genauer betrachten.

Die Funktion "analogWrite()" unterstützt Pins 2-13, die auf anderen Arduino-Boards, wie dem Uno, mit einem Wellensymbol gekennzeichnet sind. Das erste Argument der Funktion ist die Pinnummer, während das zweite Argument das Tastverhältnis beschreibt, das die unterschiedlichen Spannungen erzeugt. Der Wertebereich für das Tastverhältnis liegt von 0 bis 255, was insgesamt 256 Werte ergibt. Ein Wert von 0 entspricht 0 Volt, während der Höchstwert von 255 eine Spannung von 5 Volt erzeugt.

Im Vergleich zum 10-Bit-Analogeingang hat die analogWrite() Funktion eine etwas niedrigere Auflösung von 8 Bit. Dies bedeutet, dass du zwischen 0 und 5 Volt 256 Schritte erzeugen kannst. Jeder Schritt entspricht dabei etwa 0,02 Volt (5 Volt / 256).

Die Pulsweitenmodulation ist eine äußerst nützliche Technik, um analoge Signale mithilfe eines digitalen Ausgangs zu erzeugen. Du kannst damit die Kontrolle über verschiedene Komponenten und Geräte übernehmen und kreative Projekte entwickeln.

Grundprinzip der Pulseweitenmodulation

Das Grundprinzip der Pulsweitenmodulation (PWM) besteht darin, dass ein Muster aus sich kontinuierlich wiederholenden HIGH- und LOW-Signalen erzeugt wird. Dieses Muster erzeugt eine Art Schwingverhalten oder Frequenz. Die Frequenz ist eine physikalische Größe, die in Hertz (Hz) gemessen wird. Sie gibt an, wie oft ein Zustand pro Sekunde wechselt. Sowohl analoge als auch digitale Signale können unterschiedliche Frequenzen aufweisen.

Ein Hertz (Hz) gibt an, wie viele Wechsel zwischen HIGH- und LOW-Signalen pro Sekunde stattfinden. Wenn wir von einer Frequenz von 3 Hz sprechen, bedeutet dies, dass sich das Signal dreimal pro Sekunde zwischen HIGH und LOW ändert.

Die Pulsweitenmodulation ist eine äußerst vielseitige Technik, die das Arduino verwendet, um analoge Signale zu erzeugen. Durch die Veränderung des Verhältnisses von HIGH- zu LOW-Signalen können verschiedene Spannungen und Intensitäten erzeugt werden. Dies ermöglicht die präzise Steuerung von LEDs, Motoren und anderen Geräten. Die Frequenz der PWM kann je nach Anwendung und Anforderung angepasst werden. Eine höhere Frequenz ermöglicht eine schnellere Reaktion, während eine niedrigere Frequenz für bestimmte Anwendungen ausreichend sein kann.

Es ist wichtig, die Frequenz der PWM sorgfältig zu wählen, um sicherzustellen, dass sie den Anforderungen deines Projekts entspricht. Je nach Komponente oder Gerät können bestimmte Frequenzbereiche optimal sein, um beste Ergebnisse zu erzielen. Das Arduino bietet eine Reihe von PWM-fähigen Pins, auf denen du die Frequenz und das Tastverhältnis der PWM anpassen kannst.

Durch das Verständnis des Grundprinzips der Pulsweitenmodulation kannst du das volle Potenzial deines Arduino-Boards ausschöpfen und kreative Projekte umsetzen.

Das Tastverhältnis

Das Tastverhältnis spielt eine wichtige Rolle bei der Pulsweitenmodulation (PWM). Es gibt an, wie das Verhältnis zwischen der Zeitdauer des HIGH-Zustands und der Zeitdauer des LOW-Zustands ist. Wenn das Tastverhältnis beispielsweise 50% beträgt, bedeutet dies, dass der HIGH-Zustand genauso lange dauert wie der LOW-Zustand. Das Tastverhältnis beeinflusst die Intensität des ausgehenden Signals, wie zum Beispiel die Helligkeit einer LED. Um das Tastverhältnis zu definieren, betrachten wir das kleinste Element einer Frequenz, nämlich eine Periode.

Das Tastverhältnis wird berechnet, indem die Zeitdauer des HIGH-Zustands durch die gesamte Zeitdauer (HIGH + LOW) einer Periode dividiert wird. Das Tastverhältnis wird als Verhältnis angegeben, beispielsweise als 50% oder 0,5. Das bedeutet, dass die Zeitdauer des HIGH-Zustands die Hälfte der gesamten Periode ausmacht.

Es ist wichtig, anzumerken, dass bei der Verwendung der Funktion "analogWrite()" der korrekte Wert für 50% Intensität nicht 128 ist, sondern 127.

Der Wertebereich von 0 bis 255 wird verwendet, und die Zählung beginnt bei 0. Daher repräsentiert der Wert 127 die Hälfte des Wertebereichs und entspricht einer 50%igen Intensität.

Hier ist ein Beispielcode, der eine LED mit einer Intensität von 50% zum Leuchten bringt:

analogWrite(pin, 127);

Es gibt verschiedene Tastverhältnisse, die im Vergleich zueinander betrachtet werden können. Ein 10%iges Tastverhältnis bedeutet, dass das Signal 10% der Zeit im HIGH-Zustand und 90% der Zeit im LOW-Zustand ist. Bei einem 50%igen Tastverhältnis ist das Signal gleichmäßig auf HIGH und LOW verteilt, während ein 75%iges Tastverhältnis eine längere aktive Zeit und eine kürzere inaktive Zeit hat. Ein 90%iges Tastverhältnis hingegen bedeutet, dass das Signal größtenteils aktiv ist und nur für einen kurzen Zeitraum inaktiv ist.

Das Tastverhältnis bestimmt die Aktivitätsdauer des Signals und hat direkte Auswirkungen auf die Intensität oder den Grad der Aktivität des Signals. Ein höheres Tastverhältnis führt zu einer längeren aktiven Zeit und einer intensiveren Wirkung des Signals.

Das Verständnis des Tastverhältnisses ermöglicht es dir, die Steuerung und Anpassung der Intensität oder Aktivität deiner PWM-Signale präzise durchzuführen und somit eine breite Palette von Anwendungen zu realisieren.

Die Frequenz der analogWrite() Pins

Die Frequenz der PWM-Signale auf den analogen OUTPUT-Pins, die mit der Funktion "analogWrite()" verwendet werden, ist eine wichtige Information, die wir noch betrachten müssen. Der Arduino Uno verwendet interne Timer, um die PWM-Signale zu erzeugen. Auf dem Arduino Uno sind insgesamt 3 Timer vorhanden: Timer0, Timer1 und Timer2. Jeder Timer kann 2 bis 3 Pins mit PWM-Signalen versorgen. Diese Pins teilen sich die gleiche Frequenz, können jedoch unterschiedliche Tastverhältnisse haben.

Auf dem Arduino Uno wird der Timer0 für die Funktionen millis() und micros() verwendet. Die PWM-Pins, die von Timer0 kontrolliert werden, haben eine Frequenz von etwa 980 Hz. Dies betrifft Pin 5 und Pin 6. Die PWM-Pins, die von Timer1 kontrolliert werden, haben eine Frequenz von etwa 490 Hz. Dies betrifft die Pins 9 und 10.

Angenommen, wir setzen ein Tastverhältnis von 75% mit der Funktion "analogWrite(9, 191)".

Dieses Signal wird dann mit einer Frequenz von 490 Hz am Pin 9 ausgegeben. Dadurch entsteht der Eindruck einer Spannung von etwa 3,75 Volt. Es ist jedoch wichtig zu beachten, dass dies nur eine ungefähre Angabe ist und von der genauen Implementierung und der angeschlossenen Last abhängen kann.

Warum verwenden wir überhaupt PWM? Theoretisch könnten wir auch mit der Funktion "digitalWrite()" eine Art PWM nachahmen. Allerdings geht es bei der Verwendung von echter Pulsweitenmodulation um Geschwindigkeit und Ressourceneffizienz. Es ist wesentlich effektiver, die integrierte PWM-Funktion des Arduino zu nutzen. Beachte, dass Werte über 255 automatisch auf 255 begrenzt werden.

Es ist wichtig zu beachten, dass die PWM eine diskrete Annäherung an ein analoges Signal darstellt. Obwohl die erzeugte Spannung nicht kontinuierlich variiert (sie wechselt nur zwischen 0 und 5 Volt), erzeugt sie dennoch den Eindruck einer kontinuierlichen Änderung der Intensität oder des Signals. Für viele Anwendungen ist diese diskrete Annäherung ausreichend und ermöglicht die präzise Steuerung von Komponenten und Geräten.

Der Sketch

Lass uns nun alles in die Praxis umsetzen. Mit diesem Sketch kannst du die Helligkeit einer LED variieren.

#define ledPin 9

void setup()
{
  pinMode(ledPin, OUTPUT);  //Setzt den digitalen Pin als Ausgang
}

void loop() 
{
  analogWrite(ledPin, 255); //Verändert den Pegel und schreibt Werte zwischen 0-255 auf den Pin
}

Aufbau und Verkabelung

Für den Aufbau und die Verkabelung folge dem unteren Schema. Verbinde den VCC-Pin des LED-Moduls mit einem 5V-Pin deines Arduino Boards. Dies versorgt das LED-Modul mit der notwendigen Betriebsspannung. Als nächstes verbinde den GND-Pin (Ground) des LED-Moduls mit einem GND-Pin deines Arduino Boards. Dies stellt eine gemeinsame Erdung für das Modul und das Board her. Schließlich verbinde den Signal-Pin des LED-Moduls mit dem digitalen Pin 9 (oder welchen Pin du in deinem Sketch definiert hast) auf deinem Arduino Board. Dieser Pin wird genutzt, um das LED-Modul über den Arduino zu steuern.

Sketch-Details und Erläuterungen

Jetzt erläutern wir die Details des Sketches. Unser Code setzt den Pin 9 des Arduino als Ausgang und sendet ein PWM-Signal mit einem Tastverhältnis (Duty Cycle) von 100% (weil wir den Wert 255 eingestellt haben). Dies ist der maximale Wert für die Funktion analogWrite(), der einer konstanten Ausgabe von HIGH entspricht. Wenn wir eine LED an diesen Pin angeschlossen haben, bedeutet dies, dass die LED bei einem Duty Cycle von 100% mit maximaler Helligkeit leuchtet.

Aber der Spaß hört hier nicht auf. Spiele ein wenig herum, indem du den Pegelwert zwischen 0 und 255 änderst. Dann lade den Sketch auf deinen Arduino hoch und beobachte, was passiert. Es ist erstaunlich zu sehen, wie kleine Änderungen im Code zu sichtbaren Unterschieden in der realen Welt führen können.

Der Code verwendet die #define-Direktive, um eine Konstante ledPin mit dem Wert 9 zu definieren.

#define ledPin 9

In der setup()-Funktion wird der digitale Pin mit der Nummer ledPin als Ausgang konfiguriert.

void setup() 
{
  pinMode(ledPin, OUTPUT);  //Setzt den digitalen Pin als Ausgang
}

In der loop()-Funktion wird der Pegel des Pins mithilfe von analogWrite() auf 255 gesetzt, was den maximalen Wert darstellt. Dadurch wird das an den Pin angeschlossene Gerät (vermutlich eine LED) mit voller Helligkeit leuchten.

void loop()
{
  //Verändert den Pegel und schreibt Werte zwischen 0-255 auf den Pin
  analogWrite(ledPin, 255); 
}

Wenn du Werte zwischen 0 und 255 in den Sketch einträgst und hochlädst, wird die LED ihre Helligkeit entsprechend anpassen. Ein Wert von 0 schaltet die LED aus, während 255 die maximale Helligkeit erzeugt. Durch Variieren der Werte kannst du die Helligkeit der LED anpassen und ihr Verhalten beobachten.