Você está na página 1de 23

Brazilian Journal of Development 40055

ISSN: 2525-8761

Implementação de um módulo PWM digital configurável em uma


plataforma FPGA

Implementation of a configurable digital PWM module on an FPGA


platform
DOI:10.34117/bjdv7n4-460

Recebimento dos originais: 07/03/2021


Aceitação para publicação: 01/04/2021

Adriano Bezerra Pessoa


Graduando em Engenharia de Computação (UFERSA). Bacharel em Ciência e
Tecnologia (UFERSA).
Universidade Federal Rural do Semi-Árido, Pau dos Ferros - RN, Brasil
E-mail: adrianobpessoa@gmail.com

Pedro Thiago Valério de Souza


Doutor em Engenharia Elétrica e da Computação (UFRN). Professor da Universidade
Federal Rural do Semi-Árido (UFERSA), Campus Pau dos Ferros.
Universidade Federal Rural do Semi-Árido, Pau dos Ferros - RN, Brasil
E-mail: pedro.souza@ufersa.edu.br

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

Palavras chave: PWM gerados apresentando, com erros inferiores a 2% em comparação


com os valores teóricos esperados.

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.

Keyword: FPGA, Verilog, PWM, Hardware Description Language, RTL, Digital


Systems.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40056
ISSN: 2525-8761

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;

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40057
ISSN: 2525-8761

O sistema tem maior facilidade de manter a exatidão e precisão;


As operações podem ser programadas;
São menos afetados por ruídos;
Chips digitais podem ser fabricados com mais dispositivos internos.
Em um sistema prático, o circuito digital resultante para gerar um sinal PWM deve
ser implementado através de alguma forma física. Existem várias técnicas para se
implementar um sistema digital. Em particular, pode-se utilizar Dispositivos Lógicos
Programáveis (PLD - Programmable Logic Devices) para esse fim.
Um Dispositivo Lógico Programável consiste em um circuito integrado (CI) no qual
pode-se definir a função realizada através de conexões realizadas pelo projetista [5].
Nesse caso, todas as camadas do circuito já estão prontas e a partir da utilização dos
ambientes de desenvolvimento, pode-se criar ou destruir conexões no CI de forma a
implementar as funcionalidades desejadas.
Vahid (2009, p. 428) [6] expõe que PLDs não só permitem a obtenção de um projeto
digital mais fácil, como também podem ser reprogramados, o que permite modificar o
circuito a todo momento ou reutilizar o PLD após utilizar o mesmo outro projeto
anteriormente.
Conforme Tocci et al. [5], os PLDs são subdivididos em três tipos diferentes:
SPLD – Simple Progammable Logic Devices;
CPLD – Complex Progammable Logic Devices;
FPGA – Field Progammabable Gate Arrays.
Como opção, para o desenvolvimento deste trabalho utilizou-se uma FPGA Spartan
6 XC6SLX9 da Xilinx. Além das vantagens inerentes de um FPGA, esse em específico,
de acordo com seu datasheet, oferece uma alta contagem de entradas e saídas,
desempenho rápido, baixo consumo de energia, além de fornecer soluções programáveis
e ajuste confiável em comparação com outros FPGAs [7].
Devido utilizar uma FPGA, será necessária uma Linguagem de Descrição de
Hardware ou HDL - hardware description language. Segundo Brown [8], uma linguagem
de descrição de hardware é semelhante a uma linguagem de programação, exceto que
uma HDL é usada para descrever o hardware em vez de um programa que será executado
em um computador. De acordo com Brown [8], o VHDL e Verilog são as duas HDLs
padronizadas pela IEEE (Institute of Electrical and Electronic Engineers). Neste trabalho,
a linguagem utilizada para a implementação foi o Verilog.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40058
ISSN: 2525-8761

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.

2 CONCEITOS SOBRE PWM


Do ponto de vista didático, a técnica PWM pode ser vista como uma chave
controlada, conforme apresentado na Figura 1 [10]. Remetendo a Figura 1, quando a
chave está ligada, 100% da tensão da fonte é aplicada ao motor. Quando a chave está
aberta, nenhuma tensão é aplicada ao motor. Dessa forma, se quiséssemos fazer com que
fosse aplicado 50% da tensão de entrada nos terminais do motor, bastaria fazer com que
a chave fique 50% do tempo ligada e 50% do tempo desligada. A técnica PWM permite,
assim, o controle de quanta tensão é aplicada ao motor. É possível obter outros valores
de tensão, desde que a relação entre tempo de chave ligada e desligada seja corretamente
ajustado.

Figura 1 - Esquema didática para explicação da técnica PWM.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40059
ISSN: 2525-8761

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.

