Vai al contenuto
Vai all indice del manuale di programmazione

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 DutyDuty < 50: L'uscita viene settata a FALSEDuty >= 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.

LogicLab (Ptp114)
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]
Was this article helpful?