• Nenhum resultado encontrado

Modulação vetorial aplicada em FPGAs

N/A
N/A
Protected

Academic year: 2021

Share "Modulação vetorial aplicada em FPGAs"

Copied!
77
0
0

Texto

(1)

UNIVERSIDADE FEDERAL DO CEARÁ CENTRO DE TECNOLOGIA

DEPARTAMENTO DE ENGENHARIA ELÉTRICA BACHARELADO EM ENGENHARIA ELÉTRICA

Leonardo Andrade Chagas Cavalcante

MODULAÇÃO VETORIAL APLICADA EM FPGA’S

FORTALEZA 2019

(2)

LEONARDO ANDRADE CHAGAS CAVALCANTE

MODULAÇÃO VETORIAL APLICADA EM FPGA’S

Monografia apresentada ao Curso de Graduação em Engenharia Elétrica da Universidade Federal do Ceará, como requisito parcial à obtenção do título de Bacharel em Engenharia Elétrica.

Orientador: Prof. Dr. Paulo Peixoto Praça. .

FORTALEZA 2019

(3)
(4)

LEONARDO ANDRADE CHAGAS CAVALCANTE

MODULAÇÃO VETORIAL APLICADA EM FPGA’S

Monografia apresentada ao Curso de Graduação em Engenharia Elétrica da Universidade Federal do Ceará, como requisito parcial à obtenção do título de Bacharel em Engenharia Elétrica.

Orientador: Prof. Dr. Paulo Peixoto Praça. Aprovada em: ___/___/______.

BANCA EXAMINADORA

________________________________________ Prof. Dr. Paulo Peixoto Praça (Orientador)

Universidade Federal do Ceará (UFC)

_________________________________________ Prof. Dr. Demercil de Souza Oliveira Junior

Universidade Federal do Ceará (UFC)

_________________________________________ Prof. Dr. Davi Rabelo Joca

(5)
(6)

AGRADECIMENTOS

À minha família e amigos que me deram incentivo para chegar onde estou, em especial ao Senhor Estélio, sem o qual não teria as oportunidades que tive.

Ao meu professor orientador, pela paciência com as inúmeras revisões deste trabalho.

À minha namorada, por me apoiar e ajudar nas revisões.

À Instituição UFC por sua excelência e à banca examinadora por todas as suas contribuições.

(7)

“When it is dark enough, you can see the stars.” - Ralph Waldo Emerson

(8)

RESUMO

O presente trabalho tem como finalidade a implementação de um algoritmo de modulação vetorial em linguagem de descrição de hardware. Será abordada a importância dos métodos de modulação para inversores de frequência, destacando entre eles a modulação vetorial ou modulação em espaço de estados, em vista das vantagens que a mesma possui, como redução da distorção harmônica total e das perdas por chaveamento. É explanado o funcionamento dos FPGAs e suas vantagens em relação às outras soluções de mercado. É retratada a implementação da modulação vetorial em FPGA para o controle, em malha aberta, de um inversor trifásico de 2 níveis, alimentado em tensão. São mostrados resultados de simulação em dois softwares diferentes bem como resultados experimentais, com foco em validar a implementação desenvolvida em relação ao referencial teórico.

Palavras-chave: Modulação vetorial. FPGAs. Inversores trifásicos. Modulação em espaço de

(9)

ABSTRACT

The present paper aims to implement a space vector modulation algorithm in hardware description language. The importance of modulation methods for frequencyinverters will be addressed, highlighting among them the space vector modulation, in view of its advantages, such as the reduction of total harmonic distortion and switching losses. The FPGAs and their advantages over other market solutions are explained. The implementation of FPGA space vector modulation, for open loop control of a voltage-fed 2-level 3-phase inverter, is explained. Simulation results are shown in two different softwares as well asexperimental results, with focus on validating the developed implementation in comparison to the theoretical reference.

(10)

LISTA DE FIGURAS

Figura 1 - Exemplo de inversor trifásico alimentado em tensão. ... 15

Figura 2 - Conversor com saída em SPWM bipolar ... 16

Figura 3 - Funcionamento da modulação bipolar. ... 16

Figura 4 - Formas de onda da saída (600Hz) e a sua transformada de Fourier, 𝑓𝑠 = 5kHz. ... 17

Figura 5 - Topologia de um inversor controlado em SPWM unipolar. ... 18

Figura 6 - Resultados de simulação para SPWM unipolar 𝑓𝑠 = 5khz. ... 18

Figura 7 - Exemplo de funcionamento da SPWM unipolar ... 18

Figura 8 - Topologia alternativa para a modulação SPWM unipolar. ... 19

Figura 9 – Resultados de simulação para a topologia alternativa unipolar. 𝑓𝑠 = 5kHz ... 19

Figura 10 - Exemplo de conversor multinível e sua onda de tensão na carga V. .. 20

Figura 11 - Plano d-q e sentido de rotação do vetor de referência. ... 21

Figura 12 - Diagrama de espaço de estados para o sistema em questão... 23

Figura 13 - Saída para a modulação vetorial trifásica sem modulação por largura de pulso. ... 24

Figura 14 - Exemplo do vetor referência no sextante 1 entre V1 e V2. ... 24

Figura 15 - Topologia da SVPWM usada... 25

Figura 16 - Resultados para SVPWM com modulação contínua e simétrica (𝑓𝑆 = 7 kHz). ... 26

Figura 17 - Arquitetura básica de um FPGA ... 27

Figura 18 - Exemplo de bloco lógico. ... 28

Figura 19 - Kit de desenvolvimento escolhido pelo autor e seu diagrama de blocos. ... 30

Figura 20 - Fundamentos do movimento de objetos em trajetória circular. ... 32

Figura 21 - Simulação da referência senoidal... 33

Figura 22 - Exemplo de 'iteração' do movimento circular. ... 34

Figura 23 - Correção da amplitude da senóide. ... 34

Figura 24 - Detecção de sextante. ... 35

Figura 25 - Estados da modulação vetorial... 37

(11)

Figura 27 - Fluxograma do algoritmo. ... 38

Figura 28: Motivação geométrica para o método de Newton... 40

Figura 29 - Bloco lógico criado pelo código em VHDL. ... 41

Figura 30 - Construção interna do bloco lógico criado. ... 41

Figura 31 - Referência gerada em VHDL... 42

Figura 32 - Cálculo do sextante em VHDL. ... 43

Figura 33 - Escolha dos estados para código em VHDL. ... 43

Figura 34 - Sinais de acionamento para cada um dos braços do inversor para um ângulo de 45°. ... 44

Figura 35 - Montagem feita para obtenção dos resultados experimentais... 45

Figura 36 - Referência senoidal observada. ... 45

Figura 37 - Definição do sextante atual observado. ... 46

Figura 38 - Sequências de chaveamento para cada sextante. ... 47

Figura 39 - Sinais de tensão após o filtro RC. ... 48

(12)

SUMÁRIO 1 INTRODUÇÃO ... 13 2 TÉCNICAS DE MODULAÇÃO ... 15 2.1 Modulação SPWM bipolar ... 15 2.2 Modulação SPWM unipolar ... 17 2.3 Modulação SPWM multinível ... 20 2.4 Modulação SVPWM ... 21 3 FPGA’S ... 27 3.1 Princípios construtivos ... 27 3.2 VHDL ... 29

3.3 Kit de desenvolvimento CYCLONE II da Altera ... 30

4 METODOLOGIA ... 31 4.1 O Algoritmo ... 31 4.2 Transição para VHDL ... 38 4.2.1 Notação Q ... 38 4.2.2 Método de Newton ... 39 5 RESULTADOS ... 42 5.1 Simulação computacional ... 42 5.2 Resultados experimentais ... 45 6 CONCLUSÃO ... 49 7 REFERÊNCIAS ... 50

(13)

1 INTRODUÇÃO

No sistema elétrico atual, conversores de potência estão presentes em inúmeras aplicações importantes, como no controle de motores de indução, em inversores de frequência para geração solar fotovoltaica, em geradores eólicos, entre outros. Tais conversores são usados quando existe a necessidade do controle preciso de alguma variável chave no sistema, como o nível de tensão, frequência, ângulo de fase, potências ativa e reativa.

O controle dessas variáveis é feito, em grande parte, pelos algoritmos de modulação executados nos controladores dentro de cada conversor.

Uma das maneiras como se pode melhorar a performance de um conversor é o aumento no número de chaves, principalmente em aplicações de alta potência e alta tensão, como em sistemas de transmissão em corrente contínua. Embora tal aumento possa gerar melhoras de performance, o elevado número de sinais simultâneos necessários para acionar todas as chaves é uma grande dificuldade para os controladores, cuja escolha durante o projeto do conversor acaba por se tornar bastante difícil, tendo em vista, entre outros pontos, a comum limitação no número de saídas PWM (pulse width modulation, modulação por largura de pulso).(Holmes e Lipo, 2010)

Este documento reforça a alternativa do uso de FPGAs para o controle de conversores de potência, visto que os mesmos tem a capacidade de executar inúmeras operações em paralelo, sem nenhum comprometimento de performance e quase todos os seus pinos podem ser usados como saídas PWM.

