Pulsweitenmodulation (oder PWM, kurz für Pulse Width Modulation) ist eine Modulation, die es ermöglicht, einen Durchschnittswert abhängig vom Verhältnis zwischen der Dauer des positiven und negativen Impulses (Arbeitszyklus) zu erhalten.
Dieser Funktionsblock verwaltet die auf einigen Modulen vorhandene Hardware-PWM-Schaltung (Kann nur auf Modulen mit Hardware-PWM-Management verwendet werden), ist nicht mit dem FB zu verwechseln PWMOut, PWM output management die stattdessen eine Software-PWM erzeugt (viel weniger Leistung in der Frequenz), die aber mit jedem Logikausgang verwendet werden kann. Um die optionalen Ausgänge zu aktivieren, muss der Schutzcode angefordert werden, siehe Funktions- und Funktionsblockschutz. Es ist jedoch möglich, sie im Testmodus für 15 Minuten frei zu verwenden.
Der FB ermöglicht die Definition des Frequenzwertes Frequency und Arbeitszyklus Duty des PWM-Generators auf dem angegebenen Modul und Kanal. Der Wertebereich hängt vom verwendeten Modul ab und im Allgemeinen werden wir haben.
- Frequency:=0beendet der PWM-Generator die aktuelle Periode und setzt den Ausgang zurück.
- Duty:=0beendet der PWM-Generator die aktuelle Periode und deaktiviert den Ausgang.
- Duty:=100beendet der PWM-Generator die aktuelle Periode und aktiviert den Ausgang.
- Duty:=50, versucht der PWM-Generator, das Tastverhältnis bei allen Frequenzwerten, Generatorfrequenz, auf 50 % zu halten.
Module mit PWM-Ausgang
Dieser FB arbeitet nur mit Modulen, die das PWM-Hardwaremanagement implementieren, unter einer Übersichtstabelle.
Modulcode | PWM-Kanäle | Note |
---|---|---|
MPS050-PCB131 | 1 | OUT0, Frequenzbereich 5Hz÷3kHz |
MPS053-PCB135 | 1 | OUT0, Frequenzbereich 5Hz÷3kHz |
MPS054-PCB137 | 2 | OUT0÷1, Frequenzbereich 5Hz÷3kHz |
MPS056-PCB141 | 2 | OUT0÷1, Frequenzbereich 5Hz÷3kHz |
PCB124 * 010 | 4 (davon 3 Option) | OUT0÷3, Frequenzbereich 8Hz÷5kHz |
Duty-Cycle-Einstellung
Die Module haben optoisolierte Ausgänge, daher werden an den steigenden und fallenden Flanken Verzögerungen erzeugt, die mit zunehmender Frequenz den einstellbaren Bereich des Tastverhältnisses verringern. Aufgrund der Verzögerungen mit zunehmender Frequenz nimmt die Granularität der Frequenz- und Tastverhältniseinstellungen zu.
Modulcode | Pflicht mind | Pflicht max | Einschaltdauer min (20Hz) | Einschaltdauer max. (20 Hz) |
---|---|---|---|---|
MPS054-PCB137, MPS056-PCB141 | 1% | 100-(Frequenz/27.2) | 1% | 100-(20/27.2)=99% |
PCB124 * 010 | Frequenz/71.4 | 99% | 20 / 71.4 =1% | 99% |
Funktionssperre
CODESYS: nicht verfügbar
LogikLab: eLLabXUnified12Lib
Beschreibung
Address (USINT) Es ist notwendig, die Moduladresse anzugeben, auf der die PWM-Verwaltung durchgeführt werden soll (Bereich von 0 bis 15). Der Wert 0 bezeichnet das erste Erweiterungsmodul, 1 das zweite und so weiter. Der Wert 255 gibt das CPU-Modul an.
Channel (USINT) Die Kanaladresse muss auf dem Modul angegeben werden (Bereich 0 bis 15).
Frequency (REAL) Ausgangsfrequenzwert (siehe Handbuch der verwendeten Karte). Der Wert wird in angegeben Hz.
Duty (REAL) Duty-Cycle-Wert des Ausgangssignals, auf 50 setzen, wenn er als Frequenzgenerator verwendet wird. Der Wert wird in % ausgedrückt.
Done (BOOL) PWM-Generator richtig eingestellt.
Fault (BOOL) Ausführungsfehler
Beispiele
Verwendung der Beispiele.
ST_SysSetPWMOut: Kanal 0 (Out 00) des CPU-Moduls ist so eingestellt, dass er ein 100-Hz-PWM-Signal mit 50 % Tastverhältnis erzeugt.
ST_PWMOutPulsesCount: Mit einem an den PWM-Ausgang angeschlossenen Zähler ist es möglich, die Ausgangsfrequenz nach einer voreingestellten Anzahl von Impulsen zu blockieren oder zu ändern. Wie aus dem Diagramm ersichtlich ist, ist der Ausgang DO00 des PWM mit dem Eingang Di00 des Zählers verbunden.
Es werden 4 Impulse bei 100 Hz erzeugt, gefolgt von 3 Impulsen bei 200 Hz und schließlich 2 Impulsen bei 50 Hz, dann wird der Ausgang auf Null zurückgesetzt, wodurch der Befehl zum Schritt-, Starten-, Vorwärts-, Verlangsamungs- und Stoppen von Motoren simuliert wird. Das Lesen des Zählers muss innerhalb der Dauer von 1 Impuls (bei 200 Hz alle 5 ms) erfolgen, daher muss das Programm im Fast-Task ausgeführt werden.
LogicLab (Ptp116, ST_SysSetPWMOut)
PROGRAM ST_SysSetPWMOut
VAR
PWMOut : SysSetPWMOut; (* PWM output *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_SysSetPWMOut"
// *****************************************************************************
// This program presets the PWM output channel 0 on CPU module.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// PWM OUTPUT
// -------------------------------------------------------------------------
// Preset PWM output.
IF (SysFirstLoop) THEN
PWMOut.Address:=255; //Module address
PWMOut.Channel:=0; //Module channel
PWMOut.Frequency:=100.0; //Frequency output (Hz)
PWMOut.Duty:=50.0; //Duty cycle (%)
END_IF;
// Manage the PWM output.
PWMOut(); //PWM output
// [End of file]
LogicLab (Ptp116, ST_PWMOutPulsesCount)
PROGRAM ST_PWMOutPulsesCount
VAR
Start : BOOL; (* Start command *)
CaseNr : USINT; (* Program case *)
PulsesThr : UDINT; (* Pulses threshold *)
PulsesCtr : UDINT; (* Pulses counter *)
PWMOut : SysSetPWMOut; (* PWM output *)
CInp : SysGetCounter; (* Counter acquisition *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_PWMOutPulsesCount"
// *****************************************************************************
// This program shows how to use a counter to count the PWM output pulses. After
// a defined number of pulses the output frequency is changed some times.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// PROGRAM INIT
// -------------------------------------------------------------------------
// Executed at first program execution, all variables are initialized.
IF (SysFirstLoop) THEN
PWMOut.Address:=255; //Module address
PWMOut.Channel:=0; //Module channel
CInp.Address:=255; //Module address
CInp.Channel:=0; //Module channel
CInp.Mode:=16#00000000; //Acquisition mode
END_IF;
// -------------------------------------------------------------------------
// PWM OUTPUT
// -------------------------------------------------------------------------
// Preset PWM output.
CASE (CaseNr) OF
// ---------------------------------------------------------------------
// Wait for the start command.
0:
IF NOT(Start) THEN RETURN; END_IF;
Start:=FALSE; //Start command
// Set ouput frequency, duty cycle and save counter value.
CInp(); //Counter acquisition
PWMOut(Frequency:=100.0, Duty:=50.0); //PWM output
PulsesThr:=CInp.Value; //Pulses threshold
CaseNr:=CaseNr+1; //Program case
// ---------------------------------------------------------------------
// Wait for the defined number of pulses (4 pulses at 100 Hz).
1:
CInp(); //Counter acquisition
PulsesCtr:=CInp.Value-PulsesThr; //Pulses counter
IF (PulsesCtr < 4) THEN RETURN; END_IF;
// Set ouput frequency, duty cycle and save counter value.
PWMOut(Frequency:=200.0, Duty:=50.0); //PWM output
PulsesThr:=CInp.Value; //Pulses threshold
CaseNr:=CaseNr+1; //Program case
// ---------------------------------------------------------------------
// Wait for the defined number of pulses (3 pulses at 200 Hz).
2:
CInp(); //Counter acquisition
PulsesCtr:=CInp.Value-PulsesThr; //Pulses counter
IF (PulsesCtr < 3) THEN RETURN; END_IF;
// Set ouput frequency, duty cycle and save counter value.
PWMOut(Frequency:=50.0, Duty:=50.0); //PWM output
PulsesThr:=CInp.Value; //Pulses threshold
CaseNr:=CaseNr+1; //Program case
// ---------------------------------------------------------------------
// Wait for the defined number of pulses (2 pulses at 50 Hz).
3:
CInp(); //Counter acquisition
PulsesCtr:=CInp.Value-PulsesThr; //Pulses counter
IF (PulsesCtr < 2) THEN RETURN; END_IF;
// Stop PWM output with signal low.
PWMOut(Frequency:=0.0, Duty:=0.0); //PWM output
CaseNr:=0; //Program case
END_CASE;
// [End of file]