A tensão média de saída depende da razão do intervalo de tempo em que o sinal


PWM permanece em nível lógico ALTO pelo intervalo de tempo em que o sinal PWM
permanece em nível lógico BAIXO. Assim, para determinarmos a tensão média temos
que:

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

como ciclo de trabalho (ou Duty Cicle) [10], então:

VDC = VCC D (3)

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.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40060
ISSN: 2525-8761

Figura 3 – Alguns exemplos típicos de sinais PWM.

3 GERAÇÃO DE SINAIS PWM EM PLATAFORMAS DIGITAIS


Uma forma simples para a geração de um sinal PWM consiste em utilizar um
contador de pulsos de relógio, e a partir da comparação do valor desse contador, fazer
com que o sinal PWM de saída fique em nível lógico ALTO ou BAIXO [10]. De forma
a entender o princípio de funcionamento dessa estrutura, apresenta-se a Figura 4, em que
se ilustra um sinal de relógio, indicado por CLK, a saída de um contador de pulsos,
indicado por COUNTER e o sinal PWM gerado, indicado por PWM_OUT.

Figura 4 – Esquema simplificado de geração de sinais PWM.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40061
ISSN: 2525-8761

Inicialmente o contador armazena o valor hexadecimal 0x00 e a saída PWM está


em nível lógico BAIXO. A cada pulso de relógio, o contador incrementa o seu valor.
Quando o contador atingir um determinado valor, indicado pela variável CYCLE_OFF, a
saída PWM vai para o nível lógico ALTO. Após isso, quando o contador atingir um outro
determinado valor, indicado pela variável PERIOD, a saída PWM vai para o nível lógico
BAIXO e o contador é zerado, de forma que a contagem inicia novamente em 0x00 e o
processo se repete [10].
Uma estrutura simples para implementar o comportamento descrito é apresentada
na Figura 5, em que se utiliza dois registradores, de forma a armazenar os valores
CYCLE_OFF e PERIOD, um contador de pulsos, indicado por COUNTER, e um Latch
SR. Quando COUNTER = CYCLE_OFF, a entrada S no Latch vai para nível lógico
ALTO, fazendo com que a saída vá para nível lógico ALTO. Por sua vez, quando
COUNTER = PERIOD, a entrada R no Latch vai para nível lógico ALTO, fazendo com
que a saída vá para nível lógico BAIXO.

Figura 5 – Esquema simples para geração de sinais PWM. Adaptado de [10].

Nesse cenário, a quantidade de contagens no qual o sinal PWM permanece em


nível lógico ALTO pode ser determinada como:

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40062
ISSN: 2525-8761

CYCLE _ ON = PERIOD − CYCLE _ OFF − 1 (4)

e, portanto, o ciclo de trabalho D do sinal PWM gerado pode ser determinado como:

CYCLE _ ON PERIOD − CYCLE _ OFF − 1


D= = (5)
PERIOD PERIOD

A frequência do sinal PWM, fPWM, resultante é determinada por:

f CLK
f PWM = (6)
PERIOD + 1

sendo fCLK a frequência do sinal de relógio do sistema.


Analisando-se a Equação 5, observa-se que a frequência do sinal PWM é
determinada em função da frequência de relógio do sistema e do valor de PERIOD.
Todavia, em muitas situações práticas, deseja-se uma frequência de sinal PWM que não
pode ser estabelecida alterando-se unicamente esses valores. De forma a gerar uma maior
flexibilidade do sistema de geração de PWM proposto pode-se utilizar um Pre-Scaler.
Um Pre-Scaler (PS) é um dispositivo de hardware que permite dividir uma certa
frequência de relógio por algum fator inteiro. Por exemplo, utilizando um PS pode-se
gerar o sinal de relógio de 3,125 MHz dividindo-se um sinal de 50 MHz por 16.
Um Pre-Scaler pode ser implementado através de um conjunto de contadores e
um multiplexador de saída [10]. Neste trabalho utilizou-se um Pre-Scaler com fatores de
divisão de 4, 16 e 32. Dessa forma, necessitou-se de duas variáveis de controle para o
multiplexador, que foram alocadas de acordo com a Tabela 1.

Tabela 1 - Tabela de Operação para o Pre-Scaler projetado.

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

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40063
ISSN: 2525-8761

Com a utilização do Pre-Scaler, a frequência do sinal PWM resultante é determinada por:

fCLK
f PWM = (7)
PRE ( PERIOD + 1)

em que PRE é o fator no qual a frequência de relógio fCLK é dividida.


