SysSetPWMOut, defina a saída PWM

Lista

Esta página faz parte do Manual de Programação IEC 61131-3. Acesse o índice.

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óduloCanais PWMNote
PCB050-MPS1311OUT0, faixa de frequência 5Hz÷3kHz
PCB053-MPS1351OUT0, faixa de frequência 5Hz÷3kHz
PCB054-MPS1372OUT0÷1, faixa de frequência 5Hz÷3kHz
PCB056-MPS1412OUT0÷1, faixa de frequência 5Hz÷3kHz
PCB124 * 0104 (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ódulomínimo de serviçodever máximoServiço mínimo (20 Hz)Serviço Máximo (20 Hz)
MPS054-PCB137, MPS056-PCB1411%100-(Freq/27.2)1%100-(20/27.2)=99%
PCB124 * 010Freq/71.499%20 / 71.4 =1%99%
Círculo de Informação

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

Imagem de SysSetPWMOut FB

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.

Ligações para ST_PWMOutPulsesCount
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]
Esse artigo foi útil?