Você está na página 1de 30

UNIVERSIDADE SÃO JUDAS TADEU

ENGENHARIA DE CONTROLE E AUTOMAÇÃO & ELETRÔNICA

ARNON HIROKI EGASHIRA RA: 817115547 - ELE4AN-MCA


HEITOR GAMEIRO DUARTE RA: 201406535 - ECA4AN-MCA
JORGE HENRIQUE DA SILVA RA: 817126923 - ELE4AN-MCA
LUCAS JAMARINO CERQUEIRA RA: 200500170 - ECA4AN-MCA
VINICIUS MENESES NASCIMENTO RA: 817110731 - ELE4AN-MCA

INVERSOR DE FREQUENCIA

SÃO PAULO – SP
2017
2

ARNON HIROKI EGASHIRA RA: 817115547 - ELE4AN-MCA


HEITOR GAMEIRO DUARTE RA: 201406535 - ECA4AN-MCA

JORGE HENRIQUE DA SILVA RA: 817126923 - ELE4AN-MCA


LUCAS JAMARINO CERQUEIRA RA: 200500170 - ECA4AN-MCA
VINICIUS MENESES NASCIMENTO RA: 817110731 - ELE4AN-MCA

INVERSOR DE FREUQENCIA

Projeto Inversor de frequência apresentado


ao Curso de Engenharia de Controle e
Automação e Engenharia Eletrônica da
Universidade São Judas Tadeu, Campus
Mooca.

Professores: André Luiz Perin


Robson Colantonio
3

SÃO PAULO - SP
2017

SUMÁRIO
1. Introdução...............................................................................................................4

2. Descrição de Hardware..........................................................................................4

2.2 Sinal.................................................................................................................5

2.3 Potência.........................................................................................................10

3 Diagrama de blocos..............................................................................................12

4 Programação VHDL..............................................................................................13

5 Lista de Materiais / Consideracoes......................................................................26

6 Datesheet............................................................................................................27

7 Exemplo de inversor no mercado.......................................................................29


4

1. Introdução

Um inversor de frequência tem como principio de funcionalidade controlar a


velocidade de um motor de indução, o mesmo é capaz de gerar frequências
diferentes da frequência da rede o que resulta na variação de giro, além do mais um
circuito inversor de frequência traz inúmeras vantagens, tais como:

-Acionamentos suaves (contribui para aumentar a vida útil do equipamento)

-Economia de energia (reduz a rotação economizando energia)

No nosso projeto utilizamos um circuito retificador (AC-DC) composto


basicamente por uma ponte de diodos e um capacitor eletrolítico, um circuito que lê
o sinal da FPGA e aciona o circuito da ponte H, que é um circuito (DC-AC) capaz de
acionar o motor de acordo com o sinal gerado.

2. Descrição de Hardware

Nesta seção, será descrito todo o funcionamento do hardware envolvido no


projeto, além do por que dos componentes terem sido utilizados naquele trecho.

O circuito de PWM é composto basicamente por um acoplador óptico, IL817, um


driver de alta tensão para MOSFETs e IGBTs, IR2104 e os MOSFETs que recebem
o sinal para chavear a tensão sobre a carga (motor).

O acoplador óptico IL817, provém isolação elétrica do sinal vindo da FPGA a


parte de potência, recebe o sinal no pino 1 cujo está conectado o anôdo de seu foto
emissor e gera o sinal amplificado e isolado no pino 3 (coletor).

Os circuitos a serem descritos, por ordem, serão denominados por: Sinal e


Potencia.
5

2.2 Sinal

Neste circuito denominado como sinal, o PWM (modulação de largura de


pulso) gerado pelo FPGA passa por um foto acoplador (4n25) para isolar
fisicamente o circuito da placa com a placa de FPGA. Logo após o PWM vai
para um circuito integrado (2104) que serve basicamente para determinar o
pulso que será injetado na base dos transistores da ponte H (placa de potencia),
dessa forma existe um controle de funcionamento dos transistores.

Inicialmente foi realizada uma placa para teste, imagem abaixo (Figura 1).

Figura 1 Protótipo da placa de sinal

Essa placa foi elaborada de acordo com o esquema a seguir com exceção da ponte
H que foi feita em um dissipador separado.
6

Figura 2 Lado esquerdo Sinal

