Portal - FPGA para Todos

Gerador de Sinal PWM

GERADOR DE SINAL PWM COM O KIT PLD7064.

 

 

 

Resumo

 

 

A modulação por largura de pulso (PWM, de "Pulse Width Modulation") é uma técnica largamente utilizada para o controle de dispositivos e sinais, desde iluminação e acionamento de motores até áudio. Em sua forma mais simples, o PWM implica no chaveamento da entrada do circuito (alimentação ou sinal), como mostrado na figura abaixo, para uma carga resistiva R1.  Se a chave, no circuito mostrado, conduz durante um intervalo Ton, a seguir bloqueia durante um intervalo Toff, e a soma destes intervalos corresponde a um período T de funcionamento do sistema, a tensão média na carga vale:

    Tontoff

 

O parâmetro D é denominado razão cíclica da onda, e desde que Ton é maior ou igual a 0, e menor ou igual a T, então  D está compreendido no intervalo [0,1], ou seja, entre 0% e 100%.  Naturalmente, a tensão média de saída no circuito acima, está entre 0% e 100% da tensão de entrada.

Em aplicações práticas comuns, PWM pode ser usada no acionamento de motores ou outras cargas indutivas, e neste caso é necessário um circuito de proteção (D1, diodo de roda livre) contra sobretensão no transístor, como mostrado na figura abaixo. (download do arquivo para simulação no Proteus)

                                                                          circuitomotor

 

A figura abaixo mostra o diagrama esquemático (download) de um circuito simples de carga resistiva que não necessita circuito de proteção, que pode ser simulado no Proteus mesmo na versão de demonstração.

 

                                                                                        circuitocomtransistor

 

Neste artigo foi implementado um gerador de onda PWM, para o kit PLD7064, e verificamos o seu funcionamento com o uso de instrumentação simples e no acionamento de um LED. O circuito projetado é bastante versátil permitindo ampla variação da frequência de saída, até 94 KHz com o “clock” de 24 MHz do kit, e ajuste da razão cíclica com uma resolução 0,39% (corresponde ao incremento de uma unidade na contagem de 0 a 255)

 

Introdução

 

Uma forma simples de geração de PWM com um circuito digital é fazer a contagem dos pulsos de um sinal de “clock”, até certo valor máximo, e fazer um sinal de saída (a onda PWM desejada) ficar em nível alto durante uma parte inicial (ou final) da contagem, até certo valor dela, como ilustrado na figura seguinte. No caso apresentado, a contagem está sendo comparada com o valor que determina a largura do pulso alto desejado. Observe que a saída vai a nível alto no início da contagem, e volta a '0' quando a contagem atinge aquele valor de comparação.

                                                                                   anima 

 

Se uma contagem de oito bits é executada, variando de "00000000" a "11111111" ( 0 a 255, em decimal), tem-se 256 possíveis valores de comparação.  Com um projeto adequado, a razão cíclica nula (0%) poderia corresponder a um valor de comparação de 0, e a razão cíclica 100% corresponderia ao valor de 255 ("11111111").  No sistema proposto, a contagem é anulada imediatamente ao chegar a 255, e assim uma onda completa na saída corresponde a 255 períodos de "clock", não a 256.

A frequência do sinal PWM deve ser adequada ao uso que se fará dele. Podem-se desejar altas frequências no acionamento de transístores MOSFET em fontes chaveadas, ou em aplicações de áudio, ou baixas frequências (até dezenas de KHz) no acionamento de pequenos motores com transístores bipolares.   No projeto proposto, utiliza-se um contador de oito bits com função de "prescaler", ou divisor de frequência. Através da contagem até certo valor de referência, quando aquela contagem é zerada novamente, pode-se dividir a frequência do “clock” por um valor N, até 256. Para isto, aplica-se (N - 1), ou seja, um valor entre 0 e 255 como entrada de controle no bloco de “prescaler”.

