Modularea lățimii de impuls (sau PWM, prescurtare pentru Pulse Width Modulation), este o modulație care permite obținerea unei valori medii în funcție de raportul dintre durata impulsului pozitiv și negativ (duty cycle).
Acest bloc de funcții gestionează circuitul hardware PWM prezent pe unele module (Poate fi utilizat numai pe module care au management PWM hardware), nu trebuie confundat cu FB PWMOut, PWM output management care în schimb creează un software PWM (mult mai puțin performant în frecvență) dar care poate fi folosit cu orice ieșire logică. Pentru a activa ieșirile opționale, trebuie solicitat codul de protecție, vezi funcția și protecția blocului funcțional. Cu toate acestea, este posibil să le folosiți liber în modul de testare timp de 15 minute.
FB permite definirea valorii frecvenței Frequency și ciclul datoriei Duty a generatorului PWM pe modulul și canalul indicat. Gama de valori depinde de modulul utilizat și, în general, vom avea.
- Frequency:=0, generatorul PWM încheie perioada curentă și resetează ieșirea.
- Duty:=0, generatorul PWM încheie perioada curentă și dezactivează ieșirea.
- Duty:=100, generatorul PWM încheie perioada curentă și activează ieșirea.
- Duty:=50, generatorul PWM încearcă să mențină ciclul de lucru la 50% la toate valorile frecvenței, frecvența generatorului.
Module cu ieșire PWM
Acest FB funcționează numai pe module care implementează managementul hardware PWM, sub un tabel sumar.
Codul modulului | Canale PWM | notițe |
---|---|---|
MPS050-PCB131 | 1 | OUT0, gama de frecvente 5Hz÷3kHz |
MPS053-PCB135 | 1 | OUT0, gama de frecvente 5Hz÷3kHz |
MPS054-PCB137 | 2 | OUT0÷1, gama de frecvente 5Hz÷3kHz |
MPS056-PCB141 | 2 | OUT0÷1, gama de frecvente 5Hz÷3kHz |
PCB124 * 010 | 4 (inclusiv 3 opțiune) | OUT0÷3, gama de frecvente 8Hz÷5kHz |
Setarea ciclului de lucru
Modulele au ieșiri optoizolate, prin urmare se generează întârzieri pe muchiile de creștere și de descreștere care, pe măsură ce frecvența crește, reduc intervalul setat al ciclului de lucru. Din cauza întârzierilor pe măsură ce frecvența crește, granularitatea setărilor de frecvență și sarcină crește.
Codul modulului | datorie min | sarcina max | Duty Min (20Hz) | Duty Max (20 Hz) |
---|---|---|---|---|
MPS054-PCB137, MPS056-PCB141 | 1% | 100-(Frecv./27.2) | 1% | 100-(20/27.2)=99% |
PCB124 * 010 | Frecvență/71.4 | 99% | 20 / 71.4 =1% | 99% |
Blocarea funcției
CODESYS: Indisponibil
LogicLab: eLLabXUnified12Lib
Descriere
Address (USINT) Este necesar să se specifice adresa modulului pe care să se efectueze managementul PWM (Interval de la 0 la 15). Valoarea 0 indică primul modul de extensie, 1 al doilea și așa mai departe. Valoarea 255 indică modulul CPU.
Channel (USINT) Adresa canalului trebuie specificată pe modul (Interval de la 0 la 15).
Frequency (REAL) Valoarea frecvenței de ieșire (Consultați manualul cardului utilizat). Valoarea este exprimată în Hz.
Duty (REAL) Valoarea ciclului de lucru a semnalului de ieșire, setat la 50 dacă este folosit ca generator de frecvență. Valoarea este exprimată în %.
Done (BOOL) Generatorul PWM setat corect.
Fault (BOOL) Eroare la executare
Exemple
Cum se utilizează exemplele.
ST_SysSetPWMOut: Canalul 0 (Out 00) al modulului CPU este setat să genereze un semnal PWM de 100 Hz cu ciclu de lucru de 50%.
ST_PWMOutPulsesCount: Folosind un contor conectat la ieșirea PWM este posibilă blocarea sau modificarea frecvenței de ieșire după un număr prestabilit de impulsuri. După cum se poate vedea din diagramă, ieșirea DO00 a PWM este conectată la intrarea Di00 a contorului.
Se generează 4 impulsuri la 100Hz, urmate de 3 impulsuri la 200Hz și în final 2 impulsuri la 50Hz apoi ieșirea se resetează la zero, simulând comanda de pas, pornire, redirecționare, încetinire și oprire a motoarelor. Citirea contorului trebuie efectuată în durata de 1 puls (la 200Hz la fiecare 5mS), prin urmare programul trebuie executat în sarcină rapidă.
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]