La modulazione di larghezza di impulso (o PWM, acronimo di pulse-width modulation), è una modulazione che permette di ottenere un valore medio dipendente dal rapporto tra la durata dell'impulso positivo e di quello negativo (duty cycle).
Questo blocco funzione permette di gestire una qualsiasi uscita digitale in modalità PWM la gestione del PWM è realizzata con un algoritmo software. Non è da confondere con il FB SysSetPWMOut, set PWM output, dove la gestione del PWM è gestita da un circuito hardware presente nel modulo che garantisce frequenze in uscita molto più alte.
In Frequency è possibile definire la frequenza di uscita, ed in Duty è possibile impostare la percentuale in cui il segnale di uscita rimane attivo. Per evitare di avere impulsi in uscita di durata troppo piccola, è previsto il parametro TMin che permette di definire il tempo minimo dell'impulso in uscita.
Se Duty <= 0.0: l'uscita Out è settata FALSE, se Duty >= 100.0: l'uscita è settata TRUE. Impostando il valore di Frequency a 0 viene disabilitato il PWM e l'uscita viene forzata in base al valore di Duty. Duty < 50: L'uscita viene settata a FALSE. Duty >= 50: L'uscita viene settata a TRUE.
Function block
CODESYS: Non disponibile
LogicLab: eLLabUtyLib
Enable (BOOL) Abilitazione gestione uscita PWM, attivando l'ingresso si abilita la gestione. Disattivando l'ingresso si azzera l'uscita Out.
Frequency (REAL) Valore di frequenza in uscita (Per i limiti considerare il tempo di esecuzione della task in cui viene eseguito il FB). Il valore è espresso in Hz.
Duty (REAL) Valore di duty cycle del segnale in uscita (Per i limiti considerare il tempo di esecuzione della task in cui viene eseguito il FB). Il valore è espresso in %.
TMin (REAL) Tempo minimo comando uscita Out, il valore è espresso in S.
Out (BOOL) Uscita PWM da collegare all'uscita fisica da gestire.
Esempi
Come utilizzare gli esempi.
Nell'esempio è gestita una uscita PWM definendo una frequenza di uscita di 10 Hz. Per poter gestire l'uscita a questa velocità si è deve eseguire il programma nella task Fast (Ogni 1 mS). Eseguendo il programma 1000 volte al secondo con frequenza 10 Hz (100 mS di periodo) si avrà la possibilità di regolare il duty cycle con la risoluzione del 1%. Per poter gestire l'uscita hardware nella task Fast occorre utilizzare l'accesso diretto alla periferica con il FB SysSetPhrDo.
PROGRAM ST_PWMOut_v1
VAR
Out : BOOL; (* Out signal *)
Duty : REAL := 50.0; (* Duty cycle (%) *)
DOut : SysSetPhrDO; (* Manage peripheral outputs *)
PWM : PWMOut_v1; (* PWM management *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_PWMOut_v1"
// *****************************************************************************
// Is managed a PWM out, the program is executed on the Fast task, so it's
// executed at every 1 mS. This allows to have a maximum frequency of 10 Hz with
// possibility to set the duty with a resolution of 1 %.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Initialize variables.
IF (SysFirstLoop) THEN
// Peripheral outputs settings.
DOut.Address:=255; //CPU module address
DOut.Mode:=DO_8_LL; //Management mode
DOut.Mask:=16#00000001; //Mask output 0
// PWM out settings.
PWM.Enable:=TRUE; //Enable
PWM.Frequency:=10.0; //Frequency (Hz)
PWM.TMin:=0.001; //Minimum output time
END_IF;
// -------------------------------------------------------------------------
// PWM OUT MANAGEMENT
// -------------------------------------------------------------------------
// Manage the PWM out.
PWM(Duty:=Duty); //PWM management
Out:=PWM.Out; //Out signal
IF NOT(PWM.Out) THEN
DOut.Value:=DOut.Value AND 16#FFFFFFFE; //Reset output
ELSE
DOut.Value:=DOut.Value OR 16#00000001; //Set output
END_IF;
DOut(); //Manage peripheral outputs
// [End of file]