A Figura 6 apresenta a arquitetura de geração de sinais PWM proposta nesse
trabalho. A arquitetura possui duas entradas de 8 bits, denominadas de PERIOD e
CYCLE_ON que corresponde, respetivamente, a quantidade total de contagens do PWM
e quantas contagens o sinal permanece em nível lógico ALTO. Preferiu-se utilizar o valor
de CYCLE_ON como entrada ao invés de CYCLE_OFF pois, desta forma, o cálculo do
ciclo de trabalho é realizado de forma natural. Todavia, como a comparação do contador
de pulsos é realizada com CYCLE_OFF, deve-se gerar esse valor a partir de CYCLE_ON.
Dessa forma, utilizou-se um subtrator, indicado na Figura 6 por SUB, que a partir dos
valores de PERIOD e CYCLE_ON, gera o valor de CYCLE_OFF, conforme apresentado
na Equação (4).

Figura 6 - Arquitetura gerador de sinal PWM proposta. Baseado em [10].

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40064
ISSN: 2525-8761

O valor do Pre-Scaler é ajustado a partir de uma entrada de 2 bits, que controla o


multiplexador de seleção de relógio. O sinal de relógio do Pre-Scaler será utilizado como
gatilho para o contador de pulsos COUNTER. Todos os outros elementos da arquitetura
utilizam o sinal de relógio de entrada, ou seja, o sinal CLK.
Adicionalmente, na arquitetura, está presente dois sinais de controle - RST e
ENABLE. O sinal RST zera todos os valores dos registradores internos do gerador PWM,
reiniciando o processo de geração de sinais PWM. Em todos os elementos, o sinal RST é
assíncrono com o relógio. Por sua vez, o sinal ENABLE habilita a saída do sinal PWM.
Quando ENABLE = 0, a saída PWM será igual a zero, correspondendo a um ciclo de
trabalho de 0%. Quando ENABLE = 1, o ciclo de trabalho da onda PWM é regido pela
Equação (5).

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.

Figura 7 – Kit de desenvolvimento utilizado neste trabalho.

Para o desenvolvimento dos códigos em Verilog, bem como a análise e síntese


dos arquivos do projeto, foi utilizado o software ISE® Design Suite da Xilinx versão
14.7.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40065
ISSN: 2525-8761

De forma a analisar a forma de onda de saída do circuito implementado no CPLD,


utilizou-se um osciloscópio da Hantek modelo 6022BE, que possui largura de banda de
20 MHz e taxa de amostragem de 48 MS/s.
Inicialmente, implementou-se o módulo gerador de sinais PWM em Verilog,
apresentado conforme a Figura 6. Os códigos em Verilog referentes a esse projeto estão
listados no Anexo A deste trabalho. Após isso, efetuou-se algumas simulações
computacionais, utilizando-se o iSim, simulador próprio da Xilinx. Os arquivos de teste
de bancada (testbench) referentes as simulações estão apresentadas no Anexo B. Após a
verificação funcional, implementou-se o circuito na FPGA, utilizando-se o arquivo de
constraints apresentado no Anexo C.

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.

Figura 8 – Bancada de testes montada para medição.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40066
ISSN: 2525-8761

4.1 – PRIMEIRO AMOSTRA


A primeira amostra tem como valores de entrada PERIOD = 200, CYCLE_ON =
20 e PRE = 32. Os valores do ciclo de trabalho, valor médio DC e a frequência do sinal
PWM podem ser determinados como:

CYCLE _ ON 20
D= = = 0,1 (8)
PERIOD 200
VDC = DVON = 0,1 ( 3,3 V ) = 0,33 V (9)

fCLK 100 MHz


f PWM = = = 15,5 kHz (10)
PRE ( PERIOD + 1) 32  ( 200 + 1)

A Figura 9 apresenta os resultados de simulação no iSim. Nota-se que a frequência


do sinal gerado na simulação e o ciclo de trabalho podem ser calculados como:

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

sendo, portanto, resultados condizentes com aqueles esperados na análise teórica.

Figura 9 – Resultados de simulação considerando PRE = 32, PERIOD = 200 e CYCLE_ON = 20.

A Figura 10 apresenta o resultado medido. Neste caso, observa-se que os valores


do ciclo de trabalho, frequência e tensão média se aproximam daqueles obtidos pela
análise teórica. Neste caso, a frequência do sinal PWM gerado foi de fPWM,MED = 16,13
kHz, o ciclo de trabalho foi de DMED = 0,105 e o valor médio DC é de VDC,MED = 0,348 V.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40067
ISSN: 2525-8761

Figura 10 – Resultados medidos considerando PRE = 32, PERIOD = 200 e CYCLE_ON = 20.

