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 module | Canaux PWM | Notes |
---|---|---|
MPS050-PCB131 | 1 | OUT0, plage de fréquence 5Hz÷3kHz |
MPS053-PCB135 | 1 | OUT0, plage de fréquence 5Hz÷3kHz |
MPS054-PCB137 | 2 | OUT0÷1, plage de fréquence 5Hz÷3kHz |
MPS056-PCB141 | 2 | OUT0÷1, plage de fréquence 5Hz÷3kHz |
PCB124 * 010 | 4 (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 module | service min | devoir maximum | Service Min (20Hz) | Service Max (20Hz) |
---|---|---|---|---|
MPS054-PCB137, MPS056-PCB141 | 1% | 100-(Fréq/27.2) | 1% | 100-(20/27.2)=99% |
PCB124 * 010 | Fréq/71.4 | 99% | 20 / 71.4 =1% | 99% |
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
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.
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]