O presente trabalho tem como premissa principal o desenvolvimento de um código para implementação da modulação vetorial aplicada a inversores de frequência, a ser executado em um sistema de hardware reconfigurável sem uso de memória externa.

O escopo deste trabalho compreende:

• Compreender a teoria que baseia as técnicas de modulação para conversores CC-CA e em específico a modulação vetorial.

• Criar um código em C dentro do software PSIM para avaliar as vantagens da modulação vetorial e os seus desafios.

• Adaptar tal código para uma linguagem de descrição de circuitos digitais VHDL (Very high speed integrated circuit Hardware Description Language em português, linguagem de descrição construtiva de circuitos integrados de alta velocidade) que pode ser usada para programar FPGAs.

(14)

No capítulo 2 serão descritos os princípios básicos das técnicas de modulação usadas para inversores de frequência, além das vantagens e desvantagens de cada método.

No capítulo3 serão explicados os princípios de funcionamento dos FPGA’s e como a implementação de código a nível de hardware pode superar a implementação tradicional em software.

No capítulo 4 serão descritas todas as ações realizadas para cumprir com os objetivos do presente do trabalho.

(15)

Figura 1 - Exemplo de inversor trifásico alimentado em tensão.

2 TÉCNICAS DE MODULAÇÃO

Conversores CC-CA, em especial inversores de frequência, como mostrado na Figura 1, possuem grande importância no sistema elétrico atual, seja em sistemas fotovoltaicos para geração distribuída e centralizada, nos acionamentos de motores de indução ou em geradores eólicos.

Na grande maioria dos inversores de frequência modernos, existe algum tipo de circuito de comando que irá gerar sinais para as chaves presentes no mesmo. A estratégia de modulação programada em tal controlador irá impactar fortemente nas características de desempenho do conversor.

Serão mostrados exemplos de técnicas de modulação para inversores de frequência, cobrindo desde as técnicas mais simples até as mais complexas, bem como explorando suas características.

2.1 Modulação SPWM bipolar

Nesta técnica de modulação PWM sinusoidal, é feita a comparação entre um valor de referência, que para inversores de frequência é o sinal senoidal desejado, e uma onda triangular, a portadora. No caso da topologia monofásica apresentada na Figura 2, o primeiro braço do conversor é acionado pelo resultado da comparação, enquanto o outro braço recebe o sinal oposto.

(16)

No período de tempo onde o sinal de referência é maior que a onda triangular, a carga é ligada diretamente ao barramento CC, produzindo uma tensão positiva na carga. Quando o valor da triangular supera a referência, as chaves opostas são acionadas, ligando inversamente a carga ao barramento CC, produzindo uma tensão negativa na carga. A Figura 3 mostra o esquema de funcionamento dessa técnica.

Na Figura 4 é mostrada a simulação computacional feita no software PSIM para tal topologia.

Figura 2 - Conversor com saída em SPWM bipolar

Figura 3 - Funcionamento da modulação bipolar.

Fonte: Próprio autor

(17)

Um ponto interessante é que esta mesma topologia também é conhecida por 'ponte completa', sendo muito usada no controle de velocidade de motores de corrente contínua, onde a referência usada será o valor de velocidade desejada.

2.2 Modulação SPWM unipolar

Outra técnica de modulação SPWM é a modulação unipolar. Nessa técnica podem ser usadas 2 referências senoidais defasadas 180° entre si. Cada referência é separadamente comparada com um mesmo sinal de portadora, e no caso do conversor monofásico mostrado na Figura 7, a saída do primeiro comparador ativa a chave 1 enquanto o segundo comparador aciona a chave 2. Como as tensões de cada braço estão defasadas 180° entre si, também estão suas componentes harmônicas, dessa forma, a saída possuirá um conteúdo harmônico reduzido, visto que as harmônicas defasadas em múltiplos pares de 180° se anularão, como pode ser visto na Figura 6, onde as harmônicas correspondentes a frequência de chaveamento se anularam.(Dário et al., 2000)

Figura 4 - Formas de onda da saída (600Hz) e a sua transformada de Fourier, 𝑓𝑠 = 5kHz.

(18)

Figura 7 - Exemplo de funcionamento da SPWM unipolar Figura 6 - Resultados de simulação para SPWM unipolar 𝑓𝑠 = 5khz.

Fonte: Próprio autor

Figura 5 - Topologia de um inversor controlado em SPWM unipolar.

Fonte: Próprio autor

(19)

Outra maneira de se executar a modulação unipolar é usando duas portadoras triangulares, ambas comparadas com a mesma senóide de referência. A topologia e os resultados desta técnica de modulação estão em Figura 8 e Figura 9 .

Como há apenas uma referência senoidal, não mais ocorre anulação de componentes harmônicas, fazendo a primeira delas ocorrer na frequência de chaveamento.

Figura 8 - Topologia alternativa para a modulação SPWM unipolar.

Figura 9 – Resultados de simulação para a topologia alternativa unipolar. 𝑓𝑠 = 5kHz

Fonte: Próprio autor

(20)

2.3 Modulação SPWM multinível

Um exemplo de topologia de conversor multinível em cascata se encontra na Figura 10onde é possível notar que o mesmo consiste de vários outros conversores full-bridge em série, idênticos aos previamente vistos.

Ainda na mesma figura é possível observar que a saída do conversor se assemelha com uma onda senoidal mesmo sem nenhum filtro, o que torna tal topologia muito útil quando se tem por objetivo a redução da distorção harmônica total no conversor.

A implementação de tal técnica de modulação se torna bastante complexa conforme o número de níveis aumenta, visto que a referência senoidal passa a ter um formato de onda complexo e o número de chaves a serem acionadas simultaneamente dificulta a escolha do hardware para implementação.(Holmes e Lipo, 2010)

Figura 10 - Exemplo de conversor multinível e sua onda de tensão na carga V.

(21)

2.4 Modulação SVPWM

A fundamentação teórica da modulação vetorial se baseia no conceito de estados. Um estado corresponde a ativação ou não de cada uma das chaves do inversor. No inversor presente na Figura 1, cada braço possui 2 chaves, em um total de 6. Como o acionamento simultâneo das duas chaves de um mesmo braço ocasionaria um curto circuito, toma-se as chaves inferiores como tendo ativação oposta à da chave superior do mesmo braço, impossibilitado que ambas estejam ativas ao mesmo tempo, assim, o número de chaves a serem controladas passa de 6 para 3. Como cada chave possui estado binário, conduzindo ou não conduzindo, temos um total de 8 combinações possíveis, que são os estados da modulação para o exemplo do conversor trifásico a 2 níveis.

Tais estados normalmente estão representados na sua forma binária: estado 0 = 000, estado 1= 001... Estado 7 = 111.Onde cada bit da palavra binária do estado indica se a chave superior de cada braço estará conduzindo (1) ou não (0).

Dos 8 estados possíveis, 2 deles (000 e 111), geram tensões de linha nulas na saída do inversor, já que cada fase possui o mesmo potencial. Os outros 6 estados são chamados de vetores ativos.

Outro conceito usado na modulação vetorial é o do plano cartesiano 𝛼 − 𝛽 𝑜𝑢 𝑑 − 𝑞, no qual um vetor de referência ficará girando no sentido anti-horário no plano, como visto na Figura 11, representando um sistema trifásico balanceado de senóides no tempo.(Holmes e Lipo, 2010)

Figura 11 - Plano d-q e sentido de rotação do vetor de referência.

(22)

Para que este vetor de referência (𝑉𝑟𝑒𝑓) represente o sistema trifásico como um todo ( 𝑉𝑎, 𝑉𝑏, 𝑉𝑐), é necessário que o mesmo atenda a fórmula (Neacsu e Iasi, 2001) :

𝑉𝑟𝑒𝑓 = 2 3(𝑉𝑎+ 𝑉𝑏. 𝑒 𝑗2𝜋 3 + 𝑉𝑐. 𝑒 𝑗4𝜋 3 ) ( 1 )

Dessa maneira, separando as coordenadas x e y do vetor referência temos a expressão matricial: [𝑉𝑉𝑟𝑒𝑓𝑥 𝑟𝑒𝑓𝑦] = 2 3 [ 1 −1 2 −1 2 0 √3 2 √3 2 ] [ 𝑉𝑎 𝑉𝑏 𝑉𝑐 ] ( 2 )

Ainda de acordo com o autor referenciado, por meio da equivalência acima citada, temos uma correspondência única entre o vetor de referência no espaço vetorial e o sistema trifásico no tempo, onde a transformação inversa nos dá:

{ 𝑉𝑎= 𝑉𝑟𝑒𝑓 + 𝑉0 𝑉𝑏 = 𝑒 𝑗2𝜋 3 . 𝑉𝑟𝑒𝑓+ 𝑉0 𝑉𝑐 = 𝑒𝑗4𝜋3 . 𝑉𝑟𝑒𝑓+ 𝑉0} ( 3 )