4.2 SEGUNDA AMOSTRA


A segunda amostra tem como valores de entrada PERIOD = 200, CYCLE_ON =
100 e PRE = 32. Os valores do ciclo de trabalho, valor médio DC e a frequência do sinal
PWM podem ser determinados como:

CYCLE _ ON 100
D= = = 0,5 (13)
PERIOD 200
VDC = DVON = 0,5  ( 3,3 V ) = 1,65 V (14)

fCLK 100 MHz


f PWM = = = 15,5 kHz (15)
PRE ( PERIOD + 1) 32  ( 200 + 1)

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40068
ISSN: 2525-8761

A Figura 11 apresenta os resultados de simulação no iSim. Nota-se que a frequência


do sinal gerado na simulação e o ciclo de trabalho podem ser calculados como:

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

sendo, portanto, resultados condizentes com aqueles esperados na análise teórica.

Figura 11 – Resultados de simulação para PRE = 32, PERIOD = 200 e CYCLE_ON = 100

A Figura 12 apresenta o resultado medido. Neste caso, observa-se que os valores


do ciclo de trabalho, frequência e tensão média se aproximam daqueles obtidos pela
análise teórica. Neste caso, a frequência do sinal PWM gerado foi de fPWM,MED = 16,13
kHz, o ciclo de trabalho foi de DMED = 0,524 e o valor médio DC é de VDC,MED = 1,67 V.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40069
ISSN: 2525-8761

Figura 12 – Resultados medidos considerando PRE = 32, PERIOD = 200 e CYCLE_ON = 100.

4.3 TERCEIRA AMOSTRA


A terceira amostra tem como valores de entrada PERIOD = 200, CYCLE_ON =
100 e PRE = 16. Os valores do ciclo de trabalho, valor médio DC e a frequência do sinal
PWM podem ser determinados como:

CYCLE _ ON 100
D= = = 0,5 (18)
PERIOD 200
VDC = DVON = 0,5  ( 3,3 V ) = 1,65 V (19)

fCLK 100 MHz


f PWM = = = 31,1 kHz (20)
PRE ( PERIOD + 1) 16  ( 200 + 1)

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40070
ISSN: 2525-8761

A Figura 13 apresenta os resultados de simulação no iSim. Nota-se que a


frequência do sinal gerado na simulação e o ciclo de trabalho podem ser calculados como:

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

sendo, portanto, resultados condizentes com aqueles esperados na análise teórica.

Figura 13 – Resultados de simulação para PRE = 16, PERIOD = 200 e CYCLE_ON = 100.

A Figura 14 apresenta o resultado medido. Neste caso, observa-se que os valores


do ciclo de trabalho, frequência e tensão média se aproximam daqueles obtidos pela
análise teórica. Neste caso, a frequência do sinal PWM gerado foi de fPWM,MED = 32,26
kHz, o ciclo de trabalho foi de DMED = 0,532 e o valor médio DC é de VDC,MED = 1,68 V.

Figura 14 – Resultados medidos considerando PRE = 16, PERIOD = 200 e CYCLE_ON = 100.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40071
ISSN: 2525-8761

4.4 ANÁLISE DE ERRO


Para uma melhor comparação entre os valores práticos e teóricos, a Tabela 2
representa a as tensões médias de saída, 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 3%, o que demonstra
uma boa precisão do módulo projetado.

Tabela 2 – Valores de tensão média teórico, medido e erro relativo.

Amostra Valor teórico Valor Medido Erro Relativo (%)


A 0,33 V 0,348 V 5,45%
B 1,65 V 1,67 V 1,21%
C 1,65 V 1,68 V 1,81%
Média: 2,82%

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.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40072
ISSN: 2525-8761

Tabela 3 – Valores de ciclo de trabalho teórico, medido e erro relativo.

Amostra Valor teórico Valor Prático Erro Relativo (%)


A 0,1 0,105 5,00%
B 0,5 0,524 4,80%
C 0,5 0,532 6,01%
Média: 5,27%

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.

Tabela 3 – Frequência do sinal PWM teórico, medido e erro relativo.

Amostra Valor teórico Valor Prático Erro Relativo (%)


A 15,5 kHz 16,13 kHz 4,06%
B 15,5 kHz 16,13 kHz 4,06%
C 31,1 kHz 32,26 kHz 3,73%
Média: 3,95%

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.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40073
ISSN: 2525-8761

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.

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40074
ISSN: 2525-8761

ANEXO A – Arquivo em Verilog do Módulo PWM Projetado


