Was bedeutet PWM?

PWM steht für Pulsweitenmodulation. Bei der Pulsweitenmodulation wird ein bestimmtes Verhältnis der Zeitdauern von High- und Low-Signal eingestellt, welches z.B. genutzt werden kann, um eine LED im zeitlichen Mittel dunkler leuchten zu lassen.

Beim im Arduino verwendeten Atmega328P sind alle drei Timer in der Lage ein PWM-Signal zu erzeugen. Timer 1 verfügen über den größten Funktionsumfang. Es ist möglich 8 Bit, 9 Bit und 10 Bit PWM Signale zu erzeugen. Wie ein PWM Signal zustande kommt, ist der folgenden Grafik zu entnehmen:


Zählerstand

PWMZeit

Abb.: Zustandekommen eines PWM Signals; Quelle: BBS2 Wolfsburg

Im Bild sowie wie im nachfolgendem Text handelt es sich um den "Phase-Correct-PWM"-Modus. Standartmäßig nutzt man bei der PWM Erzeugung den "Fast-PWM"-Modus.

Erreicht der Timer beim Hochzählen einen Vergleichswert, wird der PWM Ausgang auf Low geschaltet. Nachdem der Timer vollständig hochgezählt hat, zählt er bei entsprechender Konfiguration wieder herunter (in einer anderen Konfiguration ("Fast-PWM"-Modus) kann z.B. der Zähler dann wieder bei 0 mit dem Hochzählen starten). Beim erneuten Erreichen des Vergleichswertes, wird der PWM-Ausgang wieder auf High geschaltet. Dieser Vorgang ist periodisch. Anhand des Vergleichswertes kann das Zeitverhältnis zwischen High- und Low-Pegel bestimmt werden bei fester Periodendauer bzw. Frequenz des PWM-Signals.


Der Vergleichswert wird beim Arduino über das Register OCR1A bestimmt. Mit ihm lässt sich das Verhältnis zwischen Pulszeit ("An"-Zeit) und der Periodendauer festlegen. Dieses Verhältnis wird oft auch als Tastgrad bezeichnet. Da es sich um einen 16-Bit-Timer handelt, muss der Vergleichswert ebenfalls aus 16 Bit bestehen und sich somit auf zwei Register aufteilen. Dabei handelt es sich um OCR1AL für die 8 niederwertigen Bits und OCR1AH für die 8 höherwertigen Bits.

Der Befehl:

OCR1A = 0x7FFF     (alternativ:   OCR1AH = 0x7F und OCR1AL =  0xFF)     

sorgt für ein Tastgrad von 0,5 (50%)

Berechnung des Tastgrades:  Tastgrad = t / T            mit t = Impulsdauer und T = Periodendauer

Beispielrechnung: Tastgrad = 32768 (Impulsdauer in Schritte) / 65535 (Periodendauer in Schritte) = 0,5


Das folgende Beispielprogramm, gibt eine erste Einführung in die Thematik der PWM-Erzeugung:

Das Ziel ist es mittels einer Pulsweitenmodulation eine LED pulsieren zu lassen. Zur Referenz wird eine zweite LED permanent eingeschaltet.

Der Aufbau sieht wie folgt aus:

Aufbau Hardware

Abb.: Aufbau der Schaltung; Quelle: BBS2 Wolfsburg


Die über das PWM-Signal angesteuerte LED muss zwingend an Pin 9 angeschlossen werden, weil der Ausgang des TIMER1 OC1A ist, welcher fest an Pin 9 anliegt (siehe Pin Mapping des Arduinos).

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>


int main(void)
{
	DDRB = (1<<1);            // Pin 9 als Ausgabe
	
	TCCR1A = (1<<COM1A1) | (1 << WGM11) | (0<<WGM10);        // Timer1 Waveform Generation Modus 14 -> fast PWM      
	TCCR1B = (1 << WGM13)| (1<<WGM12)|(1<<CS10);            // Vorteiler 1; Compare Output Modus -> Setzt OC1A bei Compare Match (ICR1), Rücksetzt bei Zählerstand 0
	
    TCNT1 =0; // Setzt beim Initialisieren den Zählerstand des Timers auf 0
	
	
	ICR1 = 65535; // Modulationsfrequnez 16 000 000 / 65300 = 244,14 Hz
	OCR1A = 65535;   // 100 % Tastverhältnis

	
   
    while (1) 
    { 
		  for(long int i = 0; i< 65535; i++)
		  {
			  OCR1A = i;
			   _delay_ms(0.02);
		  }
		 
		 
		   for(long int l = 65535; l > 0; l--)
		   {
			   OCR1A = l;
			   _delay_ms(0.02);	
		   }	
    }
}

In diesem Beispiel wurde der Vergleichswert OCR1A durch eine Zählschleife von 0 bis 65535 hochgezählt (0-100%) und durch die zweite Schleife von 65535 auf 0 runtergezählt (100-0%). Es wird also der Tastgrad konstant geändert und es kommt zu einem Pulsieren der LED.


Ergebnis

Abb.: Aufbaus für LED Pulsweitenmodulation; Quelle: BBS2 Wolfsburg



Im folgende sind Osziloskop-Bilder für unterschiedliche Tastgrade dargestellt.

20% Tastgrad ( OCR1A = 13107; Mittelwert = 1 V):

Abb.: Oszilloskopbild bei 20% Tastgrad; Quelle: BBS2 Wolfsburg


50% Tastgrad ( OCR1A = 32768; Mittelwert = 2,5 V):

Abb.: Oszilloskopbild bei 50% Tastgrad; Quelle: BBS2 Wolfsburg



80% Tastgrad ( OCR1A = 52428; Mittelwert = 4 V):

Abb.: Oszilloskopbild bei 50% Tastgrad; Quelle: BBS2 Wolfsburg

Zuletzt geändert: Montag, 21. Februar 2022, 09:25