Onde 𝑉0 é a componente homopolar do sistema trifásico. Tal equivalência é muito importante, pois nos permite analisar todas as fases do sistema a partir de um único vetor, o que é computacionalmente menos dispendioso.

No plano 𝛼 − 𝛽 também pode-se traçar os vetores gerados por cada um dos estados de comutação. Com os 3 braços do inversor em questão, cada um representando uma das fases de um sistema com defasagem de 120°, temos um espaço vetorial com o formato de um hexágono, como mostrado na Figura 12.

(23)

Os vetores V1 ... V6 representam os estados das chaves do inversor, e possuem comprimento de 2

3𝑉𝑐𝑐.(Neacsu e Iasi, 2001).

Abaixo pode ser visto um resumo dos vetores da modulação vetorial e seus valores binários. [ 𝑉1 = [100] 𝑉2 = −𝑉5, [110] 𝑉3 = [010] 𝑉4 = −𝑉1, [011] 𝑉5= [001] 𝑉6 = −𝑉3 [101] 𝑉7 = [111] 𝑉8= [000]]

Pode ser conjecturado a modulação do inversor trifásico da Figura 1 usando, discretamente, os estados de comutação V1 a V6, como visto acima, em um ciclo, gerando uma saída com três fases defasadas de 120° como desejado. A tensão de saída deste método está na Figura 13.

Figura 12 - Diagrama de espaço de estados para o sistema em questão.

(24)

Essa estratégia de modulação pode ser representada no plano 𝛼 − 𝛽 como tendo o vetor de referência avançando discretamente entre os vetoresV1 a V6, o que leva a uma saída descontínua, sem modulação por largura de pulso e com conteúdo harmônico relevante. Para a redução de tal distorção, o algoritmo implementado deve fazer uso de mais de um vetor por período de chaveamento, assim implementando uma modulação PWM. (Holmes e Lipo, 2010) Supondo 𝑉𝑟𝑒𝑓 girando continuamente no plano 𝛼 − 𝛽 a modulação vetorial se concentra no cálculodos tempos de ativação de cada um dos vetores a serem usados num determinado sextante como na Figura 14.

Define-se um tempo total 𝑇𝑆 para a modulação do vetor de referência, e para o exemplo da Figura 14, onde os vetores adjacentes a referência são o V1 (100) e V2 (110), são definidos 𝑇1e 𝑇2. Para compor 𝑉𝑟𝑒𝑓 é feita a soma vetorial de V1 e V2 para definir os tempos de ativação de cada palavra, utilizando o tempo para executar a média ponderada, baseada na igualdade do fluxo total gerado sobre uma carga indutiva:

Figura 13 - Saída para a modulação vetorial trifásica sem modulação por largura de pulso.

Figura 14 - Exemplo do vetor referência no sextante 1 entre V1 e V2. Fonte: Próprio autor

(25)

𝑉𝑟𝑒𝑓𝑋. 𝑇𝑆 =2 3. 𝑉𝑐𝑐. 𝑇1+ cos(60°). 2 3. 𝑉𝑐𝑐. 𝑇2 ( 4 ) 𝑉𝑟𝑒𝑓𝑌. 𝑇𝑆 = sin(60°). 2 3. 𝑉𝑐𝑐. 𝑇2 ( 5 )

De posse dos valores do vetor referência e da tensão do barramento CC do inversor é possível calcular os tempos em que cada palavra estará ativa. Dependo desses valores, pode ocorrer que 𝑇1+ 𝑇2 < 𝑇𝑆, nesse caso, o tempo sobressalente é preenchido por algum dos vetores nulos (000,111).

Caso 𝑇1 + 𝑇2 > 𝑇𝑆, tem-se uma situação de sobremodulação, que pode acontecer quando o comprimento do vetor de referência é elevado para um dado barramento CC. Tal limite é representado na Figura 14 pela linha pontilhada, onde o valor máximo de 𝑉𝑟𝑒𝑓 é o cos(30°), 0.866, vezes o comprimento dos vetores ativos. Portanto, o índice máximo de modulação para esta técnica é tomado como 0,866.

Embora os tempos de ativação dos vetores sejam fixos para um dado 𝑉𝑟𝑒𝑓, a sequência com que os mesmos são usados constitui um grau de liberdade extra, não presente nas técnicas de modulação antes citadas. Para conversores multinível a implementação da SVPWM se torna menos dispendiosa do que a alternativa usando a comparação entre uma onda portadora e ondas modulantes complexas.

Um exemplo de topologia para controle de um inversor monofásico a dois níveis, por modulação vetorial, é mostrado na Figura 15.

Figura 15 - Topologia da SVPWM usada.

(26)

Na Figura 16 é possível ver que a modulação escolhida possui o cancelamento das harmônicas na frequência de chaveamento, assim como na SPWM unipolar.

Figura 16 - Resultados para SVPWM com modulação contínua e simétrica (𝑓𝑆 = 7 kHz).

(27)

3 FPGA’s

Nesta seção será feita uma introdução sobre o funcionamento dos FPGAs e da linguagem de descrição de hardware usada pelo autor para programar os mesmos, o VHDL.

3.1 Princípios construtivos

A grande maioria dos circuitos integrados de uso geral, presentes em eletrodomésticos comuns, vem de fábrica com sua arquitetura e roteamentos consolidados, sendo chamados de ASICs (Aplication Specific Integrated Circuit, em português Circuito integrado para aplicação específica ). Surgiu nos anos 80a categoria de hardware reconfigurável, que têm as suas funcionalidades definidas após sua fabricação, podendo ser usado em diversas aplicações sem necessidade de mudanças no chip, reduzindo custos e facilitando a prototipagem. Dentre os dispositivos atuais dessa categoria de hardware se encontram os FPGAs, cujo conceito de topologia interna está presente na Figura 17.

FPGAS são constituídos de milhares de blocos lógicos como mostrado na Figura 18, cada um desses possuindo uma pequena quantidade de elementos de eletrônica digital, como multiplexadores, flip-flops e LUTs (look-up tables, em português, tabelas de referência).

Figura 17 - Arquitetura básica de um FPGA

(28)

Tais blocos lógicos são interconectados por uma matriz de contatos reconfigurável que, com base no código dado, irá realizar a ligação de pontos chave em um conjunto de blocos lógicos para executar a ação desejada.

Um dos desafios do projeto de um FPGA é a definição dos componentes de cada bloco lógico, tendo cada empresa fabricante desse tipo de controlador sua própria estratégia para criação de BLs, com números diferentes de LUTs, diferenças no número de entradas das mesmas, ou do número de elementos de memória por bloco.

A principal diferença entre FPGAs e núcleos de processadores é a capacidade de executar operações em paralelo. Se for requisitado a um núcleo de processador que o mesmo execute 100 operações de soma, ele irá executar a primeira soma, fazendo uso da sua ULA, unidade lógica aritmética, para calcular a primeira resposta e ao terminar, irá executar a próxima soma. Já no caso de um FPGA, para fazer as mesmas100 operações de soma, o mesmo irá usar seus blocos lógicos, compostos de portas lógicas (AND, OR, NOT), multiplexadores, flip-flopse LUTs, para criar 100 ULAs independentes, que irão resolver todas as operações em 1 ciclo de máquina.

Processadores se limitam no número de operações que eles podem executar por segundo, assim resultando no tempo necessário para completar as 100 somas do exemplo. Já FPGAs se limitam no número de componentes lógicos que estes possuem em seu chip. Um FPGA pode não ter elementos suficientes para montar 200 ULAs, mas caso possua, suas respostas serão simultâneas.

Em um FPGA, seus registradores são definidos pelo usuário a partir da aglomeração de flip-flops, assim, o número de bits por registrador é controlável, de maneira a melhorar a eficiência do controlador, comparado com a tecnologia de processadores que tem o tamanho de seus registradores fixos (8,16,32,64 bits).

Fonte: Cyclone II Device Handbook (2019) Figura 18 - Exemplo de bloco lógico.

(29)

3.2 VHDL

Desenvolvida pela DARPA (Defense Advanced Research Projects Agency ou Agência de Projetos de Pesquisa Avançada de Defesa) dos Estados Unidos nos anos 80, esta linguagem teve como finalidade inicial documentar projetos desenvolvidos por terceiros e fornecidos às Forças Armadas Americanas.

Tratando-se de tecnologia militar, por questões de segurança, uma empresa específica não poderia acesso ao projeto em integra e a mesma necessitava desenvolver apenas uma parte o mesmo, sem ter conhecimento do todo. O grande número de empresas servindo documentações com padrões distintos e esquemáticos de circuitos complexos tornava o

processo de unificação destas partes muito difícil.

Foi desenvolvida uma linguagem de descrição de hardware, a qual todos os fornecedores de tecnologia da DARPA deveriam utilizar para documentar seus produtos, facilitando, então, o desenvolvimento do projeto em si.

Inicialmente, única função do VHDL era a descrição de circuitos, não passando de um mero texto estruturado. Era estudada uma forma de desenvolver uma linguagem capaz de gerar circuitos a partir de uma definição textual e a estrutura definida pelo VHDL se mostrou bastante promissora. Pouco tempo depois surgiram os sintetizadores de VHDL, softwares capazes de gerar um circuito funcional a partir de um código VHDL, e os simuladores, softwares capazes de simular o comportamento do circuito a partir apenas do código.

