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:
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)
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.
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.
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.
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 .
1 2 3 4 |
---------------- 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
---------------- 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:
1 2 3 4 5 6 |
---------------- 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
-- 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
-- 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; |
1 2 3 4 5 6 7 8 |
-- 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
-- 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.
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.
A atribuição de pinos projetada para o sistema é mostrada na figura seguinte:
Após a compilação e a gravação, pode-se montar a estrutura do sistema, que deve ser como mostrado na figura abaixo.
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.
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.
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
Modulação por Largura de Pulso, áudio em inglês)
( exemplo usando motor, áudio em inglês)
(áudio em inglês)
Artigo do Portal FPGA Para Todos.
Anexo
Projeto completo
Download Versão Demo do Proteus 8.
http://www.labcenter.com/download/prodemo_download.cfm#professional