Finalmente, para dar alguma flexibilidade adicional ao projeto, utilizou-se um bloco de controle de saída que permite inverter o PWM gerado, e também deixar a saída em alta impedância.

O projeto deverá ser implementado como um módulo de PWM, a ser utilizado como está, ou como bloco de projetos mais complexos, que serão apresentados brevemente neste portal.

                                                                                   gera pwm ondas

Implementação do Módulo PWM em VHDL

Descrevemos aqui, basicamente, partes do código em VHDL que implementa o módulo PWM para CPLD.

Inicialmente, apresentamos abaixo o trecho de VHDL de declaração as bibliotecas .

<br style="line-height: 115%;" />
 
---------------- Bibliotecas ----------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

O segundo trecho é a declaração da entidade ("entitiy"),  com a declaração dos sinais de entrada e saída do projeto.

---------------- Entidade ----------------
entity modulo_pwm is
 -- Sinais de Entrada
 port (
           CLK, RSTn, -- Reset é acionado em zero, (Reset negado). 
           HABILITA, -- Habilita o PWM ou deixa a saida em alta impedancia 
           INV_PWM, -- Inverte a onda
           HAB_SAIDAn --
                                 : in std_logic;
           TAXA : in std_logic_vector (7 downto 0); -- define a razao cíclica
           PRESCALER : in std_logic_vector (7 downto 0);
           -- Sinais de saida
          PWM: out std_logic
 );
end entity modulo_pwm;

Entenda que a entidade define a interface de aplicação do bloco, e corresponde ao símbolo mostrado na figura seguinte:

                                                                                  simbolo modulo pwm

 

 
---------------- Arquitetura ----------------
architecture comportamento of modulo_pwm is
        signal PRESC_ENABLE : std_logic;  -- em alto faz com quetodo pulso de “clock” aciona o gerador de PWM.
        signal PRE_PWM : std_logic;              -- sera o sinal de saida PWM, dependendo de INV_PWM e HAB_SAIDAn
begin
 

No trecho de VHDL seguinte, o processo rotulado "gera_prescaler" conta os pulsos de “clock” de entrada, e gera o sinal PRESC_ENABLE, que habilita o bloco de PWM uma vez a cada N pulsos de “clock”. É este mecanismo que permite reduzir a frequência do PWM. Se a entrada “PRESCALER” é 0 ("00000000", ou X"00" para o formato “std_logic_vector” de oito bits),  PRESC_ENABLE é sempre alto, e todo pulso de “clock” aciona o gerador de PWM.

 
-- O bloco gera_prescaler conta os pulsos de “clock” de entrada, 
 -- e gera o sinal que habilita o bloco de PWM uma vez a cada N pulsos de “clock”. 
 -- É este mecanismo que permite reduzir a frequência do PWM.
   gera_prescaler: process (CLK, RSTn, PRESCALER, HABILITA)
         variable cont_prescaler : std_logic_vector (7 downto 0):= X"00"; -- 

   begin
-- Se a entrada “PRESCALER” eh 0
 -- PRESC_ENABLE eh sempre alto, e todo pulso de “clock” aciona o gerador de PWM. 
         if PRESCALER = X"00" then 
            PRESC_ENABLE <= '1';

         elsif (RSTn = '0') then
            cont_prescaler := X"00";
            PRESC_ENABLE <= '0';

          elsif (rising_edge (CLK) and HABILITA = '1') then
             cont_prescaler := cont_prescaler + 1;
         if ( PRESCALER = cont_prescaler) then
             cont_prescaler := X"00";
             PRESC_ENABLE <= '1';
         else
             PRESC_ENABLE <= '0';
         end if;
         end if;
   end process;
 

Finalmente, abaixo, mostramos o processo que gera o PWM, a partir dos pulsos de “clock” de entrada, quando habilitado pelo PRESC_ENABLE, e com a razão cíclica determinada pela entrada TAXA.