Em 1987 a linguagem VHDL foi posta em domínio público, sendo padronizada pela IEEE (IEEE 1076).(Gomes, 2002)

Um dos diferenciais da linguagem é a capacidade de suportar tanto regiões de código concorrente, onde todas a linhas são executadas ao mesmo tempo, quanto regiões de código sequencial, onde a maneira tradicional de escrita de código pode ser aplicada, assim tornando esta linguagem de descrição de hardware bastante versátil.

(30)

3.3 Kit de desenvolvimento CYCLONE II da Altera

O kit usado pelo autor como alvo para todos os códigos em VHDL feitos é o kit de desenvolvimento DE-01 da empresa Altera, com endereço eletrônico disponível em https://www.intel.com.br/content/www/br/pt/products/programmable.html.

Tal kit possui um FPGA da família cyclone II com 20.000 elementos lógicos recombináveis e vários clocks disponíveis, como 50MHz, 24MHz e 27MHz, além de uma vasta gama de pinos de i/o, como entradas tipo PS2, RS232, uma saída VGA e até um CODEC de áudio.

Um dos pontos importantes para a escolha desse kit pelo autor foi a sua grande disponibilidade no laboratório e simplicidade de programação.

Figura 19 - Kit de desenvolvimento escolhido pelo autor e seu diagrama de blocos.

(31)

4 METODOLOGIA

Na primeira metade do trabalho, aplica-se o algoritmo de modulação vetorial no domínio discreto, de maneira a poder validar as características do método implementado. Nesse intuito, foi escolhido o PSIM como software de simulação inicial, visto que o mesmo tem uma vasta gama de funções, é amplamente usado no ramo da eletrônica de potência, e dá a possibilidade de se escrever códigos na linguagem de programação C.

Deve-se deixar claro que C tem como alvo microprocessadores e, portanto, não é o objetivo desse documento. O código escrito em C no software PSIM será apenas um auxiliador para a construção de um código que seja entendido por FPGAs.

Como o código auxiliar tem como objetivo ser adaptado para VDHL, algumas restrições foram necessárias, visto que o código escrito no software PSIM não poderia conter nenhuma capabilidade que não estivesse presente no código final de baixo nível.

As seguintes restrições foram tomadas:

• Não seria usada nenhuma função com relação a temporização. • Não seria usada nenhuma função trigonométrica.

• Não seria usada nenhuma função matemática complexa.

4.1 O Algoritmo

Assim como mostrado no capítulo2, a modulação vetorial utiliza um vetor de referência 𝑉𝑟𝑒𝑓 que gira no plano 𝛼 − 𝛽 com frequência 𝑓, amplitude 𝐴.

Para o cálculo dos tempos de acionamento das chaves usando a representação polar de 𝑉𝑟𝑒𝑓são usadas equações trigonométricas, que não são suportadas pela linguagem alvo e, portanto, a representação retangular de 𝑉𝑟𝑒𝑓foi usada ao invés.(Islam et al., 2018)

𝑉𝑟𝑒𝑓foi decomposto em suas componentes real e imaginária, dessa maneira, as componentes do vetor traçam sinusoides no eixo do tempo, e caso tais componentes sejam calculadas, o próprio 𝑉𝑟𝑒𝑓estará representado:

𝑅𝑒{𝑉𝑟𝑒𝑓} = 𝐴. 𝑐𝑜𝑠(2𝜋𝑓) = 𝑉𝑟𝑒𝑓𝑋 ( 6 )

(32)

Como não é possível o uso de funções trigonométricas, uma maneira diferente de sintetizar as componentes de 𝑉𝑟𝑒𝑓(𝑉𝑟𝑒𝑓𝑋, 𝑉𝑟𝑒𝑓𝑌)é necessária.

A alternativa mais comum para solucionar esse impasse é o uso de uma look-up table com os valores de uma senóide normalizada, guardada dentro de um vetor. Caso este vetor seja armazenado em memória externa ao FPGA, a comunicação entre estes dois irá acarretar num limite máximo de velocidade para execução do algoritmo, visto que o FPGA precisaria esperar um novo dado da referência senoidal para executar uma nova iteração.(Tzou, Hsu e Kuo, 1996)

Uma look-up table também poderia ser armazenada dentro do próprio FPGA em seus flip-flops, porém, o número de elementos lógicos no controlador é finito, e dependendo da resolução da senóide desejada, o espaço necessário para armazenar a mesma pode ser até maior que o espaço do próprio código, inviabilizando tal solução.

Neste contexto o autor se dispõe a usar uma solução diferente. Ao invés de se armazenar os dados da referência em tempo de compilação, a mesma será gerada programaticamente em tempo de execução, sem a necessidade de interfaceamento com outro CI e usando muito menos componentes do FPGA.

Para criar o vetor de referência foi percebida uma oportunidade nas simulações computacionais de objetos, ao se notar que um corpo em trajetória circular descreve sinusoides em suas posições horizontal e vertical em função do tempo. A Figura 20 mostra que caso a velocidade de um corpo seja perpendicular à sua posição, o mesmo descreve a trajetória circular necessária.

Figura 20 - Fundamentos do movimento de objetos em trajetória circular.

(33)

A partir do modelo físico do corpo em movimento, desconsiderando imperfeições como atrito e a resistência do ar, resultam as seguintes equações:

𝑃𝑜𝑠𝑖çã𝑜𝑋= 𝑃𝑜𝑠𝑖çã𝑜𝑋𝐼𝑛𝑖𝑐𝑖𝑎𝑙+ ∫ 𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒𝑋. 𝑑𝑡 𝑡 0 ( 8 ) 𝑃𝑜𝑠𝑖çã𝑜𝑌 = 𝑃𝑜𝑠𝑖çã𝑜𝑌𝐼𝑛𝑖𝑐𝑖𝑎𝑙+ ∫ 𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒𝑌. 𝑑𝑡 𝑡 0 ( 9 ) 𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒 ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ ⃘ 𝑃𝑜𝑠𝑖çã𝑜⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ = 0, |𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒|, |𝑃𝑜𝑠𝑖çã𝑜| > 0 ( 10 )

Analisando essas equações sobre a ótica do domínio discreto, as integrais são substituídas por somas simples e a rotação em 90° é feita pela matriz:

𝑅𝑜𝑡𝑑 = ( cos (∅) sen (∅) −sen (∅) cos (∅))

( 11 )

Com ∅ = 90°, tem-se as seguintes equações:

𝑃𝑜𝑠𝑖çã𝑜𝑋[𝑖] = 𝑃𝑜𝑠𝑖çã𝑜𝑋[𝑖 − 1] + 𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒𝑋[𝑖]

𝑃𝑜𝑠𝑖çã𝑜𝑌[𝑖] = 𝑃𝑜𝑠𝑖çã𝑜𝑌[𝑖 − 1] + 𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒𝑌[𝑖] ( 12 ) 𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒𝑋[𝑖] = − 𝑃𝑜𝑠𝑖çã𝑜𝑌[𝑖 − 1]. V

𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒𝑌[𝑖] = 𝑃𝑜𝑠𝑖çã𝑜𝑋[𝑖 − 1]. V

( 13 )

Onde V é uma constante que dita tanto a frequência de rotação quanto a resolução da simulação. O resultado da aplicação destas equações para criar um sinal senoidal está na Figura 21.

Figura 21 - Simulação da referência senoidal.

(34)

É possível notar que a simulação gerou um sinal senoidal (“cossenoref”) com um raio que aumenta progressivamente. Ao se pensar sobre o exemplo do tempo contínuo, mostrado na Figura 22, no qual cada incremento da posição tem valor diferencial (dt = 0), tal problema não deve ocorrer, visto que resultaria nas seguintes equações:

𝑁𝑜𝑣𝑜 𝑅𝑎𝑖𝑜2 = 𝑅𝑎𝑖𝑜 𝐴𝑛𝑡𝑖𝑔𝑜2+ (Velocidade.dt)2 ( 14 )

No tempo discreto, o módulo do passo(𝑑𝑡) jamais será nulo, causando a amplitude da referência a divergir. É necessário então uma sub-rotina para efetuar a correção da amplitude de tal senóide. A solução usada pelo autor foi multiplicar, a cada certo número de iterações, as componentes real e imaginária de𝑉𝑟𝑒𝑓 pelo quociente entre o raio desejado e o raio atual medido.

|𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑𝑒. 𝑑𝑡| = 0 ( 15 )

|𝑁𝑜𝑣𝑜 𝑅𝑎𝑖𝑜| = |𝑅𝑎𝑖𝑜 𝐴𝑛𝑡𝑖𝑔𝑜| ( 16 )

Figura 23 - Correção da amplitude da senóide. Figura 22 - Exemplo de 'iteração' do movimento circular.

Fonte: Próprio autor.

Fonte: Próprio autor.

(35)

Após o uso dessa sub-rotina a amplitude da referência se manteve constante, assim como pode ser visto na Figura 23.