Figura 3 Lado direito Sinal

Ao obter o sinal isolado, o mesmo passa pelo pino 2 do driver de alta tensão
IR2104 e é “dividido” nos pinos 7 e 5 (HO e LO), para controle dos MOSFETs.
Como não é desejável que dois MOSFETs (Q3 e Q4, por exemplo) fiquem
7

conduzindo ao mesmo tempo, enquanto o pino 7, H0, recebe um sinal de ON, o


pino 5, LO, recebe o sinal de OFF, impedindo que ambos sejam ligados ao
mesmo tempo gerando curto no barramento de tensão alta vinda do
retificador.

O resistor de 22Ω em paralelo com o diodo 1N4148 no Gate dos MOSFETs


serve para descarregar a capacitância quase que instantaneamente. O resistor
diminui o tempo de resposta dos estados de ligado/desligado, porém com o
diodo em paralelo, a capacitância descarrega mais rápido por ter uma
resistência menor que a do resistor quando polarizada diretamente.

O driver IR2104 opera no modo contínuo simplesmente aplicando um sinal


de nível lógico alto na entrada do pino 3, o shutdown, este pino define se o
componente vai operar ou não, mesmo com alimentação entre os pinos 8 e 4.

Figura 4 Onda gerada pela ponte H no motor


8

Com base nisso elaboramos um novo esquema mais enxuto dessa vez foi removido
o capacitor em paralelo nos pinos 6 e 1 do 2104, foi separado em duas placas
distintas os componentes que atuam no transistor 1 e 3 com os componentes que
atuam nos transistores 2 e 4 placa demonstrada na figura 4 e esquema
exemplificado nas figuras 5 e 6.

Figura 5 Ultima versão placa de Sinal


9

Figura 6 Lado esquerdo Sinal

Figura 7 Lado direito Sinal


10

2.3 Potência

Para a placa de potencia inicialmente foi elaborado um conjunto único


em que os 4 transistores mosfet irf840 estariam parafusados em um
dissipador de alumínio, porem ao apresentar a ideia ao professor
orientador Robson o mesmo nos alertou sobre o problema de curto
circuito que estava sendo causado pelo contato dos drenos (carcaça dos
transistores) demonstrado na figura abaixo
11

Placa final de potencia:

A partir do feedback do professor separamos os transistores e colocamos um


dissipador para cada, aproveitando a placa foi colocado o retificador em serie com o
capacitor que serve para transforma a rede de AC para DC, foi colocado também um
fusível com o intuito de proteger os Mosfets e por final saída para o motor.

Figura 8 Placa final de potencia


12

Figura 9 Esquema final da placa de potencia

3 Diagrama de blocos

FPGA Sinal

Potência

Encoder

Motor
13

4 Programação VHDL

1 -- ~~+~~ ~~+~~ ~~+~~ ~~+~~ ~~+~~ ~~+~~ ~~+~~ --