-- Bloco que gera o sinal de PWM, a partir dos pulsos de clock 
   gera_pwm: process (CLK, RSTn, PRESC_ENABLE)
        variable CONTAGEM : std_logic_vector ( 7 downto 0) := X"00";
        variable SAIDA_PWM : std_logic := '0';

   begin
        if ( RSTn = '0') then
           CONTAGEM := X"00"; -- Reinicio da contagem..
           SAIDA_PWM := '0'; -- e do sinal PWM

       elsif ( rising_edge (CLK) and PRESC_ENABLE = '1') then
       -- Se habilitado por PRES_ENABLE, gera PWM com
       -- razao ciclica determinada por TAXA:
      if ( '0' & TAXA = CONTAGEM) then 
         SAIDA_PWM := '0';
      elsif ( CONTAGEM = X"00" ) then
        SAIDA_PWM := '1';
     end if;
     CONTAGEM := CONTAGEM + 1;
     if CONTAGEM = X"FF" then
       CONTAGEM := X"00";
     end if;
     end if;

    PRE_PWM <= SAIDA_PWM;
    end process;
 

 
-- Inverte a saida, ou a deixa em alta impedância, sob
 -- comando dos sinais INV_PWM e HAB_SAIDAn:
   ajusta_saida: PWM <=
      PRE_PWM when INV_PWM = '0' and HAB_SAIDAn = '0' else
      not PRE_PWM when INV_PWM = '1' and HAB_SAIDAn = '0' else
      'Z'; 

   end architecture comportamento;

Simulação Funcional

 

Para uma primeira verificação do funcionamento do sistema, desenvolvemos um "testbench" simples, que simula o seu comando, em algumas situações de razão cíclica e de “prescaler”. Utilize este “testbench” como ponto de partida para outros testes, e para obter uma melhor compreensão do módulo gerador de PWM.  Apresentamos aqui trechos do arquivo, que está disponível no projeto completo para "download".

Dois processos simples compõem a arquitetura do “testbench”. No primeiro, um sinal de “clock“ de 24 MHz (ou seja, um período de aproximadamente 42 ns) é gerado. 

 
-- 1: Gerador de Clock:
    gera_clock: process
    begin 
         CLK <= '0'; -- Na partida, zera sinal de clock...

         -- Agora, comeca a oscilar:
        for cont in 0 to 2200000 loop
           wait for 21 ns;
           CLK <= not CLK;
        end loop;
        wait; -- Parando este processo... 
   end process gera_clock;
 

 --2: Sinais de controle:
  controle_contador: process

  begin

    HAB_SAIDAn <= '0';
    INV_PWM <= '0'; 
    TAXA <= X"20";
    PRESCALER <= X"00";
    RSTn <= '0';
    HABILITA <= '0';
    wait for 1 ms;

    RSTn <= '1'; wait for 1ms;

   HABILITA <= '1'; wait for 1ms;

    TAXA <= X"40"; wait for 2 ms;

    TAXA <= X"01"; wait for 3 ms;

    TAXA <= X"FF"; wait for 3 ms; 

    TAXA <= X"00"; wait for 3ms;

    TAXA <= X"30"; wait for 2ms;

    PRESCALER <= X"5F"; wait for 2ms;

    INV_PWM <= '1'; wait for 3 ms;
    HAB_SAIDAn <= '1'; wait for 2 ms; 

    wait;



 end process controle_contador;

end architecture teste;
 
 

Abaixo, mostramos um pequeno trecho da simulação, e de forma de onda resultante no PWM.

                                            simulando modelsim

 

Implementação e Testes

Para um teste mais prático do módulo de PWM, apresenta-se aqui um implementação dele como um bloco de um projeto em modo de diagrama esquemático do Quartus II, gerador de um PWM de frequência fixa de aproximadamente 1 KHz. Para isto, utiliza-se um fator de “prescaler” de 95.  Este valor é aproximado, obtido pela divisão de 24 MHz por 255, e pela frequência desejada, de 1000 Hz:

24 MHz /255 /1 kHz = 94.11

A partir do arquivo MODULO_PWM, do projeto acima discutido, foi gerado um símbolo para um novo projeto, denominado PWM_MOTOR, também disponibilizado abaixo para download.  Este bloco é mostrado abaixo, juntamente com uma “LPM_CONSTANT” configurada para o valor 95, e um inversor para o sinal “HAB_SAIDA”, compatibilizando-o com o “HAB_SAIDAn” do bloco “MODULO_PWM”.  O circuito será compilado para teste com uma barra de LEDs, ou o acionamento de um motor no conector CON1 do kit, e com barras de chaves nos conectores CON2 e CON3 para entrada dos sinais:

 

  • HABILITA:Habilitação do PWM;

 

 

  • INV_PWM: Inversão do sinal na saída de PWM,

 

  • HAB_SAIDA: Habilitação da saída (“tri-state”) de PWM , e
  • DT[7..0]: Razão cíclica para o PWM.

gera pwm esquema

A atribuição de pinos projetada para o sistema é mostrada na figura seguinte:

pwm pinagem

 

Após a compilação e a gravação, pode-se montar a estrutura do sistema, que deve ser como mostrado na figura abaixo.

                                                                             DSC05739

Para teste do sistema, ajustam-se a razão cíclica desejada na barra de chaves do conector CON2. Os demais sinais são controlados na barra de chaves do conector CON3. O LED L7 da barra de LEDs terá a sua intensidade variada em função do sinal PWM gerado. Como vemos a seguir.

                                                                            conectores

Na figura abaixo, mostramos uma imagem da onda, obtida com um osciloscópio. A frequência aproximada de 1KHz, e a razão cíclica de 25%, para o ajuste efetuado nas chaves, são verificadas.

                                                                                      DSC04702

 

Conclusão

Neste artigo foi demonstrado como gerar um sinal PWM através de diferentes maneiras tais como chavear a alimentação do circuito usando uma chave (botão), ou um transistor e também usando nosso kit PLD7064, porém existem outras maneiras de gerar um sinal PWM tais como microcontrolador ou até mesmo com circuitos usando CI 555.

Foi usado um LED para demonstração do efeito do sinal sobre a carga. O sinal irá influenciar no brilho do LED. Sabendo que existe uma infinidade de outras aplicações práticas tais como fontes chaveadas, controle de acionamento de motores, áudio, iluminação. Lembrando-se de que no circuito do LED a potência é baixa e o PLD fornece energia para o circuito sem a necessidade de uma fonte externa e um circuito de acionamento, entretanto outras aplicações com um consumo maior é necessário o uso de uma fonte externa, então o sinal PWM irá acionar um circuito para ligar e desligar essa fonte através de transistor ou mosfet por exemplo. Recomenda-se a leitura de exemplos de circuitos de controle acionados via PWM. 

Videos e Artigos recomendados

 

Circuit Skills: PWM (Modulação por Largura de Pulso, áudio em inglês)

 http://www.youtube.com/watch?v=Lf7JJAAZxEU 

 

Microcontrollers - Introduction to PWM  ( exemplo usando motor, áudio em inglês)

http://www.youtube.com/watch?NR=1&feature=fvwp&v=mVx02s1fHIY

 

PWM Audio Tutorial using a FPGA (áudio em inglês)

http://www.youtube.com/watch?v=4byHVqXD-UI

 

Artigo do Portal FPGA Para Todos.

Controle de LED RGB com PWM

 

Anexo

Projeto completo

Arquivos para Download

Download Versão Demo do Proteus 8.

http://www.labcenter.com/download/prodemo_download.cfm#professional

 

 

 

 

 

 

 

 

 

 

 

 

Quem está Online

Temos 13 visitantes e Nenhum membro online

Apoio

Login Form

 

Artigos Relacionados