SysSetPWMOut, définition de la sortie PWM

Liste

Cette page fait partie de la Manuel de programmation CEI 61131-3. Aller à l'index.

Modulation de largeur d'impulsion (ou PWM, abréviation de Pulse Width Modulation), est une modulation qui permet d'obtenir une valeur moyenne en fonction du rapport entre la durée de l'impulsion positive et négative (rapport cyclique).

Ce bloc fonctionnel gère le circuit PWM matériel présent sur certains modules (Ne peut être utilisé que sur des modules dotés d'une gestion PWM matérielle), ne doit pas être confondu avec le FB PWMOut, PWM output management qui crée à la place un logiciel PWM (Beaucoup moins performant en fréquence) mais qui peut être utilisé avec n'importe quelle sortie logique. Pour activer les sorties optionnelles, le code de protection doit être demandé, voir protection des fonctions et des blocs de fonctions. Il est cependant possible de les utiliser librement en mode test pendant 15 min.

Le FB permet de définir la valeur de fréquence Frequency et cycle de travail Duty du générateur PWM sur le module et le canal indiqués. La plage de valeurs dépend du module utilisé et en général nous aurons.

  • Frequency:=0, le générateur PWM termine la période en cours et réinitialise la sortie.
  • Duty:=0, le générateur PWM termine la période en cours et désactive la sortie.
  • Duty:=100, le générateur PWM termine la période en cours et active la sortie.
  • Duty:=50, le générateur PWM essaie de maintenir le rapport cyclique à 50 % à toutes les valeurs de fréquence, fréquence du générateur.
Modules avec sortie PWM

Ce FB fonctionne uniquement sur les modules qui implémentent la gestion du matériel PWM, sous un tableau récapitulatif.

Code du moduleCanaux PWMNotes
MPS050-PCB1311OUT0, plage de fréquence 5Hz÷3kHz
MPS053-PCB1351OUT0, plage de fréquence 5Hz÷3kHz
MPS054-PCB1372OUT0÷1, plage de fréquence 5Hz÷3kHz
MPS056-PCB1412OUT0÷1, plage de fréquence 5Hz÷3kHz
PCB124 * 0104 (dont 3 en option)OUT0÷3, plage de fréquence 8Hz÷5kHz
Réglage du cycle de service

Les modules ont des sorties opto-isolées donc des retards sont générés sur les fronts montants et descendants qui, à mesure que la fréquence augmente, réduisent la plage réglable du rapport cyclique. En raison des retards à mesure que la fréquence augmente, la granularité des paramètres de fréquence et de service augmente.

Code du moduleservice mindevoir maximumService Min (20Hz)Service Max (20Hz)
MPS054-PCB137, MPS056-PCB1411%100-(Fréq/27.2)1%100-(20/27.2)=99%
PCB124 * 010Fréq/71.499%20 / 71.4 =1%99%
Cercle d'informations

Verrouillage de fonction

CODESYS : indisponible

LogicLab : eLLabXUnified12Lib

Description

Address (USINT) Il est nécessaire de spécifier l'adresse du module sur lequel effectuer la gestion PWM (Plage de 0 à 15). La valeur 0 indique le premier module d'extension, 1 le deuxième et ainsi de suite. La valeur 255 indique le module CPU.
Channel (USINT) L'adresse de la voie doit être précisée sur le module (Plage 0 à 15).
Frequency (REAL) Valeur de la fréquence de sortie (Se reporter à la notice de la carte utilisée). La valeur est exprimée en Hz.
Duty (REAL) Valeur du rapport cyclique du signal de sortie, réglé sur 50 si utilisé comme générateur de fréquence. La valeur est exprimée en %.
Done (BOOL) Générateur PWM correctement réglé.
Fault (BOOL) Erreur d'exécution

Image Fys SysSetPWMOut

Exemples

Comment utiliser les exemples.
ST_SysSetPWMOut: Le canal 0 (Out 00) du module CPU est réglé pour générer un signal PWM de 100 Hz avec un rapport cyclique de 50 %.

ST_PWMOutPulsesCount: A l'aide d'un compteur connecté à la sortie PWM, il est possible de bloquer ou de modifier la fréquence de sortie après un nombre d'impulsions prédéfini. Comme on peut le voir sur le schéma, la sortie DO00 du PWM est connectée à l'entrée Di00 du compteur.

4 impulsions à 100Hz sont générées, suivies de 3 impulsions à 200Hz et enfin 2 impulsions à 50Hz puis la sortie se remet à zéro, simulant la commande de pas à pas, démarrage, avance, ralentissement et arrêt des moteurs. La lecture du compteur doit être effectuée dans la durée d'1 impulsion (à 200Hz toutes les 5mS) donc le programme doit être exécuté en tâche rapide.

Liaisons pour ST_PWMOutPulsesCount
Laboratoire logique (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]
Laboratoire logique (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]
Cet article a-t-il été utile?