2 -- INVERSOR - Developed by --
3 -- Lucas Jamarino Cerqueira --
4 -- LUCASJAMA@GMAIL.COM --
5 -- DATE OCT/2017 --
6 -- Part of LCD by - Gerry O'Brien --
7 -- WWW.DIGITAL-CIRCUITRY.COM --
8 -- ~~+~~ ~~+~~ ~~+~~ ~~+~~ ~~+~~ ~~+~~ ~~+~~ --
9 LIBRARY IEEE;
10 USE IEEE.STD_LOGIC_1164 .all;
11 USE IEEE.STD_LOGIC_ARITH .all;
12 USE IEEE.STD_LOGIC_UNSIGNED .all;
13
14 ENTITY INVERSOR IS
15 PORT(
16 CLK50 : IN STD_LOGIC; -- CLOCK 50MHz
17 PWM_1 : OUT STD_LOGIC:='0'; -- PWM SIGNAL OUT POSTIVE
18 PWM_2 : OUT STD_LOGIC:='0'; -- PWM SIGNAL OUT NEGATIVE
19 LED_3 : OUT STD_LOGIC:='0'; -- PWM SIGNAL OUT NEGATIVE
20 LED_4 : OUT STD_LOGIC:='0'; -- PWM SIGNAL OUT NEGATIVE
21 LED_5 : OUT STD_LOGIC; -- PWM SIGNAL IN RPM_PULSE
22 LED_6 : OUT STD_LOGIC; -- PWM SIGNAL IN RPM_PULSE
23 LED_V : OUT STD_LOGIC_VECTOR (11 DOWNTO 0); -- FOR THE RAMP OF
14

FREQUENCY
24 START : IN STD_LOGIC:='0'; -- START THE INVERRSOS OTHERWISE RETURN TO THE
ORIGINAL VALUES
25 RPM_PULSE : IN STD_LOGIC; -- OPTICAL SWITCH SIGNAL IN
26 UPAMP : IN STD_LOGIC; -- INCREASE AMPLITUDE
27 DOWNAMP : IN STD_LOGIC; -- DECREASE AMPLITUDE
28 SWRAMP : IN STD_LOGIC; -- SWITCH OF RAMP
29 UPMF : IN STD_LOGIC; -- INCREASE FREQUENCY
30 DOWNMF : IN STD_LOGIC; -- DECREASE MANUAL FREQUENCY
31 -- BELOW THE LCD SIGNALS
32 reset : IN std_logic;
33 clock_50 : IN std_logic;
34 lcd_rs : OUT std_logic;
35 lcd_e : OUT std_logic;
36 lcd_rw : OUT std_logic;
37 lcd_on : OUT std_logic;
38 lcd_blon : OUT std_logic;
39 data_bus_0 : INOUT STD_LOGIC;
40 data_bus_1 : INOUT STD_LOGIC;
41 data_bus_2 : INOUT STD_LOGIC;
42 data_bus_3 : INOUT STD_LOGIC;
43 data_bus_4 : INOUT STD_LOGIC;
44 data_bus_5 : INOUT STD_LOGIC;
45 data_bus_6 : INOUT STD_LOGIC;
46 data_bus_7 : INOUT STD_LOGIC
47 );
48 END INVERSOR ;
49
50 ARCHITECTURE logic OF INVERSOR IS
51
52 type character_string is array ( 0 to 31 ) of STD_LOGIC_VECTOR ( 7 downto 0 );
53 type state_type is
(func_set,display_on,mode_set,print_string,line2,return_home,drop_lcd_e,reset1,reset2,
55 reset3, display_off, display_clear );
56 signal state, next_command : state_type;
57 signal lcd_display_string : character_string ;
58 signal lcd_display_string_01 : character_string ;
59 signal HZ1, HZ0, RPM3, RPM2, RPM1, RPM0, A2, A1, A0: STD_LOGIC_VECTOR (7
DOWNTO 0);
60 signal data_bus_value , next_char : STD_LOGIC_VECTOR (7 downto 0);
61 signal clk_count_400hz : STD_LOGIC_VECTOR (23 downto 0);
62 signal char_count : STD_LOGIC_VECTOR (4 downto 0);
15

63 signal clk_400hz_enable ,lcd_rw_int : std_logic;


64 signal Hex_Display_Data : STD_LOGIC_VECTOR (7 DOWNTO 0);
65 signal data_bus : STD_LOGIC_VECTOR (7 downto 0);
66 signal LCD_CHAR_ARRAY : STD_LOGIC_VECTOR (3 DOWNTO 0);
67
68 BEGIN
69
70 data_bus_0 <= data_bus(0);
71 data_bus_1 <= data_bus(1);
72 data_bus_2 <= data_bus(2);
73 data_bus_3 <= data_bus(3);
74 data_bus_4 <= data_bus(4);
75 data_bus_5 <= data_bus(5);
76 data_bus_6 <= data_bus(6);
77 data_bus_7 <= data_bus(7);
78
79 lcd_display_string_01 <=
80 (
81 -- Line 1 F r e q . : 6 0 Hz
82
x"46",x"72",x"65",x"71",x"2E",x"3A",x"20",HZ1,HZ0,x"20",x"48",x"7A",x"20",x"20",x"20",x"20",
83 -- Line 2 R P M : 1 7 8 0 A : 1 0 0 %
84
x"52",x"50",x"4D",x"3A",x"20",RPM3,RPM2,RPM1,RPM0,x"20",x"41",x"3A",A2,A1,A0,x"25"85 );
86
87 data_bus <= data_bus_value when lcd_rw_int = '0' else "ZZZZZZZZ";
88 lcd_rw <= lcd_rw_int;
89
90 PROCESS(CLK50)
91 VARIABLE CLK : INTEGER:=0; -- COUNTER OF 50MHz CLOCK
92 VARIABLE CLKD : INTEGER:=0; -- COUNTER FOR DUTY CICLES, PERCENTAGE OF
DUTY
93 VARIABLE F : INTEGER:=5; -- COUNTER OF ACTUAL FREQUENCY OUTPUT
94 VARIABLE DUTY : INTEGER:=0; -- PERCENT OF DUTY
95 VARIABLE COUNTF : INTEGER:=0; -- COUNTER OF HALFWAVES, FOR JUMP
FREQUENCY
96 VARIABLE POSITION : INTEGER:=0; -- POSITION FOR THE DUTY
97 VARIABLE TURN : INTEGER:=0; -- USE TO TURN THE WAVE
98 VARIABLE AMPLITUDE: INTEGER:=100;-- DEFAULT 100%
99 VARIABLE CLKPB : INTEGER:=0; -- CLOCK FOR THE PUSHBUTTON
100 VARIABLE MF : INTEGER:=5; -- MANUAL FREQUENCY - SET BY USER
101 VARIABLE CLKRPM : INTEGER:=0; -- CLOCK FOR RPM
16

