Você está na página 1de 10

UFES - UNIVERSIDADE FEDERAL DO ESPRITO SANTO

CENTRO TECNOLGICO CT II













ELETRNICA DIGITAL





TRABALHO COMPUTACIONAL - VHDL

GERADOR DE PWM PARA MOTOR DC
CONTADOR DE 0 A 9



Alunos: Marcelo Siqueira Silva
J iennie Hanna de Mendona
Gustavo Perini
Professor: Evandro












VITRIA, 18 DE MARO DE 2005.


1 INTRODUO

O projeto consiste no desenvolvimento da descrio de hardware de um controle de
PWM para motor DC. Foram usados 3 botes, um para ligar (ch1), outro para controlar o
sentido do giro do motor (ch2) e um terceiro para selecionar o ciclo de trabalho do sinal
PWM (ch3). Assumindo uma freqncia do PWM de 1Khz, foram implementadas trs
velocidades: 25%, 50% e 75%.
Foi usado um display de 7 segmentos para mostrar se o motor estava parado (P), se
girava no sentido horrio (H) ou anti-horrio (A). Uma fonte de 24 Vcc usada para
alimentar o motor e uma outra, de 9 Vcc, para alimentar o kit e a parte lgica interna do CI
driver L298.



2 INICIANDO A DESCRIO DO CONTROLE DE MOTOR

Nas entidades, designamos as portas, que no caso so o clock e os 3 botes de
comando como entrada e para a sada os sinais responsveis pela ligao do motor, controle
do sentido de giro e qual largura de pulso o PWM deve usar.
A ltima sada um vetor de 7 bits usado para acender os 7 LEDs do display de 7
segmentos.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity motordc is
Port (clk,ch1,ch2,ch3 :in std_logic;
pwm,giro,habi :out std_logic;
display :out std_logic_vector(6 downto 0));

end motordc;

Na arquitetura sero declaradas as variveis que sero usadas nos processos adiante.

architecture controle of motordc is
signal contab :integer range 0 to 199;
signal clk_bot,A,B,C,G,H :std_logic;
signal bot1,bot2,bot3 :std_logic_vector(1 downto 0);
signal gera_pwm :std_logic_vector(2 downto 0);
signal pwmstate :std_logic_vector(1 downto 0);
begin




3 PROCESSO DE REDUO DE CLOCK

Como a freqncia de trabalho do chip diferente da que queremos trabalhar,
precisamos fazer uma reduo, que nesse caso foi de 1 kHz, para que fosse efetuada a
contagem, atravs da varivel CONTAB.
Foi criada um varivel clk_bot para demonstrar o pulso de clock de 1 segundo.
Ento, quando a contagem chegar ao nmero final, designado no programa, ele efetua um
pulso passando clk_bot de 0 para 1.

