Escolar Documentos
Profissional Documentos
Cultura Documentos
Desenvolvimento de Um Inversor de Freque
Desenvolvimento de Um Inversor de Freque
Vitória
2015
PATRICK TRIVILIN RODRIGUES
Vitória
2015
1
AGRADECIMENTOS
Agradeço primeiramente a Deus, que me deu a dom da vida; aos meus pais, meu avô
e minha namorada, por todo o amor e entrega ao me proporcionarem um estudo e um
ambiente formidáveis para minha formação e por todo exercício da paciência e
confiança nas minhas ausências; ao meu mestre por abraçar essa causa e fazer de
um desafio uma obra concreta; e a todos os amigos que com conselhos, com a doação
do seu tempo e energia, não pouparam vida para edificar a minha.
5
RESUMO
ABSTRACT
The electric motor provided strides in the human development process, replacing the
man in the performance of repetitive tasks and intense effort. Among them, the three-
phase induction motor has a robust construction and high performance, presenting
itself as one of the most versatile types of motors. However, it has the disadvantage of
need a complex speed control system, unusual at low power. The development of an
inverter to take the control of speed for this range of engines is the subject of this paper,
based on the scalar control with closed loop speed, operating properly, embarked in a
development platform and a built hardware.
LISTA DE FIGURAS
LISTA DE TABELAS
LISTA DE SIGLAS
CA – Corrente alternada
CC – Corrente contínua
PI – Proporcional Integral
SUMÁRIO
1 INTRODUÇÃO ........................................................................................... 15
5 METODOLOGIA E IMPLEMENTAÇÃO..................................................... 40
5.2 HARDWARE............................................................................................... 41
5.2.1 O controle.................................................................................................. 41
5.3 ENCODER.................................................................................................. 50
6 RESULTADOS ........................................................................................... 64
14
7 CONCLUSÃO ............................................................................................ 80
REFERÊNCIAS .......................................................................................... 81
1 INTRODUÇÃO
Existem vários tipos de motores elétricos, dos quais os principais são os de corrente
contínua (CC) e corrente alternada (CA). Os motores de corrente contínua são mais
caros, pois é necessário um dispositivo que converta a corrente alternada em corrente
contínua. Os motores de corrente alternada, por sua vez, são mais baratos, pois a
energia elétrica é distribuída em forma de corrente alternada, reduzindo assim seu
custo de compra.
Sua versatilidade faz com que este tipo de motor esteja presente nos mais diversos
tipos de acionamentos mecânicos: desde cargas mínimas, como ventiladores, até
cargas que exigem elevada potência, como compressores.
1.2 JUSTIFICATIVA
Assim sendo, muito ainda há por ser estudado e compreendido nas mais diversas
aplicações dos inversores e percebe-se, com o avanço da tecnologia, a necessidade
de orientação específica referente ao assunto por parte dos fabricantes de motores e
inversores, para que tais aplicações sejam realmente vantajosas em termos de
eficiência energética e atraentes em termos de custo (WEG, 2009).
de baixa potência, e didáticas, para que o seu funcionamento seja estudado mais
profundamente e assim, possibilitar o melhoramento do seu desempenho.
1.3 OBJETIVOS
1.4 METODOLOGIA
2 REVISÃO DA LITERATURA
“Dispositivos que são usados para converter de forma contínua a entrada de energia
elétrica para a saída mecânica ou vice-versa são chamados de máquinas elétricas”
(SEN, 1997, p.121, tradução nossa).
Tal como as correntes que passam nos enrolamentos, as ondas de FMM são
defasadas 120° elétricos umas das outras. Esse campo girante, ao atravessar o rotor,
provoca uma variação de fluxo nos condutores gerando uma força eletromotriz (FEM)
induzida no condutores, por meio da Lei de Faraday. Como os condutores do rotor
estão em curto circuito, eles são percorridos por correntes induzidas.
Estas correntes induzidas, de acordo com a Lei de Lenz, têm um sentido tal
que, pelas suas ações magnéticas, tendem a opor-se à causa que lhes deu
origem. Criam um campo magnético em torno dos condutores do rotor cuja
resultante é um campo que tende a opor-se ao campo magnético girante
criado pelo estator. Para se opor, este campo terá de possuir pólos
magnéticos contrários.
Como o campo do estator gira com o tempo e, partindo da ideia que polos contrários
se atraem, os polos do rotor são atraídos pelos polos do estator e o rotor entra em
rotação tentando acompanhar o campo girante do estator.
22
�
e X2 – Impedância equivalente de enrolamento de rotor refletida ao estator;
n = f
p
Onde:
f – Frequência, em Hertz;
p – Número de polos.
Fluxo ( )
�
Ψ=
�
Onde:
– Frequência angular.
Escorregamento (s)
n −n
s=
n
Onde:
ns – Velocidade síncrona;
nr – Velocidade rotórica.
n = − s .n
P V
Te = . . . ⁄
2 .ωe + +ωe X +X
Onde:
P - Potência no eixo;
e - velocidade síncrona;
O controle por resistência do rotor, válida para rotores bobinados, é vantajoso pela
simplicidade de implementação, porém a inserção de resistências no circuito do rotor
de um motor de indução reduz seriamente a eficiência da máquina, apresentando
baixo rendimento com escorregamento elevado (CHAPMAN, 2011).
Logo, para que o sistema magnético não sature, ou seja, a densidade do fluxo
permaneça constante, a tensão nos terminais do motor deve ser variada em proporção
à frequência (Operação Volt/Hz constante). Neste método de controle de velocidade,
o escorregamento em operação é baixo e a eficiência é alta (SEN, 1997).
27
a tensão não pode ser aumentada com a frequência, o fluxo diminui, assim como o
torque máximo disponível (SEN, 1997).
O controle vetorial ou controle por campo orientado tem por objetivo controlar
separadamente o fluxo e o torque do motor de indução. A ação do comutador de uma
máquina CC, mantendo um ângulo ortogonal fixo entre fluxo e força magnetomotriz
de armadura também é aplicada ao motor de indução por meio da orientação da
corrente do estator com relação ao fluxo do rotor, obtendo assim o desacoplamento
entre fluxo e torque (BOSE, 2002).
Para aplicações de velocidade constante, os MIT têm sido utilizados em malha aberta
com alimentação em 60 Hz constantes. Para aplicações com velocidades ajustáveis,
o controle da frequência é natural. No entanto, a tensão é obrigada a ser proporcional
à frequência de modo a que o fluxo permaneça constante, conforme a equação 2,
desprezando a queda de resistência do estator R1, vista na figura 5.
Para solucionar tal problema, o controle em malha fechada foi implementado: além de
aumentar a precisão, rejeita o efeito de perturbações externas e melhora a dinâmica
do sistema, diminuindo a sensibilidade às variações dos parâmetros do processo.
Todo esse esforço para tornar o sistema mais robusto requererá mais custos de
software e hardware (GOMES, 2000).
Utilizar esta abordagem permite variar a frequência do motor de maneira suave, além
de mostrar-se útil para reduzir o valor de correntes transitórias (DUTRA, 2012). O
32
controle Volts/Hz em malha fechada pode ser implementado conforme mostra a figura
11.
Em geral, existem dois tipos básicos de inversores, que são totalmente diferentes em
seu comportamento: os inversores VSI (“Voltage Source Inverter”), alimentados por
uma fonte de tensão, e os inversores ωSI (“ωurrent Source Inverter”) alimentados por
uma fonte de corrente.
O inversor VSI é mais comum e este tipo de inversor cria uma forma de onda
relativamente bem definida de tensão nos terminais do motor. O segundo tipo de
inversor, o CSI, fornece uma onda de corrente ligado nos terminais do motor
(NOVOTNY; LIPO, 1996).
Os inversores alimentados por uma fonte de tensão VSI, apresentam uma baixa
impedância de entrada, pois possuem somente um capacitor em paralelo que ameniza
o ripple de entrada da tensão CC proveniente do retificador. Este conversor é uma
fonte ajustável de tensão e frequência, onde a tensão de saída é independente da
corrente da carga, o que não ocorre no inversor CSI (NOVOTNY; LIPO, 1996).
Este segundo padrão produz formas de onda de tensão de fase da figura 13 nos
terminais a, b e c. Os números escritos nos níveis das formas de onda indicam que
interruptores estão acionados. Esta sequência de comutação está na ordem de 561,
612, 123, 234, 345, 456, e de volta para a linha 561. As tensões de linhas Vab, Vbc, e
Vca e fase Vas, Vbs, Vcs tem então suas formas de onda mostradas na figura 13.
Em geral, as técnicas de modulação possuem dois tipos básicos. Aquelas que operam
a uma razão cíclica fixa à frequência de comutação fundamental e aquelas em que
razão cíclica varia, em geral senoidalmente, para sintetizar uma corrente de motor
mais semelhante possível à senoidal (chamada modulação por largura de pulso
senoidal, o SPWM) (NOVOTNY; LIPO, 1996).
4.1.2 SPWM
O método consiste em aproximar uma onda senoidal por formas de onda PWM que
são geradas pela comparação do sinal senoidal de controle ou referência (Vref) com
uma portadora triangular ou dente de serra (VPORT), a qual estabelece a frequência de
chaveamento (FCH) da ponte inversora. A frequência do sinal de controle estabelece
36
Estes seis sinais SPWM têm a finalidade de controlar o estado de condução dos
semicondutores do módulo inversor, para que a tensão contínua fornecida pela fonte
CC de alimentação, seja convertida em tensão alternada para alimentar o motor de
indução trifásico. Com o correto acionamento do módulo inversor, a figura 16
apresenta a tensão SPWM que alimenta o motor.
4.1.3 Controle PI
Figura 17 - Controle PI
Este controlador tende a zerar o erro, porém também pode instabilizar o sistema caso
a ação integral seja muito acentuada. Para isso, vários métodos para estimar os
valores das constantes do controlador existem (BEZERRA, 2010).
5 METODOLOGIA E IMPLEMENTAÇÃO
5.1 O MOTOR
Dados do Motor
Motor de Indução Trifásico - Gaiola de Esquilo 60Hz
Data: 06 Setembro de 2007 Série: HN92904
kW(cv): 0,12(0,16) Categoria: N Pólos: 2 IP55
Tensão: 220/380 V Corrente: 0,737/0,427 A
Classe de isolamento: B (130°C) RPM: 3400
Regime de Serviço: S1 cosф: 0, 3 η: 5 ,5% Ip/In: 4,2
5.2 HARDWARE
5.2.1 O controle
pulso dos IGψT’s) no caso de sobrecarga, além de tensão de comando dos IGψT’s
compatível com níveis TTL (DATASHEET IRAM10UP60B, 2012).
No conjunto de acionamento dos IGψT’s, vale ressaltar seu circuito simples e robusto
e a lógica interna para evitar que os transístores complementares entrem em
condução juntos. Segue na figura 22 a tabela lógica de entrada e saída do módulo
IGBT.
O resistor RSS limita o pico de corrente sobre o diodo DSS, e o capacitor CSS, quando
em processo de carga, fornece tensão para os módulos do driver responsáveis pela
46
TTHERM RTHERM VLIMIAR RTRIMPOT TTHERM RTHERM VLIMIAR RTRIMPOT TTHERM RTHERM VLIMIAR RTRIMPOT
[°C] [Ω] [V] [Ω] [°C] [Ω] [V] [Ω] [°C] [Ω] [V] [Ω]
-40 4397119 4,947 529 25 100000 3,401 15986 90 7481 0,687 43134
-35 3088599 4,925 749 30 79222 3,138 18618 95 6337 0,594 44059
-30 2197225 4,895 1047 35 63167 2,867 21331 100 5384 0,514 44861
-25 1581881 4,856 1443 40 50677 2,594 24059 105 4594 0,445 45548
-20 1151037 4,804 1962 45 40904 2,327 26734 110 3934 0,386 46138
-15 846579 4,737 2630 50 33195 2,070 29304 115 3380 0,335 46645
-10 628988 4,652 3476 55 27091 1,828 31718 120 2916 0,292 47079
-5 471632 4,547 4531 60 22224 1,605 33948 125 2522 0,255 47454
0 357012 4,418 5817 65 18322 1,402 35976 130 2190 0,223 47774
5 272500 4,264 7355 70 15184 1,221 37791 135 1907 0,195 48050
10 209710 4,085 9154 75 12635 1,059 39406 140 1665 0,171 48289
15 162651 3,879 11209 80 10566 0,918 40823 145 1459 0,151 48495
20 127080 3,650 13500 85 8873 0,794 42060 150 1282 0,133 48672
A placa utiliza o sensor de corrente linear por efeito Hall ACS712x05B, que possui
saída de sinal analógica variando linearmente com a corrente. Suporta correntes entre
±5 A, requerendo apenas 5 V de alimentação e capacitores de filtro. Com uma
49
sensitividade de 185 mV/A e isolamento de 2,1 kVrms, garante uma variação razoável
na saída e o isolamento da leitura de corrente (DATASHEET ACS712, 2007).
Para o motor utilizado, com corrente nominal entre ±0,737 A eficazes e ±1,042 A de
pico, a tensão de saída do módulo hall varia entre os valores de 2,307 V e 2,693 V.
Essa pouca variação deverá ser compensada com um conversor A/D de maior
precisão.
A ideia do circuito utilizado para o isolamento dos sinais foi proposta em (LIMJUCO;
WILHEIM, 20--), adaptado às necessidades do projeto. Segue na figura 27.
50
5.3 ENCODER
Por ser um encoder de quadratura, é constituído por um disco de duas faixas, que
contém as áreas alternadas de reflexão e não-reflexão, 90 graus fora de fase (MBED,
2010). À medida que roda à frente de um par emissor/receptor para cada faixa, produz
os resultados nos canais de saída A e B. A figura 28 apresenta o detalhe das duas
faixas de reflexão do encoder e a resposta dos sinais nos canais.
Com essas duas respostas, caso seja necessário apenas o feedback de velocidade,
o canal A já é suficiente. Caso o sentido de rotação seja necessário, os dois canais
são necessários para a leitura dos incrementos, visto que nas duas direções esses
incrementos são distintos.
51
5.4 SOFTWARE
Uma maneira prática de gerar uma senóide em programação é utilizando uma tabela
de senos (BOWLING, 2005). Há como se calcular cada valor do seno precisamente,
através da comparação entre um sinal senoidal de referência e uma portadora
triangular, conforme seção 4.1.2.
Uma tabela de poucos valores proporcionaria uma senóide com efeito de “escada”,
causando distorção da corrente no motor e maior aquecimento. Uma boa alternativa
é dividir a frequência máxima de modulação pela máxima frequência de sua portadora
PWM (BOWLING, 2005).
Frequência = × = Hz
Este procedimento é realizado até que a comparação seja válida ou que BRAINOFF
seja maior que OFFSETMAX. Neste evento, a posição do vetor seno é então
incrementada. A diferença entre as variáveis comparadas é armazenada em
OFFSETREF e o processo reinicia.
Pela figura, vê-se que os passos, ou seja, as posições do vetor de senos referentes à
60 Hz são repetidas quatro vezes, proporcionando um PWM senoidal com um período
quatro vezes maior que um PWM senoidal de 60 Hz. Logo este PWM senoidal
corresponderia a uma frequência de 15 Hz.
56
O controle de corrente é realizado tanto por software quanto por hardware. Via
hardware, utiliza-se de uma característica inerente ao módulo inversor: um termistor
interno que tem sua resistência variada com a temperatura do módulo.
Via software, o controle atua de duas maneiras: feedback do módulo inversor e por
leitura direta das correntes de alimentação do motor.
No instante em que o controle de corrente via hardware atua, o status desse processo
é lido por uma porta da plataforma de desenvolvimento que se encarrega de parar
todo o programa e levar suas saídas ao status de segurança, ou seja, parando de ler
as variáveis de monitoramento, cessando as modificações de tensão/frequência e
levando as saídas não barradas de PWM a zero e as barradas a um. Essa manobra
garante que o módulo de potência não entregue nenhuma tensão indesejada ao MIT.
O controle através das leituras das correntes de fase é um controle reversível até os
limites de segurança e, caso estes limites sejam excedidos, atua de maneira radical
como o controle anterior.
Baseia-se na leitura periódica das correntes de duas fases do MIT, através dos
sensores Hall, numa frequência cinco vezes maior que o incremento do PWM. Após
passarem por uma filtragem digital, as leituras das duas fases são monitoradas
mediante dois limites de corrente, agindo então de três maneiras distintas.
57
Num primeiro caso, o controle permite que o software funcione perfeitamente até que
a corrente de uma das fases alcance o limite de 20% acima da corrente nominal
(1,2xIPICO NOM = 1,2x1,0423 = 1,25 A). Caso exceda o limite anterior, o controle Volt/Hz
é parado e mantém-se o mesmo valor de tensão e frequência de saída até que a
corrente volte aos limites de segurança. Se ainda assim a corrente aumentar até 50%
acima da nominal (1,5xIPICO NOM = 1,5x1,0423 = 1,56 A), o controle executa um
shutdown no sistema e os mesmos procedimentos do controle anterior são
executados. A tabela 4 apresenta os limites e procedimentos tomados pelo software
neste controle.
Para que haja uma leitura adequada do encoder, é notável que seja feito um
acoplamento seguro com o eixo do motor. Com o intuito de não inutilizar o lado de
trabalho do eixo do motor para a utilização de carga futuramente, o encoder foi
posicionado no outro lado da carcaça, ficando anexado à grade própria do motor. O
acoplamento do encoder com o MIT é visto nas figuras 32 e 33.
58
Como o encoder fornece resposta em pulsos, também sofre ação de ruído. Logo, para
amenizar esse efeito indesejado nos pulsos do encoder foi desenvolvido um filtro do
tipo média móvel, onde sempre os quatro últimos valores lidos são armazenados para
fornecer a média, valor final utilizado pelo software. O trecho do programa responsável
pela filtragem corresponde às linhas 201 até a linha 224 do Anexo II.
5.4.5 Controle PI
Os valores dos ganhos foram obtidos conforme a seção 4.1.3, a partir de um site de
sintonização de compensadores para o método de Ziegler Nichols em malha aberta
que, através das funções da tabela 1 e valores definidos como período de integração,
sendo considerado o período de atualização do PWM, 130,2 us, atraso, considerando
um tempo permissível de 1 segundo, ganho do processo e tempo de amostragem,
apresentando os valores de ganho proporcional e integral de 0.2 e 0.01,
respectivamente (MEHTA, 2006).
Isso quer dizer que a cada nova aquisição da velocidade do rotor, o software realiza
a atualização da velocidade a ser imposta ao motor, com base na condição atual e
nos valores obtidos da compensação do controle Proporcional-Integral. Após os
limites de anti-windup e da rampa de aceleração, o valor da nova frequência é imposta
ao motor.
61
Falha é definida no projeto como um evento que, mesmo que conhecido, é indesejado
no programa. Quando este tipo de evento ocorre, o software age inibindo os pulsos
na saída PWM, a fim de assegurar a integridade de todos os componentes envolvidos
no projeto. Todos os tipos de falhas já foram descritos durante o projeto: sobrecorrente
detectada pelos sensores Hall (software) e sobrecorrente indicada por aquecimento
do módulo de potência (hardware).
Sua indicação é apresentada por dois LED’s (Light Emitting Diode, traduzindo, Diodo
Emissor de Luz) situados no Hardware fabricado. A combinação deles informa o tipo
de falha atuante ou a não atuação delas e, consequentemente, o status de operação
do inversor. A tabela 5 apresenta cada condição existente e o status correspondente.
Erro de Enable
01 (detecção de sobretemperatura do
Módulo inversor)
Sistema no estado de segurança de
10
sobrecorrente.
Vale ressaltar que o único status dos LED’s que é reversível é o modo de
sobrecorrente do Hall, pois neste caso ele indica que a corrente está transitando no
nível de segurança já definido (1,2xINOM ≤ INOM ≤ 1,5xINOM). Caso a corrente exceda
esse limite, o sistema é desligado e os LED’s todos se acendem, caso volte ao normal,
todos se apagam.
62
O esquema final do projeto pode ser visto na figura 34. Suas partes principais e
componentes mais relevantes foram definidos no transcorrer deste capítulo. Seguindo
esse esquema, o projeto da placa de circuito impresso (PCI) foi transcrito para um
software computacional específico de produção PωI’s, o Kicad.
Após toda a transcrição e definição das propriedades da placa, tais como material da
placa, espessura de trilhas e isolamento entre trilhas, o projeto definitivo foi enviado
para produção. A figura 35 apresenta o projeto desenvolvido no software Kicad.
6 RESULTADOS
Como já dito no capítulo 5, a plataforma possui dois tipos de pinos: os tipos Morpho e
os compatíveis com o Arduino. Essa característica foi considerada no
desenvolvimento do hardware, de maneira que a plataforma MBED é perfeitamente
acoplável à PCI produzida, através da conexão de seus pinos do tipo Morpho aos
pinos fêmea do tipo miniheader da PCI. O acoplamento entre PCI e plataforma pode
ser visto nas figuras 38 e 39.
66
Isso permite que os pinos compatíveis com o Arduino estejam disponíveis para
utilização de Shields, LωD’s, botões ou qualquer outra interface desejada.
Para o projeto, uma pequena interface foi projetada a fim de alcançar uma praticidade
e rapidez na visualização dos parâmetros no projeto, como referência de velocidade,
velocidade atual, e ainda apresentar mais uma alternativa de exibição de erros. Há
também três botões, um com a função de habilitar e desabilitar a saída para o motor
e outros dois que alteram os tipos de resultados apresentados no LCD. A montagem
completa é vista nas figuras 40 e 41.
67
Os resultados do programa foram colhidos pelo osciloscópio e podem ser vistos nas
figuras seguir, com as frequências podendo ser conferidas pela Transformada de
Fourier (FFT) também mostrada na tela para cada amostra de frequência.
Nas figuras 42 a 44, vê-se o PWM senoidal apresentado na seção 4.1.2, exemplificado
pela figura 15, entregue ao módulo inversor para a conversão da tensão, em diferentes
frequências.
Nas figuras 45 e 46, tem-se a defasagem entre duas fases na entrada do módulo
inversor, entre a fase 1 e 2 e entre a fase 1 e 3, respectivamente.
68
Por fim, na figura 48, apresenta-se a saída do módulo inversor com a defasagem entre
as fases reais que alimentam o motor, fases U e V. Nela, vê-se o SPWM como
esperado pela figura 16 da seção 4.1.2.
Como mencionado na seção 5.4.2, dois tipos de erros de sobrecorrente são previstos
no funcionamento do inversor: via hardware e via software, com suas respectivas
sinalizações.
Na proteção por hardware a temperatura limite que o módulo inversor pode alcançar
foi definida em 55°C, fazendo com que, de acordo com a tabela 1, o potenciômetro de
ajuste seja calibrado para um VLIMIAR=1,828V.
71
Essa proteção do hardware é monitorada pelo software para que a plataforma entre
em estado de segurança junto ao desligamento do módulo inversor, e assim, não
exista nada operando nessa circunstância.
Tendo em vista que diversas fontes de ruídos estão presentes no projeto (conexões
mecânicas, motor, chaveamento, entre outros), há a possibilidade de um ruído alterar
a magnitude do sinal gerado e alterar a zona de segurança correta do valor de corrente
lido. Para mitigar esse possível efeito, um filtro digital de segunda ordem do tipo
Butterworth foi implementado.
No gráfico da figura 51, vê-se o valor real da corrente lido no período de 38.400 Hz
(ou seja, 5 vezes a frequência de trabalho do programa, que é 7680 Hz) e o valor após
filtragem. Na figura 52, as duas fases filtradas são mostradas, na mesma taxa de
amostragem.
O filtro digital causa um atraso de 4 leituras, porém como são realizadas cinco leituras
de corrente para cada atualização de PWM, a segurança ainda é mantida. No gráfico
da figura 53 observa-se claramente o atraso em uma mudança de sinal dos valores
de corrente.
O gráfico da figura 54 apresenta a filtragem durante uma partida direta com parada, e
na figura 55, vê-se a redução do ruído através da filtragem dentro do regime
permanente do motor, utilizando o acoplamento da seção 5.4.3 e a filtragem por média
móvel definida.
6.2.3 Controle PI
Figura 56 - Controle PI
7 CONCLUSÂO
- Reversão de velocidade.
81
REFERÊNCIAS
BOSE, B. K. Modern Power Electronics and Ac Drives. Nova Jersey: Prentice Hall
PTR, 2002. 711 p. lSBN 0-13'016743-6.
BOTÊGA JR., Mário L., Controle Digital para Motor de Indução Trifásico em
aplicações de baixo custo. Eletricidade Moderna, No. 11, pp 166-176. Novembro,
2000. Disponível em: <http://www.camacho.prof.ufu.br/TT-035.pdf> Acesso em 05
de jun. de 2015.
WOOD, P. et al. Application Note 1044: Integrated Power Module for Appliance
Motor Drives. Revisão A. 2002. Disponível em: <http://www.irf.com/technical-
info/appnotes/an-1044.pdf> Acesso em: 24 set. 2014.
84
seno[128]={0.500,0.525,0.549,0.573,0.598,0.621,0.645,0.668,0.691,0.714,0.736,0.7
57,0.778,0.798,0.817,0.836,0.854,0.870,0.887,0.902,0.916,0.929,0.941,0.952,0.962,
0.971,0.978,0.985,0.990,0.995,0.998,0.999,1.000,0.999,0.998,0.995,0.990,0.985,0.9
78,0.971,0.962,0.952,0.941,0.929,0.916,0.902,0.887,0.870,0.854,0.836,0.817,0.798,
0.778,0.757,0.736,0.714,0.691,0.668,0.645,0.621,0.598,0.573,0.549,0.525,0.500,0.4
75,0.451,0.427,0.402,0.379,0.355,0.332,0.309,0.286,0.264,0.243,0.222,0.202,0.183,
0.164,0.146,0.130,0.113,0.098,0.084,0.071,0.059,0.048,0.038,0.029,0.022,0.015,0.0
10,0.005,0.002,0.001,0.000,0.001,0.002,0.005,0.010,0.015,0.022,0.029,0.038,0.048,
0.059,0.071,0.084,0.098,0.113,0.130,0.146,0.164,0.183,0.202,0.222,0.243,0.264,0.2
86,0.309,0.332,0.355,0.379,0.402,0.427,0.451,0.475};
1 #include "mbed.h"
2 #include "freq_counter.h"
3 #include "PinDetect.h"
4 #include "TextLCD.h"
5 //CONFIGURAÇÃO DE PORTAS E INTERRUPÇÕES
6 Ticker showlcd; //Interrupção para atualização do LCD
7 Ticker freqport; //Interrupção para incremento do vetor seno
8 Ticker leituraref; //Interrupção para leitura da referencia
9 Ticker leituracorrente; //Interrupção para leitura das correntes
10 Ticker backencod; //Interrupção para leitura da velocidade
11 AnalogIn pot(A5); //(Entrada) Pot. - Referência de Velocidade
12 AnalogIn HallA(A4); //(Entrada)Hall A - Leitura da corrente da Fase A do motor
13 AnalogIn HallB(A3); //(Entrada)Hall B - Leitura da corrente da Fase B do motor
14 DigitalOut erroA(PC_10); //(Saída)LED para identificação do erro
15 DigitalOut erroB(PC_12); //(Saída)LED para identificação do erro
16 PwmOut saidaS1(D3); //(Saída) PWM fase A
17 PwmOut saidaS2(D5); //(Saída) PWM fase B
18 PwmOut saidaS3(D6); //(Saída) PWM fase C
19 PwmOut saidaS1b(D9); //(Saída) PWM fase A replicada
20 PwmOut saidaS2b(D10); //(Saída) PWM fase B replicada
21 PwmOut saidaS3b(D11); //(Saída) PWM fase C replicada
22 InterruptIn enableiram(PD_2); //(Entrada) Sinal de sobreaquecimento do IRAM
23 F_COUNTER fc(PA_0); //(Entrada)Hardwarecounter do microcontrolador
24 TextLCD lcd(D2, D4, D7, D8, D12, D13); //(Saída) rs, e, d4-d7 - Pinos do LCD
25 PinDetect pb1(PA_11); //(Entrada) Botão de incremento do LCD
26 PinDetect pb2(PA_12); //(Entrada) Botão de decremento do LCD
27 PinDetect pb3(PC_11); //(Entrada) Botão de habilitação PWM - START
28 //CONSTANTES E FUNÇÕES
29 #define FPORT 3125/24 //7680 Hz: Frequencia de Trabalho para o PWM
30 #define TIMELEITURA 1000000/60 //60 Hz: Leitura da velocidade de referência
31 #define THALL 625/24 //38400Hz: Leitura das correntes
32 #define TLCD 2000000 //0,5Hz: atualização do LCD
33 #define ftopercent(x) x/65535.0 //Converte valor de 16bits para freq de 0.0 a 1.0
34 #define getoffset(x) x/128 //Obtém o valor do offset da velocidade atual do MIT (=
35 x*60/7680)
36 #define OFFSETMAX 512 //Offset exato para a Frequencia máxima: 60Hz
37 //Leitura de corrente
38 #define ICOEF1 -0.667 //Coeficiente do Filtro Digital
39 #define ICOEF2 1.6 //Coeficiente do Filtro Digital
40 #define IGAIN 59 //Ganho do Filtro Digital
41 #define VPU 0.000289528 //Transformação da corrente de 16bits para Amperes
42 #define IMAX1 4340 //Nível de corrente máxima desejado, 1,2x a corrente máxima do
43 motor
44 #define IMAX2 5425 //Nível de corrente máxima limite, 1.5x a corrente máxima nominal
45 do motor
46 //Leitura de velocidade
47 #define FENCOD 12500 //80 Hz: Atualização da velocidade do motor
48 //Controle PI
49 #define KP 5 //Constante Proporcional (0.2 = 1/5)
86
102 shooow=1;
103 }
104 void fcode() { //Função que habilita a leitura dos pulsos do encoder
105 flagveloc=1;
106 }
107 void HallAB(){ //Função que habilita a leitura das correntes
108 FlagLeitura=1;
109 }
110 void leituraf() { //Função que habilita a leitura do potenciômetro
111 Flagleituraf=1;
112 }
113 void fcount() { //Função que trata do condicionamento da senóide de saída
114 Flagfcount=1;
115 }
116 /*OFFSET A DE CORRENTE - Função que calcula os offsets correspondentes ao 0A para os Hall's
117 serem aferidos*/
118 void hallzero() {
119 float somaA=0;
120 float somaB=0;
121 for(int hA=50; hA>0; hA--){
122 leitu_hA = HallA.read_u16();
123 leitu_hB = HallB.read_u16();
124 somaA += leitu_hA;
125 somaB += leitu_hB;
126 }
127 zeroA = somaA/50;
128 zeroB = somaB/50;
129 lcd.locate(0,0); //Apresenta na tela do LCD
130 lcd.printf("OffsetA=%d ",zeroA);
131 lcd.locate(0,1);
132 lcd.printf("OffsetB=%d ",zeroB);
133 wait(1);
134 }
135
136 /* PROGRAMA PRINCIPAL */
137 int main() {
138 pb1.mode(PullUp); //Declaração do tipo dos botões
139 pb2.mode(PullUp);
140 pb3.mode(PullUp);
141 wait(.01); //Delay para pullup inicial tomar efeito
142 //Declaração das funções que serão chamadas pelo acionamento dos botões
143 pb1.attach_deasserted(&pb1_hit_callback);
144 pb2.attach_deasserted(&pb2_hit_callback);
145 pb3.attach_deasserted(&pb3_able);
146 pb1.setSampleFrequency();
147 pb2.setSampleFrequency();
148 pb3.setSampleFrequency();
149 hallzero(); //Primeiro ato: leitura do Offset do Hall e aferição
150 leituraf(); //Segundo ato: leitura da referência atual
151 saidaS1.period_us(FPORT); //Definição da Largura de pulso padrão de todas as saídas PWM
152 em (1/7680)s
153 saidaS2.period_us(FPORT);
88
154 saidaS3.period_us(FPORT);
155 saidaS1b.period_us(FPORT);
156 saidaS2b.period_us(FPORT);
157 saidaS3b.period_us(FPORT);
158 backencod.attach_us(&fcode,(FENCOD)); //Interrupção da leitura do encoder
159 freqport.attach_us(&fcount,(FPORT)); //Interrupção do condicionamento da senóide
160 leituraref.attach_us(&leituraf,(TIMELEITURA)); //Interrupção da leitura do potenciômetro de
161 referência
162 leituracorrente.attach_us(&HallAB,(THALL)); //Interrupção da leitura de corrente
163 showlcd.attach_us(&lcdshow,(TLCD)); //Interrupção de atualização do LCD
164 float
165 seno[128]={0.500,0.525,0.549,0.573,0.598,0.621,0.645,0.668,0.691,0.714,0.736,0.757,0.778,0.798,0.
166 817,0.836,0.854,0.870,0.887,0.902,0.916,0.929,0.941,0.952,0.962,0.971,0.978,0.985,0.990,0.995,0.9
167 98,0.999,1.000,0.999,0.998,0.995,0.990,0.985,0.978,0.971,0.962,0.952,0.941,0.929,0.916,0.902,0.88
168 7,0.870,0.854,0.836,0.817,0.798,0.778,0.757,0.736,0.714,0.691,0.668,0.645,0.621,0.598,0.573,0.549,
169 0.525,0.500,0.475,0.451,0.427,0.402,0.379,0.355,0.332,0.309,0.286,0.264,0.243,0.222,0.202,0.183,0.
170 164,0.146,0.130,0.113,0.098,0.084,0.071,0.059,0.048,0.038,0.029,0.022,0.015,0.010,0.005,0.002,0.0
171 01,0.000,0.001,0.002,0.005,0.010,0.015,0.022,0.029,0.038,0.048,0.059,0.071,0.084,0.098,0.113,0.13
172 0,0.146,0.164,0.183,0.202,0.222,0.243,0.264,0.286,0.309,0.332,0.355,0.379,0.402,0.427,0.451,0.475
173 }; //vetor seno
174 int passo1=0; //Passo no início do vetor = Fase A
175 int passo2=42; //Passo defasado de 120° = Fase B
176 int passo3=85; //Passo defasado de 240° = Fase C
177 int brainoff =0; //Diferença entre os valores de offset
178 float vhz=0; //Aplica a proporcionalidade da freq na duty cicle
179 int offsetref=0; //Offset para cálculo do condicionamento do vetor seno
180 //leitura corrente
181 int Ia[3]={0,0,0}; //Vetor de valores reais de corrente da Fase A
182 int IaF[3]={0,0,0}; //Vetor de valores filtrados de corrente da Fase A
183 int Ib[3]={0,0,0}; //Vetor de valores reais de corrente da Fase B
184 int IbF[3]={0,0,0}; //Vetor de valores filtrados de corrente da Fase B
185 //RAMPA
186 int Va[4]={384,384,384,384}; //Vetor para a média de velocidades 378 pulsos=15Hz iniciais.
187 int fatual= 16384; //Frequência a ser entregue ao motor (15Hz)
188 //Controle PI
189 int Integer=0; //Armazena o erro integral
190 frequency = fc.read_frequency(0.025); //Definição do tempo de leitura do contador de pulsos
191 lcd.locate(0,0); //Indicação Visual do início da operação do Inversor
192 lcd.printf("Pronto. ");
193 lcd.locate(0,1);
194 lcd.printf("Inicializando...");
195 wait(1);
196 //LOOP INFINITO
197 while(1) {
198 enableiram.rise(&erroiram); //Chama função que aplica SHUTDOWN devido a
199 sobreaquecimento do IRAM
200 if(alerta==0){ //Indicação de não ocorrência de erro que cause SHUTDOWN
201 if(flagveloc==1){ //Tratamento da velocidade
202 Va[0]=Va[1];
203 Va[1]=Va[2];
204 Va[2]=Va[3];
205 Va[3] = frequency;
89
258 saidaS3.write(0);
259 saidaS3b.write(1);
260 }
261 if(OFFSETMAX >= offsetref) offsetref += brainoff;
262 Flagfcount=0;
263 } //Fim do tratamento da saída
264 if(FlagLeitura==1){ //Tratamento das correntes
265 leitu_hA = HallA.read_u16(); //Leitura do Hall A em 16 bits
266 leitu_hB = HallB.read_u16(); //Leitura do Hall B em 16 bits
267 //INICIO DO FILTRO IIR
268 Ia[0]=Ia[1];
269 Ia[1]=Ia[2];
270 Ia[2] = leitu_hA - zeroA; //Retira o Offset da leitura, ajustando a corrente lida para CA
271 Ib[0]=Ib[1];
272 Ib[1]=Ib[2];
273 Ib[2] = leitu_hB - zeroB; //Retira o Offset da leitura, ajustando a corrente lida para CA
274 IaF[0]=IaF[1];
275 IaF[1]=IaF[2];
276 IaF[2] = (Ia[0]+Ia[2]+ 2*Ia[1])/IGAIN + (ICOEF1*IaF[0]) + (ICOEF2*IaF[1]);
277 IbF[0]=IbF[1];
278 IbF[1]=IbF[2];
279 IbF[2] = (Ib[0]+Ib[2]+ 2*Ib[1])/IGAIN + (ICOEF1*IbF[0]) + (ICOEF2*IbF[1]);
280 //FIM DO FILTRO IIR BUTTERWORTH DE 2 ORDEM
281 //VERIFICAÇÃO DOS VALORES DAS CORRENTES E CONDIÇÕES DE SEGURANÇA
282 if(IaF[2]<IMAX1){
283 altacorrente = 0; //Atualização dos valores de frequência atual mantidos
284 erroA=0;
285 erroB=0;
286 }
287 if((IaF[2]>IMAX1)&&(IaF[2]<IMAX2)){ //Zona de segurança suportável: reversível.
288 altacorrente = 1;
289 erroA=1;
290 erroB=0;
291 lcd.locate(0,0);
292 lcd.printf("Sobrecorrente ");
293 lcd.locate(0,1);
294 lcd.printf("em seguranca. ");
295 }
296 if(IaF[2]>IMAX2){ //Corrente alcançou a zona não permitida - SHUTDOWN
297 alerta=1; //SHUTDOWN
298 altacorrente = 1; //Indica erro por sobrecorrente
299 erroA=1; //Erro 11 = erro por sobrecorrente. Indicação dos LED's.
300 erroB=1;
301 lcd.locate(0,0); //Indicação do LCD
302 lcd.printf("SOBRECORRENTE ");
303 lcd.locate(0,1);
304 lcd.printf("------> SHUTDOWN");
305 }
306 if(IbF[2]<IMAX1){
307 altacorrente = 0; //Atualização dos valores de frequência atual mantidos
308 erroA=0;
309 erroB=0;
91
310 }
311 if((IbF[2]>IMAX1)&&(IbF[2]<IMAX2)){ //Zona de segurança suportável: reversível.
312 altacorrente = 1; //Não permite a atualização dos valores de frequência
313 erroA=1;
314 erroB=0;
315 lcd.locate(0,0);
316 lcd.printf("Sobrecorrente ");
317 lcd.locate(0,1);
318 lcd.printf("em seguranca. ");
319 }
320 if(IbF[2]>IMAX2){ //Corrente alcançou a zona não permitida - SHUTDOWN
321 alerta=1; //SHUTDOWN
322 altacorrente = 1; //Indica erro por sobrecorrente
323 erroA=1; //Erro 11 = erro por sobrecorrente. Indicação dos LED's.
324 erroB=1;
325 lcd.locate(0,0); //Indicação do LCD
326 lcd.printf("SOBRECORRENTE ");
327 lcd.locate(0,1);
328 lcd.printf("------> SHUTDOWN");
329 }
330 FlagLeitura=0;
331 } //Fim do tratamento das correntes
332 } //Fim das funções do programa
333 else{ //Caso um erro aconteça, o programa é mantido nesta zona
334 saidaS1.write(0); //Estados de segurança para o IRAM
335 saidaS1b.write(1);
336 saidaS2.write(0);
337 saidaS2b.write(1);
338 saidaS3.write(0);
339 saidaS3b.write(1);
340 if(altacorrente==1){
341 erroA=1; //Erro 11 = erro por sobrecorrente
342 erroB=1;
343 lcd.locate(0,0);
344 lcd.printf("SOBRECORRENTE ");
345 lcd.locate(0,1);
346 lcd.printf("------> SHUTDOWN");
347 }
348 if(altacorrente==2){
349 erroA=0; //Erro 01 = erro por enable
350 erroB=1;
351 lcd.locate(0,0);
352 lcd.printf("ERRO IRAM ");
353 lcd.locate(0,1);
354 lcd.printf("------> SHUTDOWN");
355 }
356 } //Fim do tratamento de erro
357 if(shooow==1){ //Atualização do LCD
358 if(lcddisplay>3) lcddisplay=3;
359 if(lcddisplay<0) lcddisplay=0;
360 if(lcddisplay==0){ //Amostragem da referência e da frequência atual (Hz)
361 lcd.locate(0,0);
92