102 VARIABLE COUNTRPM : INTEGER:=0; -- COUNT FOR RPM


103 VARIABLE RPM : INTEGER:=0; -- RPM
104 VARIABLE SIGNALOCK: INTEGER:=0; -- USE TO SUBSTITUTE THE RISING EDGE OF
RPM PULSE
105
106 BEGIN
107
108 IF (RPM_PULSE = '1') THEN
109 LED_5 <= '1';
110 LED_6 <= '0';
111 ELSE
112 LED_5 <= '0';
113 LED_6 <= '1';
114 END IF;
115
116 CASE (F) IS -- JUST TO SHOW THE FREQUENCY RAMP IN LEDS
117 WHEN 5 =>
118 IF (START='0') THEN
119 LED_V <= "000000000000" ;
120 ELSE
121 LED_V <= "100000000000" ;
122 END IF;
123 WHEN 10 => LED_V <= "110000000000" ;
124 WHEN 15 => LED_V <= "111000000000" ;
125 WHEN 20 => LED_V <= "111100000000" ;
126 WHEN 25 => LED_V <= "111110000000" ;
127 WHEN 30 => LED_V <= "111111000000" ;
128 WHEN 35 => LED_V <= "111111100000" ;
129 WHEN 40 => LED_V <= "111111110000" ;
130 WHEN 45 => LED_V <= "111111111000" ;
131 WHEN 50 => LED_V <= "111111111100" ;
132 WHEN 55 => LED_V <= "111111111110" ;
133 WHEN 60 => LED_V <= "111111111111" ;
134 WHEN OTHERS=>LED_V<="000000000000" ;
135 END CASE;
136
137 IF (rising_edge(CLK50)) THEN
138 -- ############# BEGGINIG OF RPM LOGIC ###########
139 IF(CLKRPM < 12500000) THEN -- DELAY OF RPM IS 1 QUARTER OF SECOND
140 IF ( (RPM_PULSE = '1') AND (SIGNALOCK = 0) ) THEN
141 COUNTRPM:= COUNTRPM + 1;
142 SIGNALOCK:= 1;
17

143 END IF;