Com as componentes do vetor de referência já conhecidos, para o algoritmo de modulação trifásico, é necessário se definir em qual sextante a referência se encontra. Para o primeiro sextante, como os dois segmentos de reta que delimitam o mesmo tem ângulos 0° e 60° respectivamente, as equações que denotam se 𝑉𝑟𝑒𝑓 está no 1° sextante são:

𝑉𝑟𝑒𝑓𝑋 ≥ 0, 𝑉𝑟𝑒𝑓𝑌 ≥ 0, 𝑉𝑟𝑒𝑓𝑌 ≤ 𝑉𝑟𝑒𝑓𝑋. √3

( 17 )

Para todos os outros 5 sextantes, equações similares foram manualmente redigidas pelo autor e conseguem com precisão determinar o setor atual da referência, assim como verificado em simulação computacional mostrada na Figura 24.

Para cada sextante são definidos 2 vetores ativos a serem usados, assim como descrito na Tabela 1. Vale ressaltar que inicialmente na estratégia de modulação usada havia uma sequência clara dos vetores ativos usados, onde o 2° vetor usado em um sextante específico seria, no próximo sextante, o 1° vetor.

Figura 24 - Detecção de sextante.

(36)

Tabela 1 -Descrição dos vetores ativos por sextante. Sextante

Vetor ativo 1 Vetor ativo 2

Número Ativação das

chaves Binário Número

Ativação das chaves Binário 1 1 100 4 2 110 6 2 2 110 6 3 010 2 3 3 010 2 4 011 3 4 4 011 3 5 001 1 5 5 001 1 6 101 5 6 6 101 5 1 100 4

Com os dois vetores ativos definidos, resta ao algoritmo definir os tempos em que cada vetor ficará na saída do inversor. Tal cálculo, assim como explanado no capítulo 2, é feito pela definição dos coeficientes para que a combinação linear dos vetores ativos seja igual a referência. Para o 1° sextante temos as equações( 4 ) e ( 5 ):

𝑉𝑟𝑒𝑓𝑋. 𝑇𝑆 = 2 3. 𝑉𝑐𝑐. 𝑇1+ cos(60°). 2 3. 𝑉𝑐𝑐. 𝑇2 𝑉𝑟𝑒𝑓𝑌. 𝑇𝑆 = sin(60°).2 3. 𝑉𝑐𝑐. 𝑇2

Sendo 𝑇1 o tempo de uso do vetor ativo 1, e 𝑇𝑆 o tempo total de um ciclo da modulação.

Como os ângulos das funções trigonométricas presentes são sempre constantes, elas podem ser pré-calculadas em tempo de compilação e substituídas por valores suficientemente próximos para a aplicação desejada. No exemplo a seguir foram usadas 3 casas decimais de precisão. 𝑇2 = 3. (𝑉𝑟𝑒𝑓𝑌. 𝑇𝑆) 1.732. 𝑉𝑐𝑐 ( 18 ) 𝑇1 = 3. (𝑉𝑟𝑒𝑓𝑋. 𝑇𝑆 − 𝑉𝑐𝑐𝑇2 3 ) 𝑉𝑐𝑐. 2 ( 19 ) 𝑇0 = 𝑇𝑠 − 𝑇1− 𝑇2 ( 20 )

(37)

Figura 26 - Resultados de simulação para o algoritmo criado.

Vale ressaltar que para cada sextante as equações para o cálculo dos tempos são diferentes, tendo cabido ao autor resolver todos os sistemas de equações decorrentes e os colocar na linguagem de código desejada.

Usando tais equações foi possível finalizar o algoritmo em C para iniciar os testes da modulação vetorial trifásica. Assim como mostrado na Figura 25, o código criado foi capaz de executar corretamente a modulação, visto que em cada período, a variável ‘estadoatual’ passa por 0, assume um dos vetores ativos, troca pelo outro vetor e no meio da forma de onda chega no valor 7 (111), para depois repetir o ciclo ao reverso. É possível notar que os vetores ativos usado em cada sextante mudam, porém com um deles sempre permanecendo de um sextante a outro.

As simulações com o algoritmo criado acionando o inversor estudado foram realizadas e seus sinais de tensão e corrente na saída do conversor estão na Figura 26, evidenciando o correto funcionamento do código visto a baixa distorção harmônica da forma de onda de corrente, além da correta defasagem entre cada braço.

Figura 25 - Estados da modulação vetorial.

Fonte: Próprio autor

(38)

Por fim é possível criar o fluxograma do algoritmo desenvolvido, presente na Figura 27. O código criado está presente no anexo A.

4.2 Transição para VHDL

Com o algoritmo de modulação em espaço de estados escrito em C funcionando corretamente dentro do software PSIM, foi executado o translado de tal código para VHDL.

4.2.1 Notação Q

A primeira dificuldade encontrada pelo autor foi a falta da notação em ponto flutuante na linguagem, o que inicialmente impede o uso de número reais como cos (60°) ou 1,732.

A solução escolhida pelo autor foi o uso da notação Q, ou ponto fixo. Nesta notação escolhe-se um número n de bit fracionários, isto é, os primeiros n bits que terão potências negativas, pois estarão depois de uma vírgula imaginária. Com essa notação o FPGA pode prosseguir as operações como se fossem números inteiros.(Arar, 2018)

Por exemplo, para representar o número real 1,732 na notação Q5, com 5 bits depois da virgula, primeiro se multiplica o número em questão por 25, resultando em 55.424. Ao se considerar apenas a parte inteira, temos o número 55, que em binário comum seria:

1101112.

Porém, ao tomarmos a virgula imaginária no 5° bit (Q5), temos: Figura 27 - Fluxograma do algoritmo.

(39)

1,101112= 1,71875 10 ( 21 )

Assim como foi explanado, para representar 1,732 na notação em ponto fixo é usada uma variável inteira com valor de 55 (aproximadamente 1,723.25). Deve-se tomar cuidado ao se efetuar operações matemáticas com números em notação Q, visto que na multiplicação entre dois números desta representação, o resultado estará com o dobro da notação, tendo que ser manualmente dividido pelo fator multiplicativo inicialmente usado (25). Além disso, é necessário atentar para possíveis estouros de registradores, visto o elevado tamanho do número inteiro resultante da multiplicação de números em notação Q de grande resolução.

4.2.2 Método de Newton

Durante a conversão do código, foi percebido pelo autor que a linguagem de descrição de hardware VHDL não possui nenhuma biblioteca nativa para funções matemáticas complexas, e, portanto, não reconhecia a operação de raiz quadrada necessária para calcular o raio atual da referência.

𝑅𝑎𝑖𝑜𝑅𝑒𝑓 = √𝑞𝑢𝑎𝑑𝑟𝑎𝑑𝑜 ( 22 )

𝑞𝑢𝑎𝑑𝑟𝑎𝑑𝑜 = 𝑉𝑟𝑒𝑓𝑋2+ 𝑉𝑟𝑒𝑓𝑌2 ( 23 )

Tendo em conta que o valor de 𝑞𝑢𝑎𝑑𝑟𝑎𝑑𝑜 pode ser calculado apenas com somas e multiplicações, suportadas pela linguagem, a dificuldade se encontra apenas em( 22 ), que pode ser reescrita como:

𝑅𝑎𝑖𝑜𝑅𝑒𝑓∗ 𝑅𝑎𝑖𝑜𝑅𝑒𝑓− 𝑞𝑢𝑎𝑑𝑟𝑎𝑑𝑜 = 0 ( 24 ) Dessa forma, ao invés de termos que calcular uma raiz quadrada, será necessário apenas calcular o zero de uma função real.

Tendo como objetivo encontrar o zero de uma função real, o autor fez uso do método numérico de Newton para calcular a raiz quadrada necessária indiretamente.

(40)

O método de Newton ou Newton-Raphson, se baseia no conceito de que a reta tangente a um ponto arbitrário na curva, como na Figura 28, cruza o eixo horizontal em um ponto mais próximo a um zero da função, e portanto :(Dagoberto Adriano Rizzotto Justo - UFRGS et al., 2019) 𝑓(𝑥𝑖) 𝑥𝑖 − 𝑥𝑖+1 = 𝑓′(𝑥𝑖) ( 25 ) 𝑥𝑖+1= 𝑥𝑖 − 𝑓(𝑥𝑖) 𝑓′(𝑥𝑖) ( 26 ) Se 𝑓(𝑥) = 𝑥2 − 𝑞𝑢𝑎𝑑𝑟𝑎𝑑𝑜 , então: 𝑥𝑖+1= 𝑥𝑖 − (𝑥𝑖2− 𝑞𝑢𝑎𝑑𝑟𝑎𝑑𝑜) 2𝑥𝑖 ( 27 )

A cada nova execução do método de Newton, o 𝑥0 é tomado como o próprio 𝑞𝑢𝑎𝑑𝑟𝑎𝑑𝑜, de maneira que a derivada da função jamais será nula, visto que tal condição só ocorrerá com 𝑥𝑖 = 0, assim permitindo um funcionamento correto do método numérico.

Após resolvidas as complicações já discutidas, o programa em VHDL foi compilado no software Quartus II e as simulações feitas no software Modelsim Altera. Na Figura 29é mostrado o bloco gerado pelo código de modulação desenvolvido, onde é possível ver suas entradas e saídas, ilustrando a modularidade do VHDL. Na Figura 30é possível

Figura 28: Motivação geométrica para o método de Newton.

(41)

confirmar que o código escrito em VHDL é transformado na complexa interconexão de vários componentes simples como flip-flops e portas lógicas.

Figura 29 - Bloco lógico criado pelo código em VHDL.

Fonte: Próprio autor.

Figura 30 - Construção interna do bloco lógico criado.

(42)

5 RESULTADOS

Nesta seção serão mostradas simulações computacionais da modulação vetorial trifásica a 2 níveis. Serão comparados também os resultados experimentais obtidos em laboratório.

5.1 Simulação computacional

Para as simulações computacionais em VHDL foi escolhido o software Modelsim Altera, visto que além de muito versátil, vem agregado com o ambiente de desenvolvimento Quartus II.

O primeiro ponto que foi verificado nas simulações é a geração programática da referência senoidal. Na Figura 31 podemos ver que o código alvo, ao ser alimentado por um sinal de clock (clkin), gerou dois sinais senoidais defasados em 90° (posicãoX e posicãoY) com amplitude perfeitamente constante, representando corretamente as componentes de 𝑉𝑟𝑒𝑓.

Com a referência senoidal corretamente calculada, assim como em 4.1 é necessário determinar o sextante atual. O código apresentou resultados semelhantes a aqueles antes conseguidos no PSIM, com a variável “sextanteatual” variando de 1 a 6, em degraus igualmente espaçados e retornando para o sextante 1 após o fim do 6. Tais resultados estão na Figura 32.

Figura 31 - Referência gerada em VHDL.

(43)

Na Figura 33 podemos ver o sextante atual do fasor de referência (variável “sextante atual”), bem como o estado de comutação atual (“estado atual”), assim como explicado em 4.1, tal estado ou vetor contém a informação de ativação das 3 chaves a serem controladas, assim permitindo entender, com apenas uma forma de onda, o comportamento do conversor.

Ainda na mesma figura podemos ver que o formato geral do gráfico da variável “estadoatual” muda a cada sextante, fato em consonância com a teoria vista em 2.4, já que para cada sextante mudam-se os vetores ativos usados. É possível notar que dentro de um mesmo

Figura 33 - Escolha dos estados para código em VHDL. Figura 32 - Cálculo do sextante em VHDL.

Fonte: Próprio autor.

(44)

sextante há a mudança na disposição do tempo de cada estado, visto que a referência senoidal está mudando de valor.

Outro dado interessante a ser visto é o sinal de ativação de cada um dos 3 braços do inversor em questão, onde se obtém um resultado similar a uma modulação por largura de pulso, assim como visto na Figura 34. É possível perceber quem em cada período de modulação, cada chave (A, B, C) tem apenas uma borda de subida e uma borda de descida, assim minimizando o número de chaveamentos por período.

Em certa versão antiga do código, o autor verificou que essa constância não acontecia mesmo com os tempos de acionamentos das chaves estando corretos.

Foi verificado empiricamente que além do tempo em que cada vetor passa ativo, a sequência desses vetores também é importante. Apenas trocando a ordem dos vetores ativos o autor pode corrigir o código em questão para que cada braço chaveasse apenas uma vez por período.

Figura 34 - Sinais de acionamento para cada um dos braços do inversor para um ângulo de 45°.

(45)

Figura 36 - Referência senoidal observada.

5.2 Resultados experimentais

Para a etapa de resultados experimentais foram usados: o kit de desenvolvimento em FPGA, um conversor DA R-2R de 8 bits, 3 filtros passa-baixas RC e um osciloscópio, assim como mostrado na Figura 35.

A parte real do vetor de referência foi amostrado utilizando-se o conversor DA. Os resultados do experimento, presentes na Figura 36, mostram o correto funcionamento do algoritmo, visto que o sinal amostrado é senoidal, com frequência em torno de 60 Hz, e amplitude constante.

Figura 35 - Montagem feita para obtenção dos resultados experimentais.

Fonte: Próprio autor.

(46)

A variável que indica o sextante atual também foi amostrada pelo conversor DA, como pode ser visto na Figura 37. A forma de onda observada está em consonância com o correto funcionamento do código, visto ser idêntico às formas de ondas desta variável antes vistas e possuir a mesma frequência da Figura 36.

Para verificar como o código sendo executado dentro do FPGA calcula as sequencias de chaveamento, foram obtidas imagens do período de comutação com a referência senoidal inerte para cada um dos sextantes. Tais dados, como vistos na Figura 38 - Sequências de chaveamento para cada sextante., mostram o correto funcionamento da modulação contínua simétrica. É possível notar que a sequência de vetores ativos segue corretamente as indicações da Tabela 1.

Para a frequência de chaveamento foi escolhido o valor de 83kHz. deve-se observar que qualquer valor suficientemente longe da frequência da referência senoidal poderá ser usado sem perda de generalidade.

Figura 37 - Definição do sextante atual observado.

(47)

Entre cada um dos 3 pinos da saída do algoritmo e o GND do FPGA foi incluso um filtro passa-baixas. Cada filtro é constituído de 2 resistores de 470 Ω em série e um capacitor de 1uF. Com tais valores, a frequência de corte do filtro usado é:

𝑓𝑐 = 1 𝑅. 𝐶 =

1

940.10−6 = 1063 𝐻𝑧 ( 28 )

Tal valor se encontra mais de uma década acima da frequência que se deseja manter intacta (60 Hz) e mais de uma década abaixo das frequências das harmônicas indesejadas, sendo assim, capaz de oferecer em sua saída os sinais senoidais trifásicos desejados, como pode ser visto na Figura 39.

Figura 38 - Sequências de chaveamento para cada sextante.

(48)

Nesta figura é possível notar a correta defasagem angular entre as três fases do sistema, além da igualdade de suas amplitudes e a periodicidade do sinal. É percebível também a presença da componente de terceira harmônica, intrínseca ao método da modulação vetorial.

Tal componente está presente apenas nos sinais de tensão de fase, visto que, para tensões de linha, essas componentes irão se cancelar, gerando uma forma de onda perfeitamente senoidal na saída, assim como visto na Figura 40. Foi usada a função de subtração do osciloscópio para simular a tensão de linha resultante no conversor.

Figura 39 - Sinais de tensão após o filtro RC.

Figura 40 - Anulação da terceira harmônica. Fonte: Próprio autor.

(49)

6 CONCLUSÃO

Para o presente trabalho foi realiza uma vasta revisão bibliográfica sobre FPGAs e modulações PWM, e com os conhecimentos adquiridos a implementação de uma técnica de modulação vetorial para inversores de frequência, trifásicos com 2 níveis, foi discutida e realizada em FPGA, sem o uso de memória externa. Foram evidenciadas as características da implementação em nível de hardware, como a falta da representação numérica em ponto flutuante, que pôde ser superada pelo uso da notação em ponto Q, e a ausência de funções matemáticas complexas, sendo necessário o uso de métodos numéricos adequados para avaliar tais funções não contidas na linguagem.

A implementação criada foi simulada em dois softwares diferentes e medições experimentais foram realizadas, todas em consonância com o correto funcionamento do conversor, como foi evidenciado no capítulo 5, no qual percebe-se que a criação programática da referência senoidal, a definição do sextante atual e o cálculo do tempo de cada vetor ocorrem corretamente.

Por fim, fica evidenciada a viabilidade da implementação de algoritmos de modulação para conversores de potência usando FPGAs.

(50)

7 REFERÊNCIAS

.

ARAR, S. Fixed-Point Representation: The Q Format and Addition Examples - Technical

Articles. Disponível em:

<https://www.allaboutcircuits.com/technical-articles/fixed-point-representation-the-q-format-and-addition-examples/>. Acesso em: 24 out. 2019.

DAGOBERTO ADRIANO RIZZOTTO JUSTO - UFRGS et al. Cálculo Numérico. [s.l: s.n.].

DÁRIO, V. et al. Análise Comparativa das Técnicas SPWM e SVM Aplicadas a um Inversor de Tensão Trifásico Comparative Analysis between SPWM and SVM Techniques applied to a Three-Phase Voltage. 2000.

GOMES, L. Introdução ao VHDL. p. 1–19, 2002.

HOLMES, D. G.; LIPO, T. A. Pulse Width Modulation for Power Converters. [s.l: s.n.].

ISLAM, M. A. et al. Field oriented space vector pulse width modulation control of permanent magnet brushless DC motor. 5th IEEE Region 10 Humanitarian Technology Conference

2017, R10-HTC 2017, v. 2018-Janua, n. 1, p. 322–327, 2018.

NEACSU, D. O.; IASI, G. A. T. U. OF. SPACE VECTOR MODULATION – An Introduction == Tutorial at IECON2001 ==. v. 00, n. 2, p. 1583–1592, 2001.

