Puls Weiten Modulation PWM leicht verständlich und programmierbar

Voraussetzung für die Programmierbarkeit von PWM ist das Ein und Ausschalten vom PC aus

PWM macht es möglich, dass Geräte, die nur den Ein- oder Aus-Zustand kennen, kontinuierlich geregelt werden können. Wichtige Kenngrößen sind einmal die Frequenz und dann das sogenannte Tastverhältnis zwischen Ein- und Ausschaltphasen. Theoretisch spielt die Frequenz keine Rolle, praktisch jedoch sind mögliche Frequenzen von den verbauten Schaltelementen und Endgeräten abhängig. So wird eine Elektroheizung von 1kW aufwärts beispielsweise über ein Schütz geschaltet, womit praktikable Frequenzen bei 1/min .. 10/min liegen. Gleichermaßen können Heizkörper aufgrund ihrer Wärmeträgheit auch längere Ausschaltphasen puffern bzw. überbrücken.

Nehmen wir einmal an, die Heizung bleibt 3 Minuten ein- und 7 Minuten ausgeschaltet, so haben wir eine Periode von 10 Minuten:

___         ___
   |_______|   |_...

Mit diesem Tastverhältnis ergibt sich eine effektive Leistung von 0.3 bzw. 1/3 der Gesamtleistung. Wenn sowas programmiert werden soll, wird neben der Angabe 0.3 auch der Wert für die Periode benötigt, im Beispiel also 10. Und schließlich wird jede Minute ein Prozess aktiv, der anhand eines internen Zählers leicht feststellt, welcher Schaltzustand dem Gerät zuzuweisen ist.

In Perl programmiert sieht das beispielsweise so aus:

# Puls Weiten Modulation
sub pwm{
    my $self   = shift;
    my $power  = shift; # 0.3
    my $period = shift; # 10

    # interner Zähler
    my $nr     = do "LfdNr.pm";

    return 'On'  if $power == 1;
    return 'Off' if $power == 0;

    return ($nr % $period +1)/$period <= $power ? 'On' : 'Off';
}

Im einfachsten Fall geht also jede Minute ein Kommando On||Off raus an das Gerät. Idealerweise jedoch nur, wenn sich eine Änderung zum vorhergegangenen Schaltzustand ergeben hat. In Fakt erfordert also auch dieser Zustand einen weiteren Zwischenspeicher. Alles zusammen in einem Script was in einer Endlosschleife läuft:

use strict;
use warnings;
use Shell qw(on off);

$| = 1;

my $m = bless{
    nr     => 0,
    power  => 0.3,
    period => 10,
    state  => ''
}, 'main';

while(){
    my $state = $m->pwm;

    if( $state ne $m->{state} ){
        if($state eq 'On'){
            on();
            print "Set State to On\n";
        }
        else{
            off();
            print "Set State to Off\n";
        }
    }

    $m->{state} = $state;

    print "$state\n";
    sleep(60);
}


# Puls Weiten Modulation
sub pwm{
    my $self   = shift;
    my $power  = $self->{power};
    my $period = $self->{period};
    my $nr     = $self->{nr};

    $self->{nr}++;

    return 'On'  if $power == 1;
    return 'Off' if $power == 0;

    return ($nr % $period +1)/$period <= $power ? 'On' : 'Off';
}
__END__
Ausgabe in der Konsole:

Set State to On
On
On
On
Set State to Off
Off
Off
Off
Off
Off
Off
Off
Set State to On
...

Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.