144 ELSE
145 CLKRPM:= 0;
146 RPM:= COUNTRPM*30; -- THE VALUE 30 IS FOR A ENCODER OF 8 HOLES AND
0,25s OF DELAY TIME
147 COUNTRPM:= 0; -- NOW WORKSSSS Sensor óptico
Encoder 8 LM393
148 END IF;
149 Aqui temos o código do nosso contador de RPM, com tempo de leitura de 0,25 segundos
150 IF (RPM_PULSE = '0') THEN (CLKRPM, total 12.500.000 pulsos de 50MHz). Quando recebemos um sinal alto vindo do
furo, é somado 1 no contador “COUNTRPM” e o sinal fica travado “signallock=1” até
151 SIGNALOCK:= 0; receber o sinal baixo (fora do furo) onde é destravado “signallock=0”. No próximo furo a
152 END IF; condição se repete, somando mais 1 ao contador. Ao final de 0,25segundos, temos o
total, multiplicado por 30.
153 CLKRPM := CLKRPM + 1;
154 -- ##### END OF RPM LOGIC####### O fator 30 vem do seguinte cálculo:
1200RPM = 20RPS = 5 passagens p\ 0,25
segundos
Com 8 furos > 40 passagens.:. 40*30 = 1200
155 IF(CLKPB >= 0) THEN -- DELAY FOR THE AMPLITUDE PUSH BUTTON
Achei interessante e inseri um ajuste manual de amplitude do sinal através de
156 IF(CLKPB < 10000000) THEN
push buttons, assim podemos regular a intensidade da potência de saída.
157 CLKPB := CLKPB + 1;
158 END IF;
159 END IF;
160 IF ( (UPAMP='0') AND (CLKPB=10000000) AND (AMPLITUDE < 195) )THEN --
INCREASE THE AMPLITUDE
161 CLKPB := 0;
162 AMPLITUDE := AMPLITUDE + 1;
163 END IF;
164 IF ( (DOWNAMP = '0') AND (CLKPB=10000000) AND ( AMPLITUDE > 0 ) ) THEN
-- DECREASE THE AMPLITUDE
165 CLKPB := 0;
166 AMPLITUDE := AMPLITUDE - 1;
167 END IF;
168
169 IF (START='0') THEN -- RESET THE PROGRAM TO DEFAULT VALUES AND TURN OF
THE INVERTER
170 CLK := 0 ;
171 CLKD := 0 ;
172 F := 5 ;
173 DUTY := 0 ;
174 COUNTF := 0 ;
175 POSITION := 0 ;
176 TURN := 0 ;
177 PWM_1 <='0';
178 PWM_2 <='0';
18

179 LED_3 <='0';


180 LED_4 <='0';
181 AMPLITUDE:=100;
182 MF := 5 ;
183 END IF;
184
185 CASE (POSITION) IS -- INTENSITY OF SINAL OUTPUT - PERCENTEGAE OF DUTY -
SENOIDAL WAVE
186 WHEN 0 => DUTY := 0 ;
187 WHEN 1 => DUTY := 4 ;
188 WHEN 2 => DUTY := 7 ;
189 WHEN 3 => DUTY := 11 ;
190 WHEN 4 => DUTY := 15 ;
191 WHEN 5 => DUTY := 19 ;
192 WHEN 6 => DUTY := 22 ;
193 WHEN 7 => DUTY := 26 ;
No caso foi utilizada uma divisão de 42 pulsos para uma única rampa, 84
194 WHEN 8 => DUTY := 29 ;
pulsos para meia onda e 168 para onda completa, isso para obter uma
195 WHEN 9 => DUTY := 33 divisão
; de PWM de aproximadamente 5KHz quando em 60Hz, para
196 WHEN aproveitar
10 => DUTY := 37 ; a mesma tabela de duty cicle ao lado, quando em frequências
menores que 60Hz, o PWM aumenta de largura de tempo, deixando o
197 WHEN 11 => DUTY := 40 ;
mesmo duty cicle, porém diminuindo a potência média, para obter a rampa
198 WHEN 12 => DUTY := 43de; potência:
199 WHEN 13 => DUTY := 47 ; PWM
200 WHEN 14 => DUTY := 50 ;
Com isso aproveitamos a mesma
201 WHEN 15 => DUTY := 53 ; tabela para todas as frequência
deixando o programa mais
202 WHEN 16 => DUTY := 56 ;
enxuto. No caso de 30Hz, o duty
203 WHEN 17 => DUTY := 59 ;
204 WHEN 18 => DUTY := 62 ;
205 WHEN 19 => DUTY := 65 ;
206 WHEN 20 => DUTY := 68 ;
207 WHEN 21 => DUTY := 71 ;
208 WHEN 22 => DUTY := 73 ;
209 WHEN 23 => DUTY := 76 ;
210 WHEN 24 => DUTY := 78 ;
211 WHEN 25 => DUTY := 80 ;
212 WHEN 26 => DUTY := 83 ;
213 WHEN 27 => DUTY := 85 ;
214 WHEN 28 => DUTY := 87 ;
215 WHEN 29 => DUTY := 88 ;
216 WHEN 30 => DUTY := 90 ;
217 WHEN 31 => DUTY := 92 ;
218 WHEN 32 => DUTY := 93 ;
219 WHEN 33 => DUTY := 94 ;
19

