Escolar Documentos
Profissional Documentos
Cultura Documentos
COORDENAÇÃO DE ELETRÔNICA
CURSO DE ENGENHARIA ELÉTRICA
CRISTIANO PIVA
LEANDRO DE MARCHI PINTOS
MARCIO DE ANDRADE VOGT
PATO BRANCO
2010
CRISTIANO PIVA
LEANDRO DE MARCHI PINTOS
MÁRCIO DE ANDRADE VOGT
PATO BRANCO
2010
1
RESUMO
This work presents the development and design of control logic of an elevator using a
microcontroller MC9S08AW60 family HCS08A of the U.S. company Freescale ®. All the
proposed logic for the elevator is initially presented in flowchart from some operation
criterion. The logic of operation is designed from previous knowledge of mode of operation a
commercial elevator, so that the developed project is plausible that real situations of
implementation of control systems for an elevator.
2
SUMÁRIO
INTRODUÇÃO........................................................................................................................4
DESCRIÇÃO DO PROBLEMA............................................................................................4
MATERIAIS UTILIZADOS..................................................................................................5
Microcontrolador MC9S08AW60..............................................................................5
LED...............................................................................................................................6
Display de 7 Segmentos...............................................................................................6
DESENVOLVIMENTO..........................................................................................................7
Descrição do sistema....................................................................................................7
Definição dos critérios de lógica.................................................................................7
Interface com o usuário.............................................................................................10
LED’s de indicação de andar....................................................................................11
Display de 7 segmentos..............................................................................................12
Botões de Comando...................................................................................................12
Código implementado no Microcontrolador...........................................................15
CONCLUSÃO........................................................................................................................24
REFERÊNCIAS.....................................................................................................................24
3
INTRODUÇÃO
DESCRIÇÃO DO PROBLEMA
Neste trabalho é proposta uma lógica de controle similar às dos sistemas comerciais
com um único elevador para transporte de passageiros. O projeto desenvolvido visa
implementar a lógica de controle de um elevador para um edifício com 5 andares e cuja
interface com o usuário é feita através de botões internos á cabine e botões de chamada em
4
cada um dos andares, além de displays de sete segmentos, que indicam a posição atual do
elevador, e LED’s que indicam o sentido de movimento do elevador, o esquema proposto esta
mostrado na Figura 1.
A implementação dos algoritmos desenvolvidos é feita em um microcontrolador da
família HCS08 modelo MC9S08AW60 fornecido pela Freescale®.
PISO 5
PISO 4
PISO 3
PISO 2
TÉRREO
MATERIAIS UTILIZADOS
Microcontrolador MC9S08AW60
A placa de desenvolvimento utilizada possui o microcontrolador MC9S08AW60 que
possui a característica de ser um microcontrolador de baixo custo e alta performance da
família HCS08. Este microcontrolador possui uma unidade central de processamento de 8
bits, com clock interno da CPU de 40 MHz e clock de barramento de até 20 MHz.
5
A fonte de clock pode ser interna ou externa. No caso da placa de desenvolvimento
empregada o clock é gerado por um cristal externo a uma frequência de 4 MHz e multiplicado
internamente ao microcontrolador de modo a fornecer um clock de barramento de 20 MHz.
O modelo de microcontrolador utilizado possui encapsulamento do tipo LPFQ com 64
pinos, destes sendo 54 pinos de I/O de uso geral. Características como slew-rate, pull-up
enable e opção de alta ou baixa capacidade de corrente dos pinos de I/O podem ser
configuradas diretamente via software.
O microcontrolador inclui ainda periféricos como: Conversor A/D de 16 canais com
10 bits de resolução, duas interfaces de comunicação serial, um módulo de controle para
periférico serial, contadores/módulos PWM de 16 bits e módulo de interrupções de teclado de
8 bits.
LED
O LED, do acrônimo em inglês para Light Emmiting Diode ou diodo emissor de luz, é
um tipo de diodo que quando excitado responde a excitação emitindo luz dentro do espectro
da luz visível. Para que o LED emita luz é necessário que este esteja em condução, ou seja,
assim como em um diodo convencional, o LED deve ser polarizado diretamente para estar em
um estado Ligado.
São utilizados neste projeto um total de oito LED’s, dois para sinalizar os estados de
descida ou subida do elevador, sendo um na cor vermelha e outro na cor amarela, e os seis
outros LED’s são usados para indicar o andar atual de cada elevador. Estes LED’s são
acionados pelo microcontrolador, a partir dos pinos de I/O, e segundo a lógica de
funcionamento do controle do elevador.
6
A codificaçãoo para exibição de valores alfanuméricos no display de sete segmentos é
feita então considerando quais segmentos devem estar ligados, de modo a formar o digito
desejado. Um código deste tipo pode ser feito a partir de uma tabela contendo cada um dos
segmentos (a,
a, b, c, d, e, f, g) e o estado dos LED’s (ligado ou desligado)
igado) que formam um
dígito
gito correspondente. Uma tabela pra este tipo de codificação é apresentada no
desenvolvimento deste trabalho.
DESENVOLVIMENTO
Descrição do sistema
A descrição
crição do sistema se baseia na realização do controle da lógica de um elevador
de um edifício de 5 andares mais o térreo. Em cada piso existe um botão de chamada de
andar, em um total de 6 push-bottons
push externos. Dentro da cabine do elevador existem
existe seis
push-bottons internos de solicitação de andar.
Um
m display de sete segmentos é utilizado para indicação da localização atual de
andar do elevador, dois led’s utilizados para indicação do sentido de movimentação do
elevador, um de coloração vermelha indicando uma subida e um de coloração amarela para
indicação de descida, e seis led’s de cor verde para indicação da posição atual de andar do
elevador.
7
Definição dos critérios de lógica
O elevador atende á todas as chamadas válidas na direção em que está indo e
somente quando tiver atendido a todas pode mudar de direção, ou seja:
• A posição inicial do sistema é o elevador parado no Térreo;
• Se não houverem pedidos, o elevador fica parado. Se em seguida, for feito um pedido
para algum andar diferente daquele que ele estava parado, ele atenderá ao pedido;
• Quando não houver nenhuma chamada e diversas chamadas forem feitas ao mesmo
tempo, dar preferência à ordem de armazenamento de chamadas;
• A partir da posição que o elevador se encontre parado ele irá sempre dar privilégio a
chamadas internas à cabine, após atendidas as chamadas internas irá ser feita a
verificação das chamadas externas;
• Se o elevador estiver subindo ele irá até a chamada de ordem mais alta respeitando a
ordem de proximidade das chamadas internas com o andar que ele se encontra, sendo
que no percurso de subida não atenderá chamadas externas, irá até o andar mais alto
solicitado;
• Se o elevador estiver descendo respeitará a ordem de chamadas internas parando por
ordem de chamada mais próxima ao andar onde ele se encontra. No percurso de
descida o elevador atenderá chamadas externas que estiverem no seu caminho,
atendendo a elas em paralelo com a internas seguindo a ordem de proximidade;
• Se o elevador estiver subindo para um andar mais superior e for feito o pedido em um
andar mais inferior, o elevador subirá até o andar mais superior e depois atenderá ao
pedido do andar inferior;
• Se não existir chamada (quando o elevador não for solicitado), não haverá saída. Ou
seja, o elevador permanece parado.
8
Figura 3 – Fluxograma de verificação.
9
Figura 4 – Fluxograma de Ação.
11
Display de sete segmentos
Como citado anteriormente, para que o display de sete segmentos funcione
corretamente é necessário que se estabeleça um código no qual cada dígito é representado por
uma sequência de acionamentos/desacionamentos de cada um dos segmentos do display. Um
display de sete segmentos é composto por 7 pinos referentes a cada um dos segmentos e mais
um pino que configura a acendimento ou não do ponto decimal. Como neste projeto não é
necessária a utilização do ponto, a codificação pode ser feita utilizando apenas 7 bits,
considerando que o segmento referente ao ponto fique sempre apagado. Assim, para um
display na configuração anodo comum pode-se construir a seguinte tabela. A porta do
microcontrolador utilizada para o display de sete segmentos foi a Porta A.
Botões de Comando
Para a realização da interface com usuário, utilizou-se um teclado matricial de quatro
linhas por quatro colunas permitindo a geração de 16 códigos independentes utilizando apenas
oito pinos da porta do microcontrolador. No entanto, serão utilizados apenas 12 chaves (push-
bottons) em razão desse ser o número de possibilidades do projeto proposto. Dessa forma, a
última coluna das chaves SW4, SW8, SW12 e SW16 é desconsiderada.
12
Para a realização do interfaceamento com o microcontrolador, as colunas do teclado
matricial são conectadas como pinos configurados como saídas e as linhas do teclado são
conectadas a pinos configurados como entradas. Nos pinos configurados como entradas são
utilizadas resistores de pull-up. Esses resistores de pull-up são implementados internamente
ao microcontrolador. A função desse resistor é forçar um nível lógico alto no pino do
microcontrolador configurado como entrada. Caso esse resistor não seja utilizado, a entrada
do microcontrolador ficará sujeita a ruídos.
Para que se possa conectar uma chave a um pino do microcontrolador, deve-se
configurar esse pino como entrada.
Devido às chaves mecânicas possuírem micro ranhuras geradas em seu processo de
fabricação, serão gerados ruídos causados pela vibração das micro ranhuras quando essas
forem fechadas que poderão ser detectadas pelo software desenvolvido como múltiplos
cliques durante o processo de leitura. Estas vibrações que causam ruídos, também conhecidas
por contact bounce, devem ser eliminadas por hardware (capacitor, flip-flop tipo D) ou por
software, através da inserção de um atraso da leitura da chave fechada, que é o caso deste
trabalho. Esse conjunto de instruções é descrito no detalhamento da interrupção de teclado
descrita na figura 6.
Os pinos utilizados como saídas serão utilizados para realizar a varredura do teclado
matricial. Esta varredura tem como tarefa identificar quando uma chave do teclado foi
pressionada. A varredura irá alternar os valores lógicos nos pinos configurados como saídas.
13
Estes pinos sempre estarão configurados para que somente um deles contenha nível lógico
zero em um determinado momento. Desta forma, quando uma chave for pressionada, será
gerador um código determinado onde somente dois pinos da porta utilizada como teclado
estarão em nível lógico zero (um pino de saída e um pino de entrada).
A tabela abaixo apresenta a codificação de identificação de chaves em uma interface
com um teclado matricial. As portas G (configura como entrada de teclado) e D (configurada
como saída para teclado) do microcontrolador são utilizadas para realizar a multiplexação
necessária para realizar a interface com o teclado.
Caso nenhuma chave for pressionada, o nível lógico dos pinos configurados como
entrada (linhas) será um, devido ao resistor de pull-up utilizado. Este pull-up será interno ao
microcontrolador.
A partir da tabela apresentada, definem-se dois vetores de constantes: o vetor
contendo os valores da varredura e o vetor que irá conter os valores relativos aos códigos de
cada tecla. O processo de varredura é inserido na interrupção do estouro de tempo do
temporizador da forma indicada no código descrito na sequência do trabalho.
O módulo de tempo é configurado para o valor (entre 20us e 50ms) de acordo com a
sensibilidade desejada para o teclado.
Se uma tecla for pressionada e a varredura estiver posicionada com nível lógico 0 na
coluna desta chave, irá ocorrer uma interrupção de teclado devido a borda de descida no pino
de entrada conectado a chave. Dentro desta interrupção podem-se tomar medidas para análise
de qual chave foi pressionada.
O código descrito abaixo foi implementado no microcontrolador descrito no decorrer
deste trabalho com o objetivo de realizar o controle do elevador proposto empregando as
condições lógicas pré-definidas.
14
////////////////////////////////////////////////////////////////////////////////////////
// PROJETO ELEVADOR
//---------------------------MAIN--------------------------------------------------------------------------------------------------
void main(void) {
for(;;) {
// Loop Infinito
15
switch(ST){ // MÁQUINA DE ESTADOS PRINCIPAL
case 0: // INICIALIZAÇÕES
ini_pta();
ini_leds();
ini_teclado();
ini_display();
ini_ptb();
PISO_ATUAL = 0;
ST=1;
break;
case 1:
// VERIFICA SE HÁ CHAMADA INTERNA/EXTERNA
cmax=maior_chamada();
cmin=menor_chamada();
if( (cmax-PISO_ATUAL) >= 1 ){
SUBINDO=1;
tempo(2);
PISO_ATUAL=PISO_ATUAL+1;
escreve_display(PISO_ATUAL);
ST=2;
case 2: // VERIFICA SE É UM PISO SOLICITADO. SE FOR, LIMPA SOLICITAÇÃO E VAI PARA ST5
if(SUBINDO==1){
if(CH_INT[PISO_ATUAL]==1){
CH_INT[PISO_ATUAL]=0; // Limpar solicitação
apaga_led(PISO_ATUAL);
}
}
if(DESCENDO==1){
if( (CH_INT[PISO_ATUAL]==1)||(CH_EXT[PISO_ATUAL]==1) ){
CH_INT[PISO_ATUAL]=0; // Limpar solicitação
CH_EXT[PISO_ATUAL]=0;
apaga_led(PISO_ATUAL);
}
}
ST=3;
break;
16
// ---------------------------------------- ST5 -----------------------------------------------------------------------------------
case 3:
if(SUBINDO==1) ST=4;
else if(DESCENDO==1) ST=5;
else ST=1;
// ---------------------------------------- ST6 -----------------------------------------------------------------------------------
break;
case 4: // SE SUBINDO
if(PISO_ATUAL==cmax){
CH_INT[PISO_ATUAL]=0; // Limpar solicitação
CH_EXT[PISO_ATUAL]=0;
SUBINDO=0;
ST=1;
apaga_led(PISO_ATUAL);
} else {
tempo(2);
PISO_ATUAL=PISO_ATUAL+1;
ST=2;
}
escreve_display(PISO_ATUAL);
break;
case 5: // SE DESCENDO
if(PISO_ATUAL==cmin){
CH_INT[PISO_ATUAL]=0; // Limpar solicitação
CH_EXT[PISO_ATUAL]=0;
apaga_led(PISO_ATUAL);
DESCENDO=0;
ST=1;
} else {
tempo(2);
PISO_ATUAL=PISO_ATUAL-1;
ST=2;
}
escreve_display(PISO_ATUAL);
break;
}// Fim do switch principal
//-------------------------------------------------------------------------------------------------------------------------------------
17
// CODIFICAÇÃO TECLADO
//
// PTDD2 PTDD3 PTDD7
// PTGD0 (INT_P0) (INT_P4) (EXT_P2)
// PTGD1 (INT_P1) (INT_P5) (EXT_P3)
// PTGD2 (INT_P2) (EXT_P0) (EXT_P4)
// PTGD3 (INT_P3) (EXT_P1) (EXT_P5)
//-----------------------------INTERUPÇÕES------------------------------------------------------------------------------------
TPM1SC_TOF=0;
switch(sw_ptd){
case 0:
PTDD_PTDD2 = 0;
PTDD_PTDD3 = 1;
PTDD_PTDD7 = 1;
switch(PTGD){
case 0x1E:
tecla = 1; break;
case 0x1D:
tecla = 2; break;
case 0x1B:
tecla = 3; break;
case 0x17:
tecla = 4; break;
case 0x0F:
tecla = 5; break;
}
break;
case 1:
PTDD_PTDD2 = 1;
PTDD_PTDD3 = 0;
PTDD_PTDD7 = 1;
switch(PTGD){
case 0x1E:
tecla = 6; break;
case 0x1D:
tecla = 7; break;
case 0x1B:
tecla = 8; break;
case 0x17:
tecla = 9; break;
case 0x0F:
tecla = 10; break;
}
break;
case 2:
PTDD_PTDD2 = 1;
PTDD_PTDD3 = 1;
PTDD_PTDD7 = 0;
18
switch(PTGD){
case 0x1E:
tecla = 11; break;
case 0x1D:
tecla = 12; break;
}
break;
if(tcl_count >= 5){ // A tecla deve manter-se pressionada por 15ms e ter o mesmo valor durante este tempo
case 10:
/* TESTE */ led(3);
19
CH_EXT[3] = 1; break;
case 11:
/* TESTE */ led(4);
CH_EXT[4] = 1; break;
case 12:
/* TESTE */ led(5);
CH_EXT[5] = 1; break;
}
tcl_count = 0;
}
}
if(DisparoT1s == 1){
//--------------------------------FUNÇÕES----------------------------------------------------------------------------------------
switch(val_led){
case 0: PTBD_PTBD0 = 1;break;
case 1: PTBD_PTBD1 = 1;break;
case 2: PTBD_PTBD2 = 1;break;
case 3: PTBD_PTBD3 = 1;break;
case 4: PTBD_PTBD4 = 1;break;
case 5: PTBD_PTBD5 = 1;break;
case 6: PTBD_PTBD5 = 1;break; // Subindo
case 7: PTBD_PTBD5 = 1;break; // Descendo
}
}
switch(val_led){
case 0: PTBD_PTBD0 = 0;break;
case 1: PTBD_PTBD1 = 0;break;
case 2: PTBD_PTBD2 = 0;break;
case 3: PTBD_PTBD3 = 0;break;
case 4: PTBD_PTBD4 = 0;break;
case 5: PTBD_PTBD5 = 0;break;
case 6: PTBD_PTBD5 = 0;break; // Subindo
case 7: PTBD_PTBD5 = 0;break; // Descendo
20
}
}
//-----------------------------INICIALIZAÇÕES--------------------------------------------------------------------------------
void ini_cpu(void){
/* SOPT: COPE=0,COPT=1,STOPE=0,??=1,??=0,??=0,??=1,??=1 */
SOPT = 0x53;
/* SPMSC1: LVDF=0,LVDACK=0,LVDIE=0,LVDRE=1,LVDSE=1,LVDE=1,??=0,BGBE=0 */
SPMSC1 = 0x1C;
21
/* SPMSC2: LVWF=0,LVWACK=0,LVDV=0,LVWV=0,PPDF=0,PPDACK=0,??=0,PPDC=0 */
SPMSC2 = 0x00;
void timer1_ini(void) {
TPM1CNT = 0x00;
TPM1MOD = 625; // Timer configurado para 1ms
TPM1SC = 0x4D; // DIV = 32
}
void ini_pta(void){
PTADD = 0xFF;
PTADS = 0xFF;
PTAPE = 0x00;
PTASE = 0x00;
PTAD = ZERO;
void ini_ptb(void){
PTBDD = 0xFF;
PTBDS = 0xFF;
PTBPE = 0x00;
PTBSE = 0x00;
PTBD = 0x00;;
}
void ini_leds(void){
22
// PORTA G configurada como entrada de teclado
// Inicia a latch da porta G com todos os bits em zero
PTGD = 0;
// Todos os pinos da porta G como entradas
PTGDD = 0;
// Pinos do módulo de teclado da porta G configurados para pull-up
PTGPE = 0x1F;
23
CONCLUSÃO
REFERÊNCIAS
24