TZOU, Y. Y.; HSU, H. J.; KUO, T. S. FPGA-based SVPWM control IC for 3-phase PWM inverters. IECON Proceedings (Industrial Electronics Conference), v. 1, p. 138–143, 1996.

(51)

ANEXO A

Código em VHDL para modulação vetorial library ieee;

use ieee.std_logic_1164.all; entity Modulacao is modulacao

port (

saidaA : out std_logic; saidaB : out std_logic; saidaC : out std_logic; clkin : in std_logic;

VAx : out integer range -1023 to 1023:= 0; -- Iint10 VAy : out integer range -1023 to 1023:= 0; -- Iint10 VBx : out integer range -1023 to 1023:= 0; -- Iint10 VBy : out integer range -1023 to 1023:= 0; -- Iint10 VCx : out integer range -1023 to 1023:= 0; -- Iint10 VCy : out integer range -1023 to 1023:= 0 -- Iint10 );

end Modulacao;

architecture teste of Modulacao is

-- Variáveis para os divisores de frequeêcia --

signal ClockSenoide : std_logic := '0'; -- freq senoide = fre oscilador / ( 23610*2* divFreqSen) signal divFreqSen : integer range 0 to 65535 := 12000; -- Uint16

signal ClockModulacao : std_logic := '0';-- freq modulação = fre oscilador / ( 300*2* divFreqMod) signal divFreqMod : integer range 0 to 65535 := 10; -- Uint16

-- Variáveis para a referencia senoidal--

signal posicaoX : integer range -65535 to 65535:= 0; -- Iint16 signal posicaoY : integer range -65535 to 65535:= 0; -- Iint16 signal posicaoX2 : integer range -65535 to 65535:= 0; -- Iint16 signal posicaoY2 : integer range -65535 to 65535:= 0; -- Iint16 signal velocidadeX : integer range -65535 to 65535:= 0; -- Iint16 signal velocidadeY : integer range -65535 to 65535:= 0; -- Iint16 signal raioAoQuadrado: integer range 0 to 1048575 := 0; -- Uint20 constant raioBase : integer range 0 to 1023 := 220;-- Uint10 signal raiz : integer range 0 to 65535 := 16; -- Uint16 signal raizPassada : integer range 0 to 65535 := 16; -- Uint16

(52)

signal delta : integer := 16; -- Uint16 -- Variáveis para a modulação vetorial simétrica-- signal iteracao : integer range 0 to 15 := 0; signal vcc : integer := 300 * 32 ;

signal divisorFreq : integer := 300; -- TS signal contfreq : integer := 0;

signal estado1 : integer := 0; signal tempoestado1 : integer := 0; signal estado2 : integer := 0; signal tempoestado2 : integer := 0; signal estado3 : integer := 0; signal tempoestado3 : integer := 0; signal estado4 : integer := 3; signal tempoestado4 : integer := 0; signal estado5 : integer := 0; signal tempoestado5 : integer := 0; signal estado6 : integer := 0; signal tempoestado6 : integer := 0; signal estado7 : integer := 0; signal tempoestado7 : integer := 0; signal estado8 : integer := 0; signal tempoestado8 : integer := 0; signal estadoatual : integer := 0 ;

signal sextanteAtual : integer range 1 to 6 := 1; signal contagem : integer := 0;

-- Variáveis extras--

constant q : integer range 0 to 255 := 32; -- Uint8 begin

-- Para a fase B, só é necessário realizar a rotação em 120 graus ccw, pelo uso da matriz de rotação VBx <= -( posicaoX + ((posicaoY * 1774)/ 1024) )/ (2*q);

VBy <= ( ((posicaox * 1774)/ 1024) - posicaoy )/ (2*q); -- Idem para fase C, porém com angulo de 240 graus VCx <= ( ((posicaoY * 1774)/ 1024) - posicaoX )/ (2*q); VCy <= -( ((posicaox * 1774)/ 1024) + posicaoy )/ (2*q);

(53)

---

--- Processo que calcula o sinal de clock para o proceso da seinóide --- ---

clock2Senoide : process (clkin)

variable cont : integer range 0 to 1048575 := 0; -- Uint20 begin