220 WHEN 34 => DUTY := 96 ;


221 WHEN 35 => DUTY := 97 ;
222 WHEN 36 => DUTY := 97 ;
223 WHEN 37 => DUTY := 98 ;
224 WHEN 38 => DUTY := 99 ;
225 WHEN 39 => DUTY := 99 ;
226 WHEN 40 => DUTY := 100 ;
227 WHEN 41 => DUTY := 100 ;
228 WHEN 42 => DUTY := 100 ;
229 WHEN OTHERS => DUTY := 0 ;
230 END CASE;
231 -- ############### BEGGINIG OF INVERSOR - PWM AND DUTY CICLE
###############
232 233 IF ( CLK < (50000000 / F / 4) ) THEN -- 1/4 WAVE
234 IF ( CLKD < ((50000000/F/4)/42)) THEN -- DIVISION APROXIMATE OF
5KHz PWM
235 CLKD:= CLKD+1;
236 ELSE -- TURN THE RAMP OF 1/4 OF WAVE, TO INCREASE OR DECREASE
THE COUNTER OF THE DUTY CICLE
237 POSITION := POSITION +1;
238 CLKD:=0;
239 END IF;
240 ELSE
241 IF ( CLKD < ( (50000000/F/4)/42) ) THEN -- DIVISION APROXIMATE OF
5KHz PWM
242 CLKD:= CLKD+1;
243 ELSE
244 POSITION := POSITION-1;
245 CLKD:=0;
246 END IF;
247 END IF;
248 ELSE Exemplo de troca manual de frequência:

249 CLK:=0;
250 IF ((F=60) AND (SWRAMP='0')) THEN
251 IF (DOWNMF='0') THEN
A lógica trabalha na condição de que somente salte de frequência
252 MF := MF - 5;
quando a onda completar seu ciclo e em zero, não cortando a onda
253 F := 55; em momento errado, gerando ruídos. A largura de pulsos PWM é de
254 END IF; 5KHz quando em 60Hz, e dentro dessa largura temos a porcentagem
do duty cicle.
255 END IF;
256 IF (F<60) THEN -- ONLY INCREASE 5 Hz IF THE FREQUENCY IS BELOW 60 Hz
257 COUNTF:=COUNTF+1;
2x 5Hz = 0,4s 4x 10Hz = 0,4s 6x 15Hz = 0,4s 8x 20Hz = 0,4s 10x25Hz =
258 IF (COUNTF >= (F/5*4)) THEN -- 4*(1/2) WAVES OF 5Hz AND THEN
0,4s ...

Totalizando todas as ondas 5,10,15,20,25,30,35,40,45,50,55 e 60Hz


soma-se 4,8 segundos de rampa, trocando no momento certo. Essa
20

8*(1/2) WAVES OF 10Hz.. TOTALLING 4,8s


259 IF (SWRAMP='1') THEN
260 F:=F+5; -- INCREASE 5 Hz FOR THE RAMP
261 ELSE
262 IF ( (UPMF='0') AND (MF < 60) )THEN -- INCREASE THE AMPLITUDE IN
THE RIGHT TIME - DELAY 0,4s
263 MF := MF + 5;
264 END IF;
265 IF ( (DOWNMF='0') AND (MF > 5))THEN -- DECREASE THE AMPLITUDE IN
THE RIGHT TIME - DELAY 0,4s
266 MF := MF - 5;
267 END IF;
268 F := MF; -- MANUAL FREQUENCY TO THE VARIABLE F
269 END IF;
270 COUNTF :=0; -- AND RESET THE COUNTER. OF COURSE. IF DON'T RESET THIS,
THE RAMP BECOMES EXPONENCIAL
271 END IF;
272 END IF;
273 IF (TURN = 0) THEN -- THIS STEP ALTERNATE THE OUTPUT SIGNALS TO REPRESENT
THE POSITIVE OR NEGATIVE WAVE
274 TURN:=1;
275 ELSE
276 TURN:=0;
277 END IF;
278 END IF;
279
280 IF (TURN =0) THEN -- SIGNALS OF THE POSITIVE WAVE
281 PWM_2 <= '0'; -- FOR SAFETY
282 LED_4 <= '0'; -- FOR SAFETY
283 IF (( CLKD <= (5000*DUTY/100*AMPLITUDE/100)) AND (F>4)) THEN -- AXIS.
DEFAULT IS 5000
284 PWM_1 <= '1';
285 LED_3 <= '1';
286 ELSE
287 PWM_1 <= '0';
288 LED_3 <= '0';
289 END IF;
290 ELSE -- SIGNALS OF THE NEGATIVE WAVE
291 PWM_1 <= '0'; -- FOR SAFETY
292 LED_3 <= '0'; -- FOR SAFETY
293 IF (( CLKD <= (5000*DUTY/100*AMPLITUDE/100)) AND (F>4)) THEN -- AXIS.
DEFAULT IS 5000
21

