Universidade Federal do Rio Grande do Sul Escola de Engenharia Departamento de Engenharia Elétrica ENG04475 – Microprocessadores I
Projeto: Sistema de controle para elevador de cargas com movimento vertical e horizontal
Nomes: Alessandro Girardi Antônio Soares Azzalini Cesar Eduardo Butzge
Porto Alegre, 17 de Dezembro de 2012.
Introdução: Nosso projeto busca fazer o controle de um elevador de carga que deve transportar cargas de um setor a outro dentro de uma empresa. O usuário deve inserir informações sobre o destino do elevador, fazer o carregamento sem exceder a carga máxima permitida e travar a porta da cabine de carga. Feito isso, o elevador deve ser a cionado para começar o transporte. A empresa terá 3 setores atendidos pelo sistema de transporte, sendo um definido como ponto de origem, de onde devem partir ou chegar as cargas. Nos pontos de interesse, sensores serão os responsáveis pelo envio da informação ao controlador. Teremos um sensor para informar que o elevador chegou ao chão em cada setor, um sensor para informar que o elevador chegou na altura dos trilhos horizontais em cada setor e sensores de posicionamento horizontal, que indicará em que ponto do trilho horizontal a carga deve descer.
Funcionamento: O sistema de cargas terá como origem o setor 1, que está no meio do percurso entre o setor 2 e o setor 3. Sempre que o elevador estiver no setor 1, ele buscará a informação sobre qual será o destino (setor 2 ou setor 3), que será informado pelo operador, através de uma chave. Quando o elevador estiver no setor 2 ou setor 3 ele sempre voltará ao setor 1. Quando o elevador estiver no chão de cada setor, o sistema verificará se a porta da cabine está fechada, se o peso está dentro do limite máximo permitido e aguardará o botão de início. Se em algum momento ocorrer um problema, o botão de emergência será acionado e todos os motores serão desligados. Quando os motores forem desligados, os leds do posicionamento do setor estarão mostrando qual a localização atual do elevador. O sistema aguardará o botão de início ser acionado para fazer o elevador retornar ao setor 1, ou seja, sempre que ocorrer uma emergência o elevador para a execução atual e retorna ao setor 1. Depois da chegada ao setor 1, o sistema deve ser reinicializado para voltar a operar normalmente.
Hardware Conversor Analógico – Digital
Com o objetivo de simular um suposto peso no elevador de carga, usamos um potenciômetro em que poderíamos variar uma tensão em suas saídas. Com este potenciômetro podemos variar uma tensão de 5V a 0V, sendo esta tensão ligada em um conversor analógico digital. O conversor AD utilizado foi o ADC0804, cujas principais características são que sua saída é de 8 bits e possui apenas uma entrada analógica, o que se enquadrava perfeitamente
em nosso projeto. A resolução deste conversor é dada por
5 , logo a resolução é de 2
0,0195V. Em nosso projeto usamos apenas os 5 bits mais significativos, sendo que no momento em que o LED mais
significativo fosse ligado, nosso elevador não poderia ser mais
direcionado para nenhum lugar.E quando este bit estivesse desligado, estaria todos os comandos de desejo ativados. Teremos no nosso projeto final as saídas DB7,DB6,DB5,DB4 E DB3 ligadas nos pinos P2.7, P2.6, P2.5, P2.4 e P2.3 respectivamente.
Figura
Observamos na figura acima que o ADC0804 é alimentado pela tensão de 5V gerada pelo regulador de tensão, nota-se também, observando que os pinos
e estão ligados
entre si, que este conversor está operando no modo Free-Running, ou seja, ele está fazendo a
conversões continuamente, e o tempo entre estas conversões é dado pelo circuito RC ligado aos pinos CLK R e CLK IN. Utilizando os valores de capacitor e resistor mostrados acima é obtido um tempo de conversão de aproximadamente 100μs.
Arranjo das chaves e botões
Como em nosso projeto simulamos sensores de localização de setor e sensor de porta (se fechada ou aberta), implementados um circuito em que estes sensores pudessem ser manipulados através de chaves, também através de chave podemos escolher o destino do elevador (setor 2 ou setor 3), a partir do setor 1.Introduzimos em nosso esquema um botão de liberação de acionamento dos motores. Cada
ponto
entre
resistor
e
chaves,
irão
ser
conectados
no
nosso
microcontrolador.Sendo BOTAO, PORTA, CHAO 1,CHAO 2, CHAO 3, SETOR 1, SETOR 2 , SETOR 3 concetados com os pinos P0.0, P0.1 P0.2, P0.3, P0.4, P0.5, P0.6 E P0.7, respectivamente, e a chave DESTINO ligada no pino P3.3.
LED´s Pelo fato de ser uma simulação, usamos LED´s ligados no microcontrolador, para tornar visível em qual posição o elevador esta e qual de seus motores esta ligado. A parte negativa dos LED´s estarão ligadas com o microcontrolador.Sendo os LED´s da primeira figura ligados nos pinos P1.1, P1.2, P1.3, P1.4 e P1.5, respectivamente da esquerda para direita.Para os motores, os LED´s SUBIR,DESCER, DIREITA e ESQUERDA serão ligados nas portas P3.0, P3.1, P3.4 e P3.5 respectivamente. Primeiramente temos em nossa figura 5 LED´s representando onde está o elevador.Se estiver no SETOR 1, significa que o elevador esta entre o chão e a parte aérea do setor 1, de mesma forma se repete para os LED´s do SETOR 2 e SETOR 3.Se estiver ligado o LED SETOR 12, significa que o elevador se encontra entre a parte aérea do setor 1 e a parte aérea do setor 2. Se estiver ligado o LED SETOR 1-3, significa que o elevador se encontra entre a parte aérea do setor 1 e a parte aérea do setor 3.
Microcontrolador:
O microcontrolador escolhido para a realização de projeto foi o AT89S52, fabricado pela Atmel. Este é um microcontrolador de 8bits com uma memória flash de 8K Bytes, memória RAM interna de 256 Bytes, possui 32 portas de entrada e saída entre outras características. O motivo principal, pelo qual este modelo de microcontrolador foi escolhido, é a “intimidade” que nós podemos obter com ele durante a realização das diversas aula práticas da disciplina.
Figura
Podemos observar entre os pinos XTAL1 e XTAL2 a conexão de um cristal de 11.0592MHZ e dois capacitores de 33pF que são responsáveis pela geração do clock para que o microcontrolador possa funcionar. Observa-se também a conexão de um circuito RC ao pinos RST do microcontrolador, este circuito é responsável pelo Power-on Reset, ou seja, sempre que o sistema é ligado o microcontrolador é resetado, isto acontece pois ao ligarmos o circuito o capacitor de 10uF que está descarregado faz com que o pino RST seja alimentado com 5V durante um determinado tempo, resetando o microcontrolador. Caso seja necessário fazer o reset com o circuito ligado, basta pressionar o um botão fazendo com que o capacitor seja descarregado.
CIRCUITO COMPLETO
Após detalhar completamente cada segmento do HARDWARE, iremos unir cada parte para formar nosso circuito final.Como esclarecido anteriormente iremos conectar cada pino dos circuitos integrados que temos, em nossos circuitos complementares que t emos.
SOFTWARE Para a segunda parte do relatório vamos inserir os códigos que foram gravados dentro do nosso microcontrolador 89S52.
;==================================================================== ; ENG 044775 ;==================================================================== ; ; PROJETO: Sistema de controle para elevador de cargas com ; movimento vertical e horizontal ; ;==================================================================== ;==================================================================== ; DEFINIÇÕES ;==================================================================== SENSORES
EQU
P0
MOTORES EQU UTILIZADA(BITS 0,1,4,5)
P3
; PARCIALMENTE
PESO CONVERSOR AD
EQU
P2
; RECEBE SÍDA DO
LEDS EQU ESTADO O ELEVADOR ESTÁ
P1
; MOSTRA EM QUE
PESO_MAX
EQU
1000$0000b
MASK_OFF
EQU
1111$1111b
DESTINO ELEVADOR ; 0 = SETOR 2 ; 1 = SETOR 3 MASK_DESTINO
EQU
P3.3
EQU
; ESCOLHE DESTINO DO
0000$1000b
;==================================================================== ; BOTÃO LIGA - PORTA ;==================================================================== LIGA MASK_LIGA
EQU EQU
SENSORES.0 0000$0001b
; BOTÃO DE LIGAR
S_PORTA MASK_PORTA
EQU EQU
SENSORES.1 0000$0010b
; SENSOR PORTA FECHADA
;==================================================================== ; SENSORES DE CHÃO DE CADA SETOR ;==================================================================== S_CHAO1
EQU
SENSORES.2
MASK_CHAO1
EQU
0000$0100b
S_CHAO2 MASK_CHAO2
EQU EQU
SENSORES.3 0000$1000b
S_CHAO3 MASK_CHAO3
EQU EQU
SENSORES.4 0001$0000b
;==================================================================== ; SENSORES DE ALTURA/POSIÇÃO DO SETOR ;==================================================================== S_SETOR1 MASK_SETOR1
EQU EQU
SENSORES.5 0010$0000b
S_SETOR2 MASK_SETOR2
EQU EQU
SENSORES.6 0100$0000b
S_SETOR3 MASK_SETOR3
EQU EQU
SENSORES.7 1000$0000b
;==================================================================== ; ATUADORES(MOTORES H/V) ;==================================================================== MOTOR_SOBE MASK_SOBE
EQU EQU
MOTORES.0 0000$0001b
; RXD DO PORT P3
MOTOR_DESCE MASK_DESCE
EQU EQU
MOTORES.1 0000$0010b
; TXD DO PORT P3
MOTOR_DIR MASK_DIR
EQU EQU
MOTORES.4 0001$0000b
; T0 DO PORT P3
MOTOR_ESQ MASK_ESQ
EQU EQU
MOTORES.5 0010$0000b
; T1 DO PORT P3
;==================================================================== ; INTERRUPÇÃO ;==================================================================== EMERGENCIA ORG LJMP
EQU
0003H
; INTERRUPÇÃO EXT0
EMERGENCIA ROTINA_EMERGENCIA
;==================================================================== ; RESET ;==================================================================== ORG LJMP
0000H INICIO
;==================================================================== ; PROGRAMA PRINCIPAL ;==================================================================== ORG 0100H
INICIO: SETB IT0 SETB EX0 SETB EA
; Configura para interrupcao na borda de descida ; Habilita interrupcao externa 0 ; Habilita Interrupcoes
SETOR_ID: SETOR ESTÁ O ELEVADOR MOV A,SENSORES CPL A ANL A,#MASK_CHAO1 JNZ SETOR_1 MOV CPL ANL JNZ
A,SENSORES A A,#MASK_CHAO2 SETOR_2
MOV CPL ANL JNZ
A,SENSORES A A,#MASK_CHAO3 SETOR_3
LCALL
FORA_SETOR
; IDENTIFICA EM QUE
AJMP SETOR_ID SETOR_1: SETOR 1 MOV ESTAVA
; ATIVIDADES NO R0,#01H
MOV CPL ANL JZ
A,SENSORES A A,#MASK_PORTA SETOR_1
LCALL
VERIF_PESO
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA SETOR_1
CLR
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
LEDS.1
LCALL
DEST_ELEV
AJMP
SETOR_ID
SETOR_2: MOV ESTAVA MOV CPL ANL JZ
R0,#02H A,SENSORES A A,#MASK_PORTA SETOR_2
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
LCALL
VERIF_PESO
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA SETOR_2
CLR
LEDS.2
LCALL
RET_SETOR_1
AJMP
SETOR_ID
SETOR_3: MOV ESTAVA
R0,#03H
MOV CPL ANL JZ
A,SENSORES A A,#MASK_PORTA SETOR_3
LCALL
VERIF_PESO
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA SETOR_3
CLR
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
LEDS.3
LCALL
RET_SETOR_1
AJMP
SETOR_ID
;==================================================================== ; VERIFICAÇÃO DO PESO ;==================================================================== VERIF_PESO: MOV CPL ANL JZ
A,PESO A A,#PESO_MAX IMPRIME_PESO
JMP IMPRIME_PESO: MOV
VERIF_PESO A,PESO
RET ;==================================================================== ; DESTINO ;==================================================================== DEST_ELEV:
LCALL MOV CPL ANL JZ
M_SOBE A,P3
LCALL JMP
M_ESQ
A A,#MASK_DESTINO VAI_SET_2 SAIR
VAI_SET_2: LCALL M_DIR SAIR: RET RET_SETOR_1: LCALL
M_SOBE
MOV CJNE
A,R0 A,#02H, VAI_DIR
VAI_ESQ: CLR
LEDS.5
MOV ESTAVA
R1,#04H
CLR MOV CPL ANL JZ
MOTOR_ESQ A,SENSORES A A,#MASK_SETOR1 VAI_ESQ
SETB
MOTOR_ESQ
MOV ESTAVA MOV ESTAVA SETB CLR
LEDS.5
LCALL
M_DESCE
JMP
SAIR1
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
R1,#00H
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
R0,#01H
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
LEDS.1
VAI_DIR: CLR
LEDS.4
MOV ESTAVA
R1,#08H
CLR MOV CPL
MOTOR_DIR A,SENSORES A
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
ANL JZ
A,#MASK_SETOR1 VAI_DIR
SETB
MOTOR_DIR
MOV ESTAVA MOV ESTAVA
R1,#00H
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
R0,#01H
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
SETB CLR
LEDS.4
LCALL
M_DESCE
LEDS.1
SAIR1: RET ;==================================================================== ; MOTORES ;==================================================================== M_SOBE: CLR MOV CPL ANL JNZ MOV CPL ANL JNZ MOV CPL ANL JZ STOP_S: SETB MOV
MOTOR_SOBE A,SENSORES A A,#MASK_SETOR1 STOP_S A,SENSORES A A,#MASK_SETOR2 STOP_S A,SENSORES A A,#MASK_SETOR3 M_SOBE MOTOR_SOBE LEDS,#MASK_OFF
RET M_DESCE: CLR MOV CPL ANL JNZ MOV CPL ANL JNZ MOV CPL ANL JZ STOP_D:
MOTOR_DESCE A,SENSORES A A,#MASK_CHAO1 STOP_D A,SENSORES A A,#MASK_CHAO2 STOP_D A,SENSORES A A,#MASK_CHAO3 M_DESCE
SETB MOV RET
MOTOR_DESCE LEDS,#MASK_OFF
M_DIR: ; VAI PARA SETOR 2 MOV R1,#08H ESTAVA CLR CLR MOV CPL ANL JZ
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
LEDS.5 MOTOR_DIR A,SENSORES A A,#MASK_SETOR2 M_DIR
SETB SETB CLR
MOTOR_DIR LEDS.5 LEDS.2
MOV ESTAVA MOV ESTAVA
R1,#00H
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
R0,#02H
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR
LCALL
M_DESCE
RET M_ESQ:
; VAI PARA SETOR 3
MOV
R1,#04H ; VALOR PARA IDENTIFICAR ONDE O ELEVADOR ESTAVA
CLR
LEDS.4
CLR MOV CPL ANL JZ
MOTOR_ESQ A,SENSORES A A,#MASK_SETOR3 M_ESQ
SETB SETB CLR
MOTOR_ESQ LEDS.4 LEDS.3
MOV MOV
R1,#00H R0,#03H
LCALL
; VALOR PARA IDENTIFICAR ONDE O ELEVADOR ESTAVA ; VALOR PARA IDENTIFICAR ONDE O ELEVADOR ESTAVA
M_DESCE
RET ;==================================================================== ; PROGRAMA DE INTERRUPÇÃO ;==================================================================== ROTINA_EMERGENCIA: ; salva contexto
PUSH PSW PUSH ACC ; executa subrotina MOV MOTORES,#MASK_OFF LCALL
FORA_SETOR
; restaura contexto POP ACC POP PSW AJMP INICIO RETI ;==================================================================== ; ELEVADOR FORA DO SETOR ;==================================================================== FORA_SETOR: MOV ADD MOV MOV SUBB JZ
A,R0 A,R1 R2, A A,#01H
A,R2 ; VERIFICA SE ESTA NO SETOR 1 DESCER1
A,#02H
A,R2 ; VERIFICA SE ESTA NO SETOR 2 SUBIR2
A,#03H
A,R2 ; VERIFICA SE ESTA NO SETOR 3 SUBIR3
A,#05H
A,R2 ; INDO DO 1 PARA O 3 EXEC13
MOV SUBB JZ
A,#06H
A,R2 ; INDO DO 2 PARA O 1 EXEC21
MOV SUBB JZ
A,#09H
A,R2 ; INDO DO 1 PARA O 2 EXEC12
MOV SUBB JZ
A,#0BH
A,R2 ; INDO DO 3 PARA O 1 EXEC31
AJMP
FORA_SETOR
MOV SUBB JZ MOV SUBB JZ MOV SUBB JZ
DESCER1: CLR MOV CPL
LEDS.1 A,SENSORES A
; ESPERA BOTÃO DE LIGAR PARA CONTINUAR
ANL JZ
A,#MASK_LIGA DESCER1
LCALL M_DESCE AJMP SAIR_FS SUBIR2: CLR
LEDS.2
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA SUBIR2
; ESPERA BOTÃO DE LIGAR PARA CONTINUAR
LCALL RET_SETOR_1 AJMP SAIR_FS SUBIR3: CLR
LEDS.3
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA SUBIR3
; ESPERA BOTÃO DE LIGAR PARA CONTINUAR
LCALL RET_SETOR_1 AJMP SAIR_FS EXEC13: CLR
LEDS.4
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA EXEC13
; ESPERA BOTÃO DE LIGAR PARA CONTINUAR
LCALL VAI_DIR AJMP SAIR_FS EXEC21: CLR
LEDS.5
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA EXEC21
; ESPERA BOTÃO DE LIGAR PARA CONTINUAR
LCALL VAI_ESQ AJMP SAIR_FS EXEC12: CLR
LEDS.5
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA EXEC12
LCALL
VAI_ESQ
·
; ESPERA BOTÃO DE LIGAR PARA CONTINUAR
AJMP SAIR_FS EXEC31: CLR
LEDS.4
MOV CPL ANL JZ
A,SENSORES A A,#MASK_LIGA EXEC31
LCALL AJMP
VAI_DIR SAIR_FS
·
; ESPERA BOTÃO DE LIGAR PARA CONTINUAR
SAIR_FS: RET END
Conclusão: Nosso projeto obteve resultados satisfatórios. Conseguimos obter o resultado prático que foi proposto e simulado na ferramenta Keil. O microcontrolador 89S52 se mostrou um dispositivo bastante versátil e de fácil utilização. A programação em assembler nos fez entender como o hardware manipula os dados internamente e como isso é apresentado externamente em seus ports. A montagem física do dispositivo nos esclareceu alguns detalhes de funcionamento dos ports, bem como as ligações que devem ser feitas para que o dispositivo funcione
corretamente no modo de operação desejado (leitura/escrita, por exemplo). Na finalização do projeto identificamos algumas melhorias que poderiam ser feitas. Algumas sugestões futuras de melhorias, por exemplo: - Implementação de um dispositivo de armazenamento das informações do estado em que o elevador se encontra no caso de uma queda de energia no sistema. - Colocação de um display para informações de peso e identificação do setor. No nosso projeto optamos pelo não uso do display, mas tínhamos as c ondições de ter feito isso. - Implementação de uma lógica que pudesse fazer com que mais setores fossem inseridos no sistema e que eles pudessem trocar cargas diretamente e ntre si.
Placa principal: