Escolar Documentos
Profissional Documentos
Cultura Documentos
ISSN: 2525-8761
RESUMO
Neste trabalho foi implementado um módulo gerador de sinais PWM (Modulação por
largura de pulso - Pulse Width Modulation) em uma plataforma de hardware
reconfigurável. Foi utilizado a linguagem de descrição Verilog em um FPGA (Field-
Programmable Gate Array) Spartan 6 XC6SLX9 da Xilinx. Foram obtidos resultados
experimentais que indicam que o módulo implementado é eficiente na geração de sinais
de PWM, possuindo boa precisão no controle do ciclo de trabalho e frequência dos sinais
ABSTRACT
In this work, a PWM (Pulse Width Modulation) signal generator module was
implemented on a reconfigurable hardware platform. The language of description Verilog
was used in an FPGA (Field-Programmable Gate Array) Spartan 6 XC6SLX9 from
Xilinx. Experimental results were obtained that indicate that the implemented module is
efficient in the generation of PWM signals, having good precision in the control of the
work cycle and frequency of the generated PWM signals presenting, with errors below
2% in comparison with the expected theoretical values.
1 INTRODUÇÃO
Uma das maiores aplicações na indústria consiste no controle de potência em
cargas. Por exemplo, pode-se controlar o quanto de potência deve-se fornecer a um motor
DC (Direct Current) de forma a ajustar a sua velocidade de rotação ou seu conjugado
eletromecânico.
No cenários listado anteriormente, deve-se ter alguma lógica que, a partir de sinais
medidos, possa realizar o controle adequado de atuadores no sistema. Neste caso, uma
técnicas mais utilizadas para esse fim é o PWM (Pulse Width Modulation).
Conforme [1], a técnica PWM consiste em variar a largura de uma sequência de
pulsos de acordo com alguma informação. A técnica PWM possui várias aplicações na
área de eletrônica. Como exemplos, pode-se citar:
Controle de transistores em fontes chaveadas;
Controle de velocidade de motores;
Controle de luminosidade em ambientes;
Controle de servos-motores.
Existem vários métodos possíveis para se gerar sinais PWM. Um método bastante
conhecido consiste na utilização de componentes analógicos, como amplificadores
operacionais e transístores [2]. Embora simples, os métodos analógicos apresentam
alguns problemas, como [3]:
São bastante afetados pelo ruído e por fatores externos, como temperatura;
Não são facilmente embarcadas;
Não permitem o ajuste das características dos sinais PWM de forma fácil.
Uma solução para esses problemas consiste em utilizar um sistema digital que
implemente um sinal PWM.
Os métodos digitais para gerar sinais PWM são amplamente difundidas na
indústria. Em particular, eles estão presentes em vários microcontroladores comerciais,
como os da família PIC [4]. As técnicas digitais para geração de sinais PWM baseiam-se
na utilização de circuitos contadores e comparadores, sendo bastante imunes ao ruído,
além de facilmente embarcadas em sistemas maiores.
Ronald et al. [5] aponta dentre as vantagens na utilização de métodos digitais em
detrimento de métodos analógicos:
Facilidade em serem projetados;
Facilidade no armazenamento de informações;
Thomas e Moorby [9] nos diz que a linguagem Verilog proporciona ao projetista
de sistema digital a flexibilidade de descrever um sistema digital em vários níveis de
abstração e, ao mesmo tempo, fornece acesso às ferramentas de projeto auxiliadas por
computador para auxiliar no processo de projeto nesses níveis.
Diante disto, este trabalho tem como objetivo geral implementar um módulo de
controle PWM em uma plataforma de hardware reconfigurável utilizando a linguagem
de descrição de hardware Verilog e analisar o comportamento do sistema
implementado. O ambiente de desenvolvimento será o ISE® Design Suite da Xilinx. O
ISE® Design Suite, além de fornecer ambiente de desenvolvimento, permite a realização
de todas as etapas envolvidas no projeto de um sistema digital, desde a descrição de sua
lógica, simulação do circuito desenvolvido e gravação do projeto em um dispositivo
lógico programável.
Segundo Ibrahim [4], um sinal PWM é basicamente uma forma de onda quadrada
com um período e ciclo de trabalho especificados. Desta forma, um ciclo de sinal PWM
é dividido em um intervalo desligado e outro ligado, como apresentado na Figura 2.
Figura 2 - Sinal típico de um PWM.
TON
VDC = VCC (1)
TPWM
em que que TON é o tempo que o sinal PWM está em nível lógico ALTO e TPWM é o
período do sinal PWM, VDC é a tensão média obtida e VCC é tensão de alimentação do
circuito PWM. Igualmente, se denominarmos:
TON
D= (2)
TPWM
A Figura 3 apresenta alguns exemplos de sinais PWM que podem ser gerados.
Quanto maior o ciclo de trabalho, maior será o valor médio da onda PWM.
e, portanto, o ciclo de trabalho D do sinal PWM gerado pode ser determinado como:
f CLK
f PWM = (6)
PERIOD + 1
Variáveis de controle
do multiplexador Pre-Scaler
p1 p0
0 0 fCLK
0 1 fCLK/4
1 0 fCLK/16
1 1 fCLK/32
fCLK
f PWM = (7)
PRE ( PERIOD + 1)
4 MATERIAIS E METODOLOGIA
Para a implementação do módulo de geração de sinais PWM proposto, foi
utilizado uma FPGA Spartan 6 XC6SLX9 da Xilinx, presente em um kit de
desenvolvimento Mimas V2 da Numato Lab, apresentado na Figura 7.
4 RESULTADOS E DISCURSÕES
Após a implementação do sistema em Verilog, realizou-se um conjunto de testes,
variando-se os valores de PERIOD, CYCLE_ON e do Pre-Scaler, de forma a obter
diferentes valores de frequência de sinal PWM e de ciclo de trabalho. Os sinais PWM
foram medidos através do osciloscópio Hantek modelo 6022BE. A Figura 8 ilustra a
bancada de testes referentes as medições. Em cada um dos casos, foi observado os valores
do (i) ciclo de trabalho, (ii) frequência do sinal PWM e (iii) valor médio DC. Os resultados
práticos foram comparados com aqueles obtidos via simulação e pela análise teórica. Em
todos os casos, o sinal de relógio possui uma frequência de fCLK = 100 MHz e o nível
lógico ALTO é representado por VON = 3,3 V.
CYCLE _ ON 20
D= = = 0,1 (8)
PERIOD 200
VDC = DVON = 0,1 ( 3,3 V ) = 0,33 V (9)
1
f PWM , SIM = = 15,5 kHz (11)
121,865 s − 57,545 s
64, 265 s − 57,545 s
DSIM = = 0,1 (12)
121,865 s − 57,545 s
Figura 9 – Resultados de simulação considerando PRE = 32, PERIOD = 200 e CYCLE_ON = 20.
Figura 10 – Resultados medidos considerando PRE = 32, PERIOD = 200 e CYCLE_ON = 20.
CYCLE _ ON 100
D= = = 0,5 (13)
PERIOD 200
VDC = DVON = 0,5 ( 3,3 V ) = 1,65 V (14)
1
f PWM , SIM = = 15,5 kHz (16)
96, 265 s − 31,945 s
64, 265 s − 31,945 s
DSIM = = 0,5 (17)
96, 265 s − 31,945 s
Figura 11 – Resultados de simulação para PRE = 32, PERIOD = 200 e CYCLE_ON = 100
Figura 12 – Resultados medidos considerando PRE = 32, PERIOD = 200 e CYCLE_ON = 100.
CYCLE _ ON 100
D= = = 0,5 (18)
PERIOD 200
VDC = DVON = 0,5 ( 3,3 V ) = 1,65 V (19)
1
f PWM , SIM = = 31,1 kHz (21)
48,185 s − 16, 025 s
32,185 s − 16, 025 s
DSIM = = 0,5 (22)
48,185 s − 16, 025 s
Figura 13 – Resultados de simulação para PRE = 16, PERIOD = 200 e CYCLE_ON = 100.
Figura 14 – Resultados medidos considerando PRE = 16, PERIOD = 200 e CYCLE_ON = 100.
Por sua vez, a Tabela 3 representa o ciclo de trabalho, tanto dos resultados medidos
como teóricos, bem como o valor de erro relativo para cada uma das amostras e o erro
relatório médio de todas as medições. Nota-se que o erro relativo médio foi inferior a
5,3%, o que, novamente, demonstra uma boa precisão do módulo projetado.
Por fim, a Tabela 4 representa a frequência do sinal PWM gerado, tanto dos
resultados medidos como teóricos, bem como o valor de erro relativo para cada uma das
amostras e o erro relatório médio de todas as medições. Nota-se que o erro relativo médio
foi inferior a 4%, o que, novamente, demonstra uma boa precisão do módulo projetado.
5 CONCLUSÕES
Diante dos valores obtidos experimentalmente, podemos concluir que o sistema
criado e métodos utilizados para implementação oferece ótimo desempenho. Além do
mais, por utilizar equipamentos de baixo custo, tem-se uma viabilidade maior para
utilização deste método de obtenção de circuitos.
No tocante as comparações de valores experimentais e teóricos, tem-se erros
muito pequenos, o que nos leva a concluir que o circuito obtido e método utilizado é
viável e oferece desempenho esperado.
Em trabalho futuros, pretende-se utilizar o módulo projetado de forma a realizar
o controle de um motor de corrente contínua.
REFERÊNCIAS
1. BARR, Michael. Pulse Width Modulation. Embedded Systems Programming.
Beginner’s Corner. 2001. Disponível: <
http://homepage.cem.itesm.mx/carbajal/Microcontrollers/ASSIGNMENTS/reading
s/ARTICLES/barr01_pwm.pdf>. Acesso em: 02 de Jan. de 2020.
2. NILSSON J. W.; RIEDEL S. A. Circuitos elétricos. 8ª ed. São Paulo: Pearson, 2009.
3. OPPENHEIM, Alan V; SCHAFER, Ronald W. Digital Signal Processing, Prentice-
Hall, 1975.
4. IBRAHIM, Dogan. Advanced PIC microcontroller projects in C: from USB to RTOS
with the PIC 18F Series. Newnes, 2011.
5. TOCCI, Ronald J.; WIDMER, Neal S.; MOSS, Gregory L. Sistemas Digitais
Sistemas e Aplicações. 11ª Ed. São Paulo. Pearson 2011.
6. VAHID, Frank. Sistemas Digitais. Bookman Editora, 2009.
7. Spartan-6 FPGA Family. Disponível em: <https://www.xilinx.com/products/silicon-
devices/fpga/spartan-6.html>. Acesso em: 04 de abr. de 2021.
8. BROWN, Stephen D. Fundamentals of digital logic with Verilog design. Tata
McGraw-Hill Education, 2007.
9. THOMAS, Donald, and Philip Moorby. The Verilog Hardware Description
Language. Springer Science & Business Media, 2008.
10. MAGALHÃES, Gabriel V. Novaes. Uma Arquitetura PWM em VHDL.
Embarcados. 2016. Disponível em: <https://www.embarcados.com.br/uma-
arquitetura-pwm-em-vhdl/>. Acesso em: 18 de Jan. de 2020.
end
counter32 <= counter32 + 4'b1;
if(counter32 == 4'd15) begin
counter32 <= 4'd0;
clk32 <= ~clk32;
end
end
end
endmodule
module basic_pwm(clk, rst, enable, cycle_on, period, pwmout);
input clk, rst, enable;
input [7:0] cycle_on, period;
output reg pwmout;
reg [7:0] counter;
wire [7:0] cycleoff;
assign cycleoff = period - cycle_on - 1;
always @(posedge clk, negedge rst) begin
if(~rst) begin
pwmout <= 1'b0;
counter <= 8'd0;
end
else if(enable) begin
counter <= counter + 8'd1;
if(cycle_on >= period) pwmout <= 1'b1;
else if(counter == cycleoff) pwmout <= 1'b1;
else if(counter == period) begin
pwmout <= 1'b0;
counter <= 8'd0;
end
end
else begin
counter <= 8'd0;
pwmout <= 1'b0;
end
end
endmodule
initial begin
clk = 0;
rst = 1;
enable = 1;
cycle_on = 100;
period = 200;
pre = 2'b10;
#10
rst = 0;
#100
rst = 1;
#200000
$finish;
end
always begin
#5 clk = ~clk;
end
endmodule