294 PWM_2 <= '1';


295 LED_4 <= '1';
296 ELSE
297 PWM_2 <= '0';
298 LED_4 <= '0';
299 END IF;
300 END IF;
301 CLK:=CLK+1;
302 -- ########### END OF INVERSOR - PWM AND DUTY CICLE ##########
303 IF (START='0') THEN
304 HZ1 <= x"30";
305 HZ0 <= x"30";
306 ELSE
307 HZ1 <= x"3" & CONV_STD_LOGIC_VECTOR ( (F / 10) ,4); -- 10
308 HZ0 <= x"3" & CONV_STD_LOGIC_VECTOR ( (F REM 10) ,4); -- 1
309 END IF;
310
311 RPM3 <= x"3" & CONV_STD_LOGIC_VECTOR ( (RPM/1000) ,4); -- 1000
312 RPM2 <= x"3" & CONV_STD_LOGIC_VECTOR ( ((RPM REM 1000)/100) ,4); --
100
313 RPM1 <= x"3" & CONV_STD_LOGIC_VECTOR ( ((RPM REM 100)/10) ,4); -- 10
314 RPM0 <= x"3" & CONV_STD_LOGIC_VECTOR ( (RPM REM 10) ,4); -- 1
315 A2 <= x"3" & CONV_STD_LOGIC_VECTOR ( (AMPLITUDE / 100) ,4); -- 100
316 A1 <= x"3" & CONV_STD_LOGIC_VECTOR ( ((AMPLITUDE REM 100)/10) ,4); --
10
317 A0 <= x"3" & CONV_STD_LOGIC_VECTOR ( (AMPLITUDE REM 10) ,4); -- 1
318
319 next_char <= lcd_display_string_01 (CONV_INTEGER (char_count));
320
321 END IF;
322 END PROCESS;
323
324 process(clock_50)
325 begin
326 if (rising_edge(clock_50)) then
327 if (reset = '0') then
328 clk_count_400hz <= x"000000";
329 clk_400hz_enable <= '0';
330 else
331
332 if (clk_count_400hz <= x"00F424") then
333
22

334 clk_count_400hz <= clk_count_400hz + 1;


335 clk_400hz_enable <= '0';
336 else
337 clk_count_400hz <= x"000000";
338 clk_400hz_enable <= '1';
339 end if;
340 end if;
341 end if;
342 end process;
343
344 process (clock_50, reset)
345 begin
346 if reset = '0' then
347 lcd_blon <= '1';
348 state <= reset1;
349 data_bus_value <= x"38";
350 next_command <= reset2;
351 lcd_e <= '1';
352 lcd_rs <= '0';
353 lcd_rw_int <= '0';
354
355 elsif rising_edge(clock_50) then
356 if clk_400hz_enable = '1' then
357
358 case state is
359 when reset1 =>
360 lcd_e <= '1';
361 lcd_rs <= '0';
362 lcd_blon <= '1';
363 lcd_rw_int <= '0';
364 data_bus_value <= x"38";
365 state <= drop_lcd_e;
366 next_command <= reset2;
367 char_count <= "00000";
368
369 when reset2 =>
370 lcd_blon <= '1';
371 lcd_e <= '1';
372 lcd_rs <= '0';
373 lcd_rw_int <= '0';
374 data_bus_value <= x"38";
375 state <= drop_lcd_e;
23

376 next_command <= reset3;


