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.
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 )
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.
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.
É 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.
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.
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 )
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
Por fim é possível criar o fluxograma do algoritmo desenvolvido, presente na Figura 27. O código criado está presente no anexo A.