process (CLK) --processo para abaixar o clock do botao de 200KHz para 1KHz
begin
if (clk'event and clk = '1') then
if contab < 199 then
contab <= contab + 1;
clk_bot <= '0';
else
clk_bot <= '1'; --clk_bot: clock reduzido para 1kHz
contab <= 0;
end if;
end if;
end process;

4 PROCESSO DE HABILITAR/INIBIR O FUNCIONAMENTO DO MOTOR

As chaves de presso utilizadas no projeto mantinham o nvel lgico 1 at serem
pressionadas, com isso tornavam-se ativas no nvel lgico 0. Caso fossem mantidas
pressionadas por certo tempo, acarretariam erros na implementao. Isso pode ser visto no
diagrama abaixo:



O estado inicial S0 do diagrama acima representa a chave sem estar pressionada.
Quando ela for pressionada (ch=0) haver uma transio do estado S0 para S1. Em seguida,
no importando o estado da chave, passar do estado S1 para S2, ficando neste estado
enquanto a chave estiver pressionada. Quando esta for liberada, retornar ao estado inicial.

Cdigo:
--botao ch1
-- CH1 deve ser usada para habilitar/inibir (0/1) o funcionamento do motor
process (ch1)
begin
if (clk_bot'event and clk_bot='1') then -- a cada pulso do novo clock
case bot1 is
when "00"=>
if ch1='0' then
bot1<="01";
end if;
A<='0';
when "01"=>
A<='1';
bot1<="11";
when "11"=>
if ch1='1' then
bot1<="00";
end if;
A<='0';
when others =>
bot1<="00";
end case;
end if;
end process;
-- Se ch1 estiver pressionada (ch1=0) bot1 pula para o prximo estado
-- e aciona A que d o pulso no processo logo abaixo e muda o estado
-- de H que muda o estado de habi (num processo mais abaixo habi<=H )
-- Se ch1 no estiver pressionada (ch1=1): no sai do lugar pois no
-- troca o estado de bot1.

process (A)
-- Muda o estado da varivel habi: habilita se no estiver habilitado e
-- desabilita se estiver habilitado
begin
if (A'event and A='1') then
H <= H xor '1'; -- funciona como NOT : H <= not H
end if; -- Resumindo, s troca o estado de H (que vai ser passado
end process; -- para habi). process(B) e process(C) so a mesma coisa



5 PROCESSO DE CONTROLE DE SENTIDO DE GIRO DO MOTOR

Para controlar o sentido de giro do motor, foi necessrio apenas inverter o sinal de
sada. Cada variao da sada, de 0 para 1 ou de 1 para0 corresponde a mudana do
sentido de giro. Isso pode ser notado no cdigo abaixo:

-- botao ch2
-- CH2 deve ser usada para controlar o sentido de giro do motor (horrio/anti-horrio)
process (ch2)
begin
if (clk_bot'event and clk_bot='1') then
case bot2 is
when "00"=>
if ch2='0' then
bot2<="01";
end if;
B<='0';
when "01"=>
B<='1';
bot2<="11";
when "11"=>
if ch2='1' then
bot2<="00";
end if;
B<='0';
when others =>
bot2<="00";
end case;
end if;
end process;
-- Se ch2 estiver pressionada (ch2=0) bot2 pula para o prximo estado
-- e aciona B que d o pulso no processo logo abaixo e muda o estado
-- de G que muda o estado de giro (num processo mais abaixo giro<=G )
-- Se ch2 no estiver pressionada (ch2=1): no sai do lugar pois no
-- troca o estado de bot2.
process (B)
begin
if (B'event and B='1') then
G <= G xor '1'; --funciona como NOT : G <= not G
end if;
end process;

process (G,H)
begin
giro <=G;
habi <=H;
end process;









6 CONTROLE DA LARGURA DE PULSO DO PWM

Para gerar o sinal PWM foi montado o diagrama de bolhas abaixo



Os sinais 00, 01 e 10 so os estados de ch3. Se 00, o sinal do PWM ser de
25%, se 10 de 50% e se for 01 ser de 75%. O sinal XX do diagrama significa dizer
que no importa qual o estado da chave que mudar o estado.
Como nosso motor gira no sentido horrio e anti-horrio, fizemos um outro
diagrama de bolhas, representado logo abaixo, para que quando mudssemos o sentido de
rotao no alterasse o valor do PWM. A diferena do diagrama que o sinal 00 agora
de 75% da velocidade e o 10 corresponde a 25%.

Abaixo segue o cdigo dessa parte:

---botao ch3
-- CH3 deve ser utilizada para selecionar o ciclo de trabalho do sinal PWM

process (ch3)
begin
if (clk_bot'event and clk_bot='1') then
case bot3 is
when "00"=>
if ch3='0' then
bot3<="01";
end if;
C<='0';
when "01"=>
C<='1';
bot3<="11";
when "11"=>
if ch3='1' then
bot3<="00";
end if;
C<='0';
when others =>
bot3<="00";
end case;
end if;
end process;
-- Se ch3 estiver pressionada (ch3=0) bot3 pula para o prximo estado
-- e aciona C que d o pulso no processo logo abaixo e muda o estado
-- de pwm_estado que muda a velocidade do motor
-- Se ch3 no estiver pressionada (ch3=1): no sai do lugar pois no
-- troca o estado de bot3.

process (C)
begin
if (C'event and C='1') then -- a cada pulso de C pwmstate muda
case pwmstate is
when "00" =>
pwmstate<="01";
when "01" =>
pwmstate<="10";
when "10" =>
pwmstate<="00";
when others =>
pwmstate<= "00";
end case;
end if;
end process;

-- s seguir os passos:
-- se pwmstate = "00" a sequencia de pwm ser: 1,0,0,0 (25%)
-- se pwmstate = "10" a sequencia de pwm ser: 1,1,1,0 (75%)
-- se pwmstate = "11" a sequencia de pwm ser: 1,1,0,0 (50%)

process (pwmstate,clk_bot)
begin
if (clk_bot'event and clk_bot='1') then
case gera_pwm is
when "000"=>-----------------000 '1'
if pwmstate="00" then
gera_pwm <="001";
else
gera_pwm <= "100";
end if;
pwm <= '1';
when "001"=>------------------001 '0'
gera_pwm <="010";
pwm <= '0';
when "010"=>------------------010 '0'
gera_pwm <="011";
pwm <= '0';
when "011"=>------------------011 '0'
gera_pwm <="000";
pwm <= '0';
when "100"=>------------------100 '1'
if pwmstate="10" then
gera_pwm <="101";
else
gera_pwm <= "010";
end if;
pwm <= '1';
when "101"=>------------------101 '1'
gera_pwm <="011";
pwm <= '1';
when others =>
gera_pwm<= "000";
end case;
end if;
end process;







6 MOSTRAR AS INFORMAES NO DISPLAY

Ser exibido no display de 7 segmentos se o motor est parado (P), se gira no
sentido horrio (H) ou anti-horrio (A).

Você também pode gostar