Modulación de ancho de pulso (o PWM, abreviatura de Pulse Width Modulation), es una modulación que permite obtener un valor medio en función de la relación entre la duración del impulso positivo y negativo (Duty Cycle).
Este bloque de funciones gestiona el circuito PWM de hardware presente en algunos módulos (Solo se puede usar en módulos que tienen administración PWM de hardware), no debe confundirse con el FB PWMOut, PWM output management que en cambio crea un PWM de software (mucho menos rendimiento en frecuencia) pero que se puede usar con cualquier salida lógica. Para habilitar las salidas opcionales se debe solicitar el código de protección, ver función y protección de bloque de función. Sin embargo, es posible usarlos libremente en modo de prueba durante 15 min.
El FB permite la definición del valor de frecuencia. Frequency y ciclo de trabajo Duty del generador PWM en el módulo y canal indicado. El rango de valores depende del módulo utilizado y en general tendremos.
- Frequency:=0, el generador PWM finaliza el período actual y restablece la salida.
- Duty:=0, el generador PWM finaliza el período actual y desactiva la salida.
- Duty:=100, el generador PWM finaliza el período actual y activa la salida.
- Duty:=50, el generador PWM intenta mantener el ciclo de trabajo al 50% en todos los valores de frecuencia, frecuencia del generador.
Módulos con salida PWM
Este FB solo funciona en módulos que implementan la gestión de hardware PWM, debajo de una tabla resumen.
Código del módulo | Canales PWM | Note |
---|---|---|
MPS050-PCB131 | 1 | OUT0, rango de frecuencia 5Hz÷3kHz |
MPS053-PCB135 | 1 | OUT0, rango de frecuencia 5Hz÷3kHz |
MPS054-PCB137 | 2 | OUT0÷1, rango de frecuencia 5Hz÷3kHz |
MPS056-PCB141 | 2 | OUT0÷1, rango de frecuencia 5Hz÷3kHz |
PCB124 * 010 | 4 (incluyendo 3 opciones) | OUT0÷3, rango de frecuencia 8Hz÷5kHz |
Configuración del ciclo de trabajo
Los módulos tienen salidas optoaisladas, por lo que se generan retardos en los flancos ascendente y descendente que, a medida que aumenta la frecuencia, reducen el rango configurable del ciclo de trabajo. Debido a los retrasos a medida que aumenta la frecuencia, aumenta la granularidad de los ajustes de frecuencia y servicio..
Código del módulo | deber mínimo | deber máximo | Servicio mínimo (20 Hz) | Servicio máx. (20 Hz) |
---|---|---|---|---|
MPS054-PCB137, MPS056-PCB141 | 1% | 100-(Frecuencia/27.2) | 1% | 100-(20/27.2)=99% |
PCB124 * 010 | Frecuencia/71.4 | 99% | 20/71.4 =1% | 99% |
Función de bloqueo
CÓDIGOS: indisponible
Laboratorio lógico: eLLabXUnified12Lib
Descripción
Address (USINT) Es necesario especificar la dirección del módulo sobre el que realizar la gestión PWM (Rango de 0 a 15). El valor 0 indica el primer módulo de extensión, 1 el segundo y así sucesivamente. El valor 255 indica el módulo de la CPU.
Channel (USINT) La dirección del canal debe especificarse en el módulo (Rango 0 a 15).
Frequency (REAL) Valor de la frecuencia de salida (Consultar el manual de la tarjeta utilizada). El valor se expresa en Hz.
Duty (REAL) Valor del ciclo de trabajo de la señal de salida, ajustado a 50 si se utiliza como generador de frecuencia. El valor se expresa en %.
Done (BOOL) Generador PWM configurado correctamente.
Fault (BOOL) Error en la ejecución
Ejemplos
Cómo utilizar los ejemplos..
ST_SysSetPWMOut: El canal 0 (Out 00) del módulo de la CPU está configurado para generar una señal PWM de 100 Hz con un ciclo de trabajo del 50 %.
ST_PWMOutPulsesCount: Usando un contador conectado a la salida PWM es posible bloquear o modificar la frecuencia de salida después de un número preestablecido de pulsos. Como se puede ver en el diagrama, la salida DO00 del PWM está conectada a la entrada Di00 del contador.
Se generan 4 pulsos a 100 Hz, seguidos de 3 pulsos a 200 Hz y finalmente 2 pulsos a 50 Hz, luego la salida se pone a cero, simulando el comando de paso, arranque, avance, desaceleración y parada de motores. La lectura del contador debe realizarse dentro de la duración de 1 pulso (a 200 Hz cada 5 mS) por lo que el programa debe ejecutarse en Tarea rápida.
Laboratorio lógico (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]
Laboratorio lógico (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]