module pwm(clk, rst, enable, cycle_on, period, pre, pwmout);
input clk, rst, enable;
input [7:0] cycle_on, period;
input [1:0] pre;
output pwmout;
wire clkw;
prescaler u0 (clk, rst, pre, clkw);
basic_pwm u1 (clkw, rst, enable, cycle_on, period, pwmout);
endmodule

module prescaler(clk, rst, presel, clkout);


input clk, rst;
input [1:0] presel;
output reg clkout;
wire clk4w, clk16w, clk32w;
clockdivider u0 (clk, rst, clk4w, clk16w, clk32w);
always @* begin
case(presel)
2'b00 : clkout = clk;
2'b01 : clkout = clk4w;
2'b10 : clkout = clk16w;
2'b11 : clkout = clk32w;
default : clkout = clk;
endcase
end
endmodule

module clockdivider(clk, rst, clk4, clk16, clk32);


input clk, rst;
output reg clk4, clk16, clk32;
reg [3:0] counter4, counter16, counter32;
always @(posedge clk, negedge rst) begin
if(~rst) begin
clk4 <= 1'b0;
clk16 <= 1'b0;
clk32 <= 1'b0;
counter4 <= 4'b0;
counter16 <= 4'b0;
counter32 <= 4'b0;
end
else begin
counter4 <= counter4 + 4'b1;
if(counter4 == 4'd1) begin
counter4 <= 4'd0;
clk4 <= ~clk4;
end
counter16 <= counter16 + 4'b1;
if(counter16 == 4'd7) begin
counter16 <= 4'd0;
clk16 <= ~clk16;

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40075
ISSN: 2525-8761

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

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40076
ISSN: 2525-8761

ANEXO B – Testbench para Simulação


`timescale 1ns / 1ps
module pwm_tb;
reg clk;
reg rst;
reg enable;
reg [7:0] cycle_on;
reg [7:0] period;
reg [1:0] pre;
wire pwmout;
pwm uut ( .clk(clk), .rst(rst), .enable(enable),
.cycle_on(cycle_on), .period(period), .pre(pre), .pwmout(pwmout));

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

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021


Brazilian Journal of Development 40077
ISSN: 2525-8761

ANEXO C – Arquivo de constraints para implementação (Mimas V2)


CONFIG VCCAUX = "3.3" ;
NET "clk" LOC = V10 | IOSTANDARD = LVCMOS33 | PERIOD
= 100MHz ;
NET "cycle_on[0]" LOC = C17 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST | PULLUP; #DP 8
NET "cycle_on[1]" LOC = C18 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST | PULLUP; #DP 7
NET "cycle_on[2]" LOC = D17 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST | PULLUP; #DP 6
NET "cycle_on[3]" LOC = D18 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST | PULLUP; #DP 5
NET "cycle_on[4]" LOC = E18 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST | PULLUP; #DP 4
NET "cycle_on[5]" LOC = E16 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST | PULLUP; #DP 3
NET "cycle_on[6]" LOC = F18 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST | PULLUP; #DP 2
NET "cycle_on[7]" LOC = F17 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST | PULLUP; #DP 1
NET "period[0]" LOC = U7 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST ; #Pin 1
NET "period[1]" LOC = V7 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST ; #Pin 2
NET "period[2]" LOC = T4 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST ; #Pin 3
NET "period[3]" LOC = V4 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST ; #Pin 4
NET "period[4]" LOC = U5 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST ; #Pin 5
NET "period[5]" LOC = V5 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST ; #Pin 6
NET "period[6]" LOC = R3 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST ; #Pin 7
NET "period[7]" LOC = T3 | IOSTANDARD = LVCMOS33
| DRIVE = 8 | SLEW = FAST ; #Pin 8

NET "pwmout" LOC = R5 | IOSTANDARD = LVCMOS33 |


DRIVE = 8 | SLEW = FAST ; #Pin 5
NET "enable" LOC = T5 | IOSTANDARD = LVCMOS33 |
DRIVE = 8 | SLEW = FAST ; #Pin 6
NET "pre[1]" LOC = T9 | IOSTANDARD = LVCMOS33 |
DRIVE = 8 | SLEW = FAST ; #Pin 7
NET "pre[0]" LOC = V9 | IOSTANDARD = LVCMOS33 |
DRIVE = 8 | SLEW = FAST ; #Pin 8
NET "rst" LOC = M16 | IOSTANDARD = LVCMOS33 | DRIVE
= 8 | SLEW = FAST | PULLUP; #SW3

Brazilian Journal of Development, Curitiba, v.7, n.4, p.40055-40077 apr 2021

Você também pode gostar