377
378 when reset3 =>
379 lcd_blon <= '1';
380 lcd_e <= '1';
381 lcd_rs <= '0';
382 lcd_rw_int <= '0';
383 data_bus_value <= x"38";
384 state <= drop_lcd_e;
385 next_command <= func_set;
386
387 when func_set =>
388 lcd_e <= '1';
389 lcd_rs <= '0';
390 lcd_rw_int <= '0';
391 data_bus_value <= x"38";
392 state <= drop_lcd_e;
393 next_command <= display_off;
394
395 when display_off =>
396 lcd_e <= '1';
397 lcd_rs <= '0';
398 lcd_rw_int <= '0';
399 data_bus_value <= x"08";
400
401 state <= drop_lcd_e;
402 next_command <= display_clear ;
403
404 when display_clear =>
405 lcd_e <= '1';
406 lcd_rs <= '0';
407 lcd_rw_int <= '0';
408 data_bus_value <= x"01";
409 state <= drop_lcd_e;
410 next_command <= display_on;
411
412 when display_on =>
413 lcd_e <= '1';
414 lcd_rs <= '0';
415 lcd_rw_int <= '0';
416 data_bus_value <= x"0C";
417 state <= drop_lcd_e;
24

418 next_command <= mode_set;


419
420 when mode_set =>
421 lcd_e <= '1';
422 lcd_rs <= '0';
423 lcd_rw_int <= '0';
424 data_bus_value <= x"06";
425 state <= drop_lcd_e;
426 next_command <= print_string ;
427
428 when print_string =>
429 state <= drop_lcd_e;
430 lcd_e <= '1';
431 lcd_rs <= '1';
432 lcd_rw_int <= '0';
433
434 if (next_char(7 downto 4) /= x"0") then
435 data_bus_value <= next_char;
436 else
437
438 if next_char(3 downto 0) >9 then
439
440 data_bus_value <= x"4" & (next_char(3 downto 0)-9);
441 else
442
443 data_bus_value <= x"3" & next_char(3 downto 0);
444 end if;
445 end if;
446
447 if (char_count < 31) AND (next_char /= x"fe") then
448 char_count <= char_count +1;
449 else
450 char_count <= "00000";
451 end if;
452
453 if char_count = 15 then
454 next_command <= line2;
455
456 elsif (char_count = 31) or (next_char = x"fe") then
457 next_command <= return_home;
458 else
459 next_command <= print_string ;
25

460 end if;


461
462 when line2 =>
463 lcd_e <= '1';
464 lcd_blon <= '1';
465 lcd_rs <= '0';
466 lcd_rw_int <= '0';
467 data_bus_value <= x"c0";
468 state <= drop_lcd_e;
469 next_command <= print_string ;
470
471 when return_home =>
472 lcd_e <= '1';
473 lcd_rs <= '0';
474 lcd_rw_int <= '0';
475 data_bus_value <= x"80";
476 state <= drop_lcd_e;
477 next_command <= print_string ;
478
479 when drop_lcd_e =>
480 state <= next_command ;
481 lcd_e <= '0';
482 lcd_blon <= '1';
483 lcd_on <= '1';
484 end case;
485 end if;
486 end if;
487 end process;
488 END ARCHITECTURE logic;
489 -- ~~+~~ LCS ~~+~~ --
26
27

5 Lista de Materiais / consideracoes

4 - Transistores - IRF640

2 - IR2104

2 - 4N25

2 - Diodo Zenner - 5,1V (5,6V)

2 - Diodo Zenner - 13V (12V)

4 - Diodo IN5408 (IRF640)

2 - Diodo IN4937 (4007)

6 - Capacitor Ceramico 220uF

6 - Capacitor eletrolíticos 100nF

4 - Resistor - 47 ohm

2 - Resistor - 2k2 ohm

2 - Resistor - 10K ohm

2 - Resistor - 220 ohms

1 - Resistor - 1 ohms

A maioria dos componentes utilizados foram adiquiridos na própria universidade,


portanto o gasto que tivemos em relação ao projeto foi mínimo, da ordem de 50
reais, referente a placa de Fenolite Universal.
28

6 Datasheet

Irf840:
29

Ir2104:
30

7 Exemplo de inversor no Mercado

Faixa de valores de tensão nos inversores comerciais.

Faixa de valores presente nos inversores comerciais, no nosso projeto usamos o


Padrão 2 5.0Khz como mostrado na imagem abaixo.

Você também pode gostar