if(clkin'event and clkin='1') then cont := cont +1;

if cont >= divFreqSen then

ClockSenoide <=not (ClockSenoide); cont :=0;

end if; end if;

end process;

---

--- Processo que calcula o sinal de clock para o proceso de modulação --- ---

clock2Modulacao : process (clkin)

variable contMod : integer range 0 to 65535:= 0; -- Iint16 begin

if(clkin'event and clkin='1') then

(54)

if contMod >= divFreqMod then

clockModulacao <=not (clockModulacao); contMod :=0;

end if; end if;

end process;

--- ---

--- Processo que gera a referência senoidal para a modulação --- --- ---

process (ClockSenoide)

variable iteracao : integer range 0 to 15:= 0; -- Uint4 begin

if(ClockSenoide'event and ClockSenoide='1') then

case iteracao is when 0 => posicaoX <= raioBase * q ; posicaoY <= 0; iteracao := iteracao + 1; when 1 =>

(55)

velocidadeX <= - posicaoY / 512;

velocidadeY <= posicaoX / 512 ;

iteracao := iteracao + 1;

when 2 =>

posicaoX <= posicaoX + velocidadeX; posicaoY <= posicaoY + velocidadeY; iteracao := iteracao + 1;

when 3 =>

raioAoQuadrado <= (((posicaoX ) * (posicaoX ) + (posicaoy ) * (posicaoy ))) / ( q *q); -- *q duas veses

iteracao := iteracao + 1; when 4 =>

if raizPassada /= 0 then

raiz <= raizPassada - (

raizPassada * raizPassada - raioAoQuadrado )/(2 * raizPassada );

(56)

iteracao := iteracao + 1; when 5 => if raiz /= 0 then posicaoX2 <= (posicaoX * raioBase) / raiz ; posicaoy2 <= (posicaoy * raioBase) / raiz ; end if; iteracao := iteracao + 1; when 6 =>

if raiz > 150 and raiz < 250 and raiz = raizPassada then -- ageitar isso aki

posicaoX <= posicaoX2 ; posicaoy <= posicaoy2 ; raizPassada <= 1; raiz <= 1;

end if ;

(57)

iteracao := iteracao + 1; when 7 => raizPassada <= raiz; VAx <= posicaoX / q ; VAy <= posicaoY / q; iteracao := 1;

When others => null ;

end case;

end if;

end process;

--- ---

--- Processo que gera calcula os tempos de cada palavra e executa a modulação --- --- ---

process (clockModulacao) begin

(58)

if contfreq > divisorFreq then contfreq <= 0; else contfreq <= contfreq + 1; end if; estado1 <= 0; estado4 <= 7; estado5 <= 7; estado8 <= 0;

if ( posicaoX > 0 and posicaoY > 0 and posicaoY * q < 55 * posicaoX ) then sextanteatual <= 1;

estado2 <= 4; estado3 <= 6; estado6 <= estado3; estado7 <= estado2;

tempoestado3 <= posicaoY * divisorfreq / ( 2 *vcc * 866 / 1000);

tempoestado6 <= posicaoY * divisorfreq / ( 2 *vcc * 866 / 1000);

(59)

tempoestado2 <= ((posicaoX * divisorfreq / vcc) - tempoestado3) / 2 ;

tempoestado7 <= ((posicaoX * divisorfreq / vcc) - tempoestado3) / 2 ;

elsif ( posicaoX > 0 and posicaoY > 0 and posicaoY * q > 55 * posicaoX ) then sextanteatual <= 2; estado2 <= 2; estado3 <= 6; estado6 <= estado3; estado7 <= estado2; tempoestado2 <= ((divisorfreq / 2 )* ( (posicaoY * 1000 - posicaoX * 1732 ) ) / ( vcc * 1732 )) ; tempoestado6 <= tempoestado3 ;

tempoestado3 <= ( posicaoX * 2 * divisorfreq / (vcc ) + 2 * tempoestado2 ) / 2;

tempoestado7 <= tempoestado2;

elsif ( posicaoX < 0 and posicaoY > 0 and posicaoY *q > -55 * posicaoX ) then

(60)

sextanteatual <= 2; --estado1 <= 0; estado2 <= 2; estado3 <= 6; --estado4 <= 7; --estado5 <= 7; estado6 <= 6; estado7 <= 2; --estado8 <= 0; tempoestado2 <= ((divisorfreq / 2 )* ( (posicaoY * 1000 - posicaoX * 1732 ) ) / ( vcc * 1732 )) ; tempoestado7 <= tempoestado2; tempoestado3 <= (posicaoX * 2 * divisorfreq/(vcc ) + 2 * tempoestado2) / 2; tempoestado6 <= tempoestado3 ;

elsif ( posicaoX < 0 and posicaoY > 0 and posicaoY *q < - 55 * posicaoX ) then sextanteatual <=3; estado2 <= 2; estado3 <= 3; estado6 <= estado3; estado7 <= estado2;

(61)

tempoestado2 <= (posicaoY * divisorfreq * 1000 / ( vcc * (866 )))/ 2 ; tempoestado6 <= tempoestado3; tempoestado3 <= (( - posicaoX * divisorfreq / vcc) - tempoestado2) / 2; tempoestado7 <= tempoestado2;

ELSif posicaoX < 0 AND posicaoY < 0 AND posicaoY * q > 55 * posicaoX THEn sextanteatual <= 4; estado2 <= 1; estado3 <= 3; estado6 <= estado3; estado7 <= estado2;

tempoestado2 <= (-posicaoY * divisorfreq * 1000 / ( vcc * (866 ) )) / 2;

tempoestado7 <= tempoestado2;

tempoestado3 <= (( - posicaoX * divisorfreq / vcc) - tempoestado2) / 2;

(62)

elsif posicaoX < 0 and posicaoY < 0 and posicaoY * q < (55 ) * posicaoX then sextanteatual <= 5; estado2 <= 1; estado3 <= 5; estado6 <= estado3; estado7 <= estado2; --//// no sextante 5 é invertido do 2 tempoestado3 <= ((divisorfreq / 2 )* ( ( posicaoX * 1732 - posicaoY * 1000 ) ) / ( vcc * 1732 )) ; -- tempoestado3 <= (divisorfreq*( - posicaoY + (1732/ 1000)* posicaoX )/ ( vcc * (1732/1000) ))/2; tempoestado6 <= tempoestado3 ; tempoestado2 <= (- posicaoX * 2 * divisorfreq / (vcc ) + 2 * tempoestado3 )/ 2; tempoestado7 <= tempoestado2;

elsif posicaoX > 0 and posicaoY < 0 and posicaoY *q < - (55) * posicaoX then

sextanteatual <=5;

(63)

estado3 <= 5; estado6 <= estado3; estado7 <= estado2; tempoestado3 <= ((divisorfreq / 2 )* ( ( posicaoX * 1732 - posicaoY * 1000 ) ) / ( vcc * 1732 )) ; -- tempoestado3

<= (divisorfreq*( - posicaoY + (1732 / 1000)* posicaoX )/ ( vcc * (1732/1000) ))/2;

--/// o dois da equaçao 3 linha erh porque eu ja dividi o tempo em dois pra modulacao simetrica

tempoestado6 <= tempoestado3 ;

tempoestado2 <= (- posicaoX * 2 * divisorfreq/(vcc ) + 2 * tempoestado3) / 2;

tempoestado7 <= tempoestado2;

elsif ( posicaoX > 0 and posicaoY < 0 and posicaoY * q > -55 * posicaoX ) then

(64)

estado2 <= 4; estado3 <= 5; estado6 <= estado3; estado7 <= estado2;

tempoestado3 <= (- posicaoY * divisorfreq * 1000 / ( vcc * (866) ))/2; tempoestado6 <= tempoestado3;

tempoestado2 <= ((posicaoX * divisorfreq / vcc) - tempoestado3)/2; tempoestado7 <= tempoestado2;

end if;

tempoestado1 <= (divisorfreq - 2*tempoestado2 - 2*tempoestado3) / 4;

tempoestado4 <= tempoestado1; tempoestado5 <= tempoestado1; tempoestado8 <= tempoestado1;

if (contfreq < tempoestado1 )then estadoatual <= estado1;

elsif ( contfreq < tempoestado1 + tempoestado2 )then estadoatual <= estado2;

elsif ( contfreq < tempoestado1 + tempoestado2+ tempoestado3 )then estadoatual <= estado3;

elsif ( contfreq < tempoestado1 + tempoestado2+ tempoestado3+ tempoestado4 )then estadoatual <= estado4;

(65)

elsif ( contfreq < tempoestado1 + tempoestado2+ tempoestado3+ tempoestado4+ tempoestado5 )then estadoatual <= estado5;

elsif ( contfreq < tempoestado1 + tempoestado2+ tempoestado3+ tempoestado4+ tempoestado5+ tempoestado6 )then

estadoatual <= estado6;

elsif ( contfreq < tempoestado1 + tempoestado2+ tempoestado3+ tempoestado4+ tempoestado5+ tempoestado6 + tempoestado7 )then

estadoatual <= estado7;

elsif ( contfreq < tempoestado1 + tempoestado2+ tempoestado3+ tempoestado4+ tempoestado5+ tempoestado6 + tempoestado7 + tempoestado8 )then

estadoatual <= estado8; end if ; if (estadoatual = 0 )then saidaA <= '0'; saidaB <= '0'; saidaC <= '0';

elsif ( estadoatual = 1 ) then saidaA <= '0';

saidaB <= '0'; saidaC <= '1';

elsif ( estadoatual = 2 ) then saidaA <= '0';

(66)

saidaC <= '0';

elsif ( estadoatual = 3 ) then saidaA <= '0';

saidaB <= '1'; saidaC <= '1';

elsif ( estadoatual = 4 ) then saidaA <= '1';

saidaB <= '0'; saidaC <= '0';

elsif ( estadoatual = 5 ) then saidaA <= '1';

saidaB <= '0'; saidaC <= '1';

elsif ( estadoatual = 6 ) then saidaA <= '1'; saidaB <= '1'; saidaC <= '0'; else saidaA <= '1'; saidaB <= '1'; saidaC <= '1'; end if; end if; end process;

(67)

end teste;

Código auxiliar escrito em C#

/////////////////////// GERA SENOIDE VARIABLES ///////////////////

#include <Stdlib.h> #include <String.h> #include <math.h> int g_nInputNodes=0; int g_nOutputNodes=0; int g_nStepCount=0; static int contagem; static float entradapassada; static float posicaoX; static float posicaoY; static float velocidadeX; static float velocidadeY; float raioatual;

float raio = 150;

float passoporcentagem = 1 ; float passo = 1 ;

static int jafoi = 0;

//////////////////// GERA SENOIDE UPDATE /////////////////// #include <Stdlib.h>

#include <String.h> #include <math.h> g_nStepCount++;

if ( in[0] > entradapassada ){

raioatual = sqrt( posicaoX * posicaoX + posicaoY*posicaoY ); passo = passoporcentagem * raioatual / 100 ;

(68)

velocidadeX = - posicaoY; velocidadeY = posicaoX;

velocidadeX = velocidadeX *passo / raioatual; velocidadeY = velocidadeY *passo / raioatual; posicaoX = posicaoX + velocidadeX;

posicaoY = posicaoY + velocidadeY; posicaoX = posicaoX * raio / raioatual; posicaoY = posicaoY * raio / raioatual; contagem = contagem + 1; } entradapassada =in[0]; out[0] = posicaoX; out[1] = posicaoY; out[2] = raioatual; out [3] = contagem;

// In case of error, uncomment next two lines. Set *pnError to 1 and copy Error message to szErrorMsg //*pnError=1;

//strcpy(szErrorMsg, "Place Error description here.");

///////////////////////////////////////////// MODULACAO VARIAVEIS ///////////////////////// #include <Stdlib.h> #include <String.h> #include <math.h> int g_nInputNodes=0; int g_nOutputNodes=0; int g_nStepCount=0; float vcc = 200; float divisorfreq = 100 ; static float contfreq;

///////////////////////////////////////////////////////// static int estado1 = 0;

(69)

static int estado2 = 0; // vetor ativo; static float tempoestado2;

static int estado3 = 3; static float tempoestado3; static int estado4 = 3; static float tempoestado4;

static int estado5= 0; // vetor ativo static float tempoestado5;

static int estado6 = 0; static float tempoestado6; static int estado7 = 0; static float tempoestado7; static int estado8 = 0; static float tempoestado8; static int estadoatual = 0; static int sextanteatual = 1; static int contagem; static float entradapassada;

////////////////////////////// MODULAÇAO UPDATE /////////////////////////// #include <Stdlib.h> #include <String.h> #include <math.h> g_nStepCount++; if ( in[0] > entradapassada ){

//// FAZ CONTFREQ VARIAR DE 0 ATE O MAXIMO /// if ( contfreq > divisorfreq ){

Referências

Documentos relacionados

b) O professor/colaborador não aufere de rendimento para a colaboração mas sim de um valor para a deslocação, determinado por decreto governamental, que de momento é de 0,36€

[r]

O Município investe numa alimentação equilibrada para todos os alunos, disponibiliza as Actividades de Enriquecimento Curricular no 1º ciclo, tem im- plementado o prolongamento dos

Figura 38 - Variação do valor médio do rendimento de pesca de Parape- naeus lonqirostris nas zonas prospectadas.Em cada zona e_s tão representados os valores dos

A combinação dessas dimensões resulta em quatro classes de abordagem comunicativa, que podem ser exemplificadas da seguinte forma: interativo/dialógico: professor e

P3.3 Número total de processos de conhecimento não criminais até então não julgados na instância que, no mês de referência, receberam primeiro ou único julgamento

Com o intuito de dinamizar a área dos condicionantes comportamentais do Plano de Desenvolvimento de Saúde do Município do Seixal (PDS), e de delimitar estratégias de intervenção

Nossa trajetória nesse artigo será, primeiramente, descrever o papel da construção da escrita como forma de evocação espiritual por imagens, de acordo com o entendimento chinês