Modulação por largura de pulso (ou PWM, abreviação de Pulse Width Modulation), é uma modulação que permite obter um valor médio dependendo da relação entre a duração do impulso positivo e negativo (ciclo de trabalho).
Este bloco de função gerencia o circuito PWM de hardware presente em alguns módulos (Só pode ser usado em módulos que possuem gerenciamento PWM de hardware), não deve ser confundido com o CE PWMOut, PWM output management que em vez disso cria um software PWM (muito menos desempenho em frequência), mas que pode ser usado com qualquer saída lógica. Para habilitar as saídas opcionais, o código de proteção deve ser solicitado, consulte função e proteção de bloco funcional. No entanto, é possível usá-los livremente em modo de teste por 15 min.
O FB permite a definição do valor da frequência Frequency e ciclo de serviço Duty do gerador PWM no módulo e canal indicados. A faixa de valores depende do módulo utilizado e em geral teremos.
- Frequency:=0, o gerador PWM encerra o período atual e redefine a saída.
- Duty:=0, o gerador PWM encerra o período atual e desativa a saída.
- Duty:=100, o gerador PWM termina o período atual e ativa a saída.
- Duty:=50, o gerador PWM tenta manter o ciclo de trabalho em 50% em todos os valores de frequência, frequência do gerador.
Módulos com saída PWM
Esse FB opera apenas em módulos que implementam gerenciamento de hardware PWM, abaixo de uma tabela de resumo.
Código do módulo | Canais PWM | Note |
---|---|---|
PCB050-MPS131 | 1 | OUT0, faixa de frequência 5Hz÷3kHz |
PCB053-MPS135 | 1 | OUT0, faixa de frequência 5Hz÷3kHz |
PCB054-MPS137 | 2 | OUT0÷1, faixa de frequência 5Hz÷3kHz |
PCB056-MPS141 | 2 | OUT0÷1, faixa de frequência 5Hz÷3kHz |
PCB124 * 010 | 4 (dos quais 3 opção) | OUT0÷3, faixa de frequência 8Hz÷5kHz |
Configuração do ciclo de trabalho
Os módulos têm saídas opto-isoladas, portanto, são gerados atrasos nas bordas de subida e descida que, à medida que a frequência aumenta, reduzem a faixa configurável do ciclo de trabalho. Devido aos atrasos à medida que a frequência aumenta, a granularidade das configurações de frequência e serviço aumenta.
Código do módulo | mínimo de serviço | dever máximo | Serviço mínimo (20 Hz) | Serviço Máximo (20 Hz) |
---|---|---|---|---|
MPS054-PCB137, MPS056-PCB141 | 1% | 100-(Freq/27.2) | 1% | 100-(20/27.2)=99% |
PCB124 * 010 | Freq/71.4 | 99% | 20 / 71.4 =1% | 99% |
Bloqueio de função
CoDeSys: Indisponível
Laboratório de lógica: eLLabXUnified12Lib
descrição
Address (USINT) É necessário especificar o endereço do módulo no qual realizar o gerenciamento PWM (Faixa de 0 a 15). O valor 0 indica o primeiro módulo de extensão, 1 o segundo e assim sucessivamente. O valor 255 indica o módulo da CPU.
Channel (USINT) O endereço do canal deve ser especificado no módulo (Faixa 0 a 15).
Frequency (REAL) Valor da frequência de saída (Consulte o manual da placa utilizada). O valor é expresso em Hz.
Duty (REAL) Valor do ciclo de trabalho do sinal de saída, definido como 50 se usado como um gerador de frequência. O valor é expresso em %.
Done (BOOL) Gerador PWM configurado corretamente.
Fault (BOOL) Erro na execução
Exemplos
Como usar os exemplos.
ST_SysSetPWMOut: O canal 0 (Out 00) do módulo da CPU é configurado para gerar um sinal PWM de 100 Hz com ciclo de trabalho de 50%.
ST_PWMOutPulsesCount: Usando um contador conectado à saída PWM é possível bloquear ou modificar a frequência de saída após um número pré-definido de pulsos. Como pode ser visto no diagrama, a saída DO00 do PWM é conectada à entrada Di00 do contador.
São gerados 4 pulsos em 100Hz, seguidos de 3 pulsos em 200Hz e por fim 2 pulsos em 50Hz, então a saída zera, simulando o comando de passo, partida, avanço, desaceleração e parada de motores. A leitura do contador deve ser realizada na duração de 1 pulso (a 200Hz a cada 5mS) portanto o programa deve ser executado em Tarefa rápida.
LogicLab (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]
LogicLab (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]