Escola de Engenharia Elétrica, Mecânica e de Computação
Universidade Federal de Goiás
Laboratório de Microprocessadores e
Microcontroladores
Experimento 5:
Motor de Corrente Contínua
e Display LCD
Alunos:
Matrícula:
Prof. Dr. José Wilson Lima Nerys
Goiânia, 2º semestre de 2014
Laboratório de Microprocessadores e Microcontroladores
2
SUMÁRIO
1
Motor de Corrente Contínua.................................................................................................. 3
1.1
Conceitos Básicos........................................................................................................... 3
1.2
Variação de Velocidade ................................................................................................ 4
1.3
Medição Digital de Velocidade ..................................................................................... 5
2
Display LCD ........................................................................................................................... 7
3
Atividades do Experimento 5 ................................................................................................. 8
3.1
Contagem Crescente no Display LCD ......................................................................... 8
3.2
Contagem Decrescente no Display LCD ................................................................... 10
3.3
Acionamento de Motor de Corrente Contínua ......................................................... 11
3.4
Controle de Velocidade de um Motor CC ................................................................. 11
3.5
Mostra Velocidade do Motor CC no Display LCD .................................................. 13
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
3
Laboratório de Microprocessadores e Microcontroladores
1
Motor de Corrente Contínua
1.1 Conceitos Básicos
A Fig. 1 mostra o circuito básico de um motor CC, onde os enrolamentos de campo e de
armadura são alimentados de forma independente. As expressões básicas também são dadas.
Ra
E  k    a
Rf
I
a
Va
Va  Ra I a  E
If
E
Vf
a 
Va  Ra I a
k 
Fig. 1: Motor de Corrente Contínua
O motor de corrente contínua consiste de um enrolamento de campo estacionário e um
enrolamento de armadura rotativo. O enrolamento de campo pode ser acionado por corrente contínua, ou
ainda consistir de um estator de ímã permanente, não sendo necessário alimentação. A armadura é
acionada com corrente contínua através de escovas e um anel comutador.
A Fig. 2 mostra uma circuito para acionamento do motor de corrente em um único sentido de
rotação. Um pulso alto na base do transistor BC548 leva o transistor BD139 à saturação, o que aciona o
motor. Um pulso baixo leva esse transistor ao corte, quando então a corrente do motor decresce
circulando pelo diodo 1N4001.
12 V
1N4001
BC548
P1.1
10
k
BD139
Fig. 2: Driver para acionamento do motor CC num único sentido
A Fig. 3 mostra uma configuração denominada de Ponte H, que permite o acionamento em ambos
os sentidos de rotação. As chaves A, B, C e D são normalmente transistores do tipo MOSFET ou IGBT.
Para o acionamento em um dos sentidos as chaves A e B são acionadas; para o acionamento no sentido
contrário as chaves C e D são acionadas. A lógica de acionamento dessas chaves não deve permitir o
acionamento simultâneo das chaves A e D e das chaves C e B, o que resultaria num curto-circuito da
fonte de alimentação. O driver de acionamento em ponte H usado no laboratório (L298N – Diagrama na
Fig. 4) permite o acionamento de um motor com corrente de até 1,5 A através de dois pinos de comando e
segue a lógica da Tabela 1.
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
4
Laboratório de Microprocessadores e Microcontroladores
A
D
A
C
B
C
D
B
Fig.3: Driver para acionamento do motor CC em ambos os sentidos
É importante observar que os diodos são fundamentais para o retorno da corrente, quando
qualquer uma das chaves é desligada. No momento de desligamento das chaves, há energia armazenada
nas indutâncias do motor; sem os diodos as chaves poderiam ser danificadas por sobretensão.
Tabela 1: Pinos de controle da ponte H
In 1 In 2
Efeito
0
0
Motor parado
0
1
Gira no sentido direto
1
0
Gira no sentido reverso
1
1
Motor parado
Figura 4: Diagrama de blocos parcial do L298N
1.2 Variação de Velocidade
Uma forma de variar a velocidade do motor CC é variando a tensão de armadura. Uma forma de
variar a tensão de armadura é usar modulação PWM, que consiste na definição de um período de
acionamento fixo e, dentro desse período, estabelecer um período ligado e outro desligado. A Fig. 5
ilustra esse processo. O motor usado é de 12 V e, portanto, a tensão de alimentação deve variar de zero a
12 V para obter-se variação de velocidade de zero até o valor máximo. Isso é feito chaveando-se um
transistor a uma frequência alta, por exemplo, 5 kHz, que corresponde a um período de 0,2 ms ou 200 s.
T
Vmax
Vmax
Va 
TON
V
Vmax a
T
TON
TOFF
Fig. 5: Geração do sinal PWM para controle do motor de contrente contínua
Pode-se preferir definir o período como 255 s, por exemplo, o que corresponde a uma
frequência de chaveamento de 3,92 kHz. A variação de velocidade pode então ser obtida variando-se o
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
Laboratório de Microprocessadores e Microcontroladores
5
período ligado (TON) de 0 a 255 s, ao mesmo tempo em que o período desligado (TOFF) deve variar de
255 s a 0, para manter constante o período total (T). Essa contagem do período ligado e desligado pode
ser feita através do temporizador do 8051.
O microcontrolador 8051 possui dois temporizadores/contadores, que podem operar em 4 modos
diferentes: modo de 13 bits (modo 0), modo de 16 bits (modo 1), modo de 8 bits com recarga automática
(modo 2) e 2 modos independentes de 8 bits (modo 3). O modo de recarga automática (modo 2) pode ser
usado para gerar o sinal PWM para o controle do motor CC. Nesse modo a contagem é feita através de
TL (a primeira contagem começa no valor inicial de TL) e o valor de TH é usado para definir o início da
próxima contagem. Se o temporizador começa sempre no valor dado em TL e vai até FFh (255), e sendo
TON = T – TOFF, e sendo ainda escolhido T = 255, o procedimento usado no programa é:
1. Para o período ligado faz-se TL = TOFF; dessa forma, o temporizador conta de TOFF até 255, o que
corresponde ao período ligado;
2. Para o período desligado faz-se TL = TON; dessa forma, o temporizador conta de TON até 255, o que
corresponde ao período desligado.
3. No início do programa desliga-se o motor (CLR P2.0 e CLR P2.1) e faz-se TL = TON = 09H, o que
faz com que o temporizador, na primeira contagem já conte o período desligado, que começa em T ON
e vai até 255.
4. Após fazer TL = TON, encontra-se o complementar de TON (CPL A), ou seja, TOFF, e carrega-se em
TH. Dessa forma, a próxima contagem começará em TOFF, o que significa que o temporizador
contará o período ligado.
5. Cada vez que a subrotina de controle é executada define-se o próximo valor de recarga, TH.
6. Para aumentar a velocidade aumenta-se o período ligado TON. Para diminuir aumenta-se TOFF.
1.3 Medição Digital de Velocidade
Estão disponíveis no laboratório dois tipos de fotosensores: um com nível lógico normalmente
alto e outro com nível lógico normalmente baixo. Os dois modelos são mostrados na Fig. 6. O primeiro
tipo foi montado com um circuito auxiliar modulador que diminui a influência da luz ambiente sobre o
fotosensor. Esse circuito emite uma luz de cerca de 1 kHz, que ao ser refletida satura o fototransistor. É
utilizado o decodificador de frequência NE567. O segundo modelo não usa circuito modulador.
(a)
(b)
Fig. 6: Sensor de presença com circuito auxiliar modulador e sem circuito modulador
A diferença básica entre os sensores usados, além do circuito de modulação, está no
encapsulamento. Em um deles (Fig. 6a) o encapsulamento faz com que o fototransistor fique
normalmente cortado (sem presença de luz); ele entra em saturação quando a luz do LED é refletida em
um obstáculo. Assim, o sinal de saída Vo passa de nível lógico alto para baixo, na presença de um
obstáculo.
No outro tipo de encapsulamento (Fig. 7b) a luz do LED incide diretamente sobre o fototransistor,
fazendo com que ele fique normalmente saturado, ou seja, o sinal de saída Vo fica inicialmente em nível
lógico baixo; na presença de um obstáculo entre os dois componentes o fototransistor é levado ao corte
e o sinal de saída vai para o nível lógico alto.
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
6
Laboratório de Microprocessadores e Microcontroladores
(a)
(b)
Fig, 7: (a) fototransistor normalmente cortado e (b) fototransistor normalmente saturado
Pode-se fazer uso do fotosensor da Fig. 7(b) para medir a velocidade de um motor de forma
digital, associando-se ao fotosensor uma roda com 60 furos (Fig. 8). O sinal resultante do fotosensor,
com a rotação da roda de 60 furos, é uma onda quadrada (Fig. 9). Esse sinal pode ser conectado a um
dos dois pinos de interrupção. A interrupção deve ser configurada para atuar por transição (na passagem
de nível lógico 1 para 0). A cada interrupção o registrador com o número atualizado de pulsos é
incrementado em 1.
Fig. 8: conjunto fotosensor/roda de 60 furos
.
Fig. 9: Sinal de saída do sensor de velocidade
A medição de velocidade é feita estabelecendo-se um tempo de amostragem, ou seja, um tempo
fixo em que o registro de pulsos é lido. Mostra-se a seguir que o fato de ter 60 furos na roda faz com que
o número de pulsos registrados por segundo (frequência) seja correspondente à velocidade em rotações
por minuto (rpm).
1 rotação/segundo  60 furos/segundo
 60 rpm  60 furos/s  X rpm  X furos/s
1 rotação/segundo  60 rotações/minuto
ω (rpm) ≡ f (Hz)
Um tempo de amostragem menor que 1 segundo pode ser adotado, e é aconselhável em muitas
aplicações. Sendo assim, deve-se fazer a devida transformação de número de furos lidos no tempo de
amostragem para rotações por minuto.
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
7
Laboratório de Microprocessadores e Microcontroladores
2
Display LCD
Na explicação desta seção é usado um display LCD de 2 linhas x 16 colunas, cujo esquemático é
mostrado na Fig. 10. Essa informação é enviada na forma de comando para o LCD, numa rotina de
inicialização necessária a cada vez que o LCD vai ser usado. Outras informações necessárias são: se o
cursor vai ficar piscando, se a mensagem vai rolar para a esquerda ou para a direita, ou não vai rolar, se
serão usados 4 ou 8 bits para os dados etc. A Tabela 2 mostra os sinais de controle para escrita e leitura do
LCD. A Tabela 3 mostra as instruções mais comuns utilizadas no uso do LCD.
Fig. 7: Display LCD de 2 linhas por 16 colunas
E
0
1
1
1
1
Tabela 2: Habilitação do display LCD
RW
RS
Operação
×
×
Display desabilitado
0
0
Escrita de Instrução no LCD
0
1
Escrita de Dados no LCD
1
0
Leitura de Instrução do LCD
1
1
Leitura de Dados do LCD
Tabela 3: instruções mais comuns utilizadas para o display LCD
DESCRIÇÃO
MODO
RS
R/W
Display
Liga (sem cursor)
0
0
Desliga
0
0
Limpa Display com Home cursor
0
0
Controle do Cursor
Liga
0
0
Desliga
0
0
Desloca para Esquerda
0
0
Desloca para Direita
0
0
Cursor Home
0
0
Cursor Piscante
0
0
Cursor com Alternância
0
0
Sentido de deslocamento do cursor ao Para a esquerda
0
0
entrar com caractere
Para a direita
0
0
Deslocamento da mensagem ao entrar Para a esquerda
0
0
com caractere
Para a direita
0
0
Deslocamento da mensagem sem Para a esquerda
0
0
entrada de caractere
Para a direita
0
0
Endereço da primeira posição
Primeira linha
0
0
Segunda linha
0
0
Código (Hexa)
0C
0A/08
01
0E
0C
10
14
02
0D
0F
04
06
07
05
18
1C
80
C0
A Tabela 4 mostra o endereço em decimal de cada posição do LCD de 16 colunas x 2 linhas.
Colunas
Linha 1
Linha 2
Tabela 4: Endereços em decimal do display LCD
1
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
Laboratório de Microprocessadores e Microcontroladores
3
8
Atividades do Experimento 5
Os programas das tarefas a seguir devem ser digitados e compilados no simulador PEQui ou
MCU8051 e executados no simulador do kit didático e no kit didático real do microcontrolador 8051.
3.1 Contagem Crescente no Display LCD
O programa a seguir mostra no display LCD uma contagem decimal crescente de 0000 a 9999.
O byte superior da contagem é guardado em R1 e o byte inferior em R0.
Tabela 5: Contagem no display LCD
Rótulo
Mnemônico
RS EQU P3.5
RW EQU P3.6
EN EQU P3.7
DADOS EQU P0
Comentário sobre o Efeito da Operação
; RS = 0  INSTRUÇÃO. RS = 1  DADO
; RW =0  ESCRITA. RW = 1  LEITURA
; PINO DE HABILITAÇÃO DO LCD
; Porta P0 é o canal de dados
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV SP,#2FH
MOV R0,#00
MOV R1,#00
MOV R7,#0FFH
LCALL INICIA
LCALL LIMPA
LCALL LINHA1
LCALL LINHA2
REPETE: LCALL CONTAGEM
LCALL DISPLAY
LCALL ATRASO
LCALL ATRASO
LCALL ATRASO
SJMP REPETE
; Apontador de pilha SP = 2FH
; Byte inferior da contagem
; Byte superior da contagem
; Contador
; Chama subrotina de inicialização do LCD
; Chama subrotina que limpa LCD
; Chama subrotina que mostra mensagem na linha 1
; Chama subrotina que mostra mensagem na linha 2
; Chama subrotina de contagem decimal contagem de 0000 a 9999
; Chama subrotina que mostra a contagem no display
; Volta para o início
; SUBROTINA DE INICIALIZAÇÃO DO DISPLAY LCD
INICIA: MOV A,#38H
; Instrução que indica display de 16 colunas e 2 linhas
LCALL INSTR_WR
; Chama subrotina para escrever instrução no LCD
MOV A,#38H
LCALL INSTR_WR
; Instrução que indica display de 16 colunas e 2 linhas
; Chama subrotina para escrever instrução no LCD
MOV A,#0EH
LCALL INSTR_WR
; Instrução para ligar o cursor
; Chama subrotina para escrever instrução no LCD
MOV A,#06H
LCALL INSTR_WR
RET
; Instrução para deslocar cursor para a direita
; Chama subrotina para escrever instrução no LCD
; Retorna da subrotina de inicialização do LCD
; SUBROTINA QUE LIMPA O DISPLAY
LIMPA: MOV A,#01H
; Instrução para limpar LCD
LCALL INSTR_WR
; Chama subrotina para escrever instrução no LCD
RET
LINHA1: INC R7
MOV A,R7
MOV DPTR,#MSG1
MOVC A,@A+DPTR
CJNE A,#0FFH,V1
RET
; Incrementa contador
; Carrega acumulador com o conteúdo do contador
; DPTR recebe o endereço da mensagem “MSG1”
; Acumulador recebe o código do caractere do endereço A+DPTR
; Se A = 0FFH  fim da mensagem. Caso contrário, pula para V1
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
Laboratório de Microprocessadores e Microcontroladores
V1: LCALL TEXTO_WR
LCALL ATRASO_LCD
SJMP LINHA1
LINHA2: MOV A,#192
LCALL INSTR_WR
MOV R7,#0FFH
; Instrução para definir endereço do LCD: 192 = C0H
; Chama subrotina para escrever instrução no LCD
; Contador recebe valor FFH
V3: INC R7
MOV A,R7
MOV DPTR,#MSG2
MOVC A,@A+DPTR
CJNE A,#0FFH,V2
RET
; Incrementa contador
; Carrega acumulador com o conteúdo do contador
; DPTR recebe o endereço da mensagem “MSG2”
; Acumulador recebe o código do caractere do endereço A+DPTR
; Se A = 0FFH  fim da mensagem. Caso contrário, pula para V2
V2: LCALL TEXTO_WR
SJMP V3
; Chama subrotina para escrever dados no LCD
INSTR_WR: SETB EN
CLR RW
CLR RS
MOV DADOS,A
CLR EN
LCALL ATRASO_LCD
RET
; Habilita LCD
; Operação de escrita no LCD
; Operação com instrução
; Transfere a instrução para o LCD
; Desabilita LCD
; Chama subrotina de atraso do LCD
TEXTO_WR: SETB EN
CLR RW
SETB RS
MOV DADOS,A
CLR EN
LCALL ATRASO_LCD
RET
; Habilita LCD
; Operação de escrita no LCD
; Operação com dados
; Transfere os dados para o LCD
; Desabilita LCD
; Chama subrotina de atraso do LCD
CONTAGEM: MOV A,R0
ADD A,#01H
DA A
MOV R0,A
JNC V4
; Carrega acumulador com valor atual do byte inferior
; Incrementa acumulador em uma unidade
; Faz o ajuste decimal do byte inferior
; Atualiza o valor de R0
; Desvia para V4 se não houver Carry, ou seja, se R0 =< 99
MOV A,R1
ADD A,#01H
DA A
MOV R1,A
V4: NOP
RET
; Carrega acumulador com valor atual do byte superior
; Incrementa acumulador em uma unidade
; Faz o ajuste decimal do byte superior
; Atualiza o valor de R1
; SUBROTINAS PARA CONVERTER VALORES EM ASCII
DISPLAY: MOV A,#0F0H
ANL A,R1
SWAP A
ORL A,#30H
LCALL MOSTRA4
; Prepara a separação do nibble superior de R1
; Separa nibble superior de R1
; Inverte nibble superior com inferior
; Converte nibble superior de R1 em ASCII
; Mostra o dígito mais significativo da contagem
MOV A,#0FH
ANL A,R1
ORL A,#30H
LCALL TEXTO_WR
; Prepara a separação do nibble inferior de R1
; Separa nibble inferior de R1
; Converte nibble inferior de R1 em ASCII
; Mostra Dígito 3 no display LCD
MOV A,#0F0H
ANL A,R0
SWAP A
ORL A,#30H
LCALL TEXTO_WR
; Prepara a separação do nibble superior de R0
; Separa nibble superior de R0
; Inverte nibble superior com inferior
; Converte nibble superior de R1 em ASCII
; Mostra Dígito 2 no display LCD
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
9
Laboratório de Microprocessadores e Microcontroladores
Rótulo
Mnemônico
MOV A,#0FH
ANL A,R0
ORL A,#30H
LCALL TEXTO_WR
RET
10
Comentário sobre o Efeito da Operação
; Prepara a separação do nibble inferior de R0
; Separa nibble inferior de R0
; Converte nibble inferior de R0 em ASCII
; Mostra Dígito 1 no display LCD
; SUBROTINA PARA MOSTRAR O CONTEÚDO DO ACUMULADOR NO LCD
MOSTRA4: PUSH ACC
MOV A,#202
LCALL INSTR_WR
POP ACC
LCALL TEXTO_WR
RET
ATRASO_LCD: MOV R4,#10
V6: MOV R5,#80
DJNZ R5,$
DJNZ R4,V6
RET
ATRASO: MOV R4,#50
V5: MOV R5,#250
DJNZ R5,$
DJNZ R4,V5
RET
; Guarda dígito 4 na pilha, antes de definir endereço no LCD
; Endereço do dígito 4
; Chama subrotina para escrever instrução no LCD
; Recupere dígito 4 da pilha
; Chama subrotina para escrever dados no LCD – dígito 4
; Carrega registrador R4 com valor decimal 10
; Carrega registrador R5 com valor decimal 80
; Aguarda registrador R5 zerar
; Decrementa R4. Enquanto não for zero, volta para recarregar R5
; Retorna de subrotina de atraso de tempo
; Carrega registrador R4 com valor decimal 200
; Carrega registrador R5 com valor decimal 250
; Aguarda registrador R5 zerar
; Decrementa R4. Enquanto não for zero, volta para recarregar R5
; Retorna de subrotina de atraso de tempo
MSG1: DB ‘MICROCONTROLADOR’, 0FFH
MSG2: DB ‘CONTAGEM:
FIM: NOP
END
‘,0FFH
Explique o funcionamento das subrotinas CONTAGEM e DISPLAY.
3.2 Contagem Decrescente no Display LCD
No programa anterior adapte a subrotina CONTAGEM de modo que a contagem passe a ser
decrescente (9999 até 0000).
Tabela 6: Subrotinas para as contagens crescente e decrescente no display LCD
; CONTAGEM DE 0000 A 9999
; CONTAGEM DE 9999 A 0000
CONTAGEM: MOV A,R0
CONTAGEM:
ADD A,#01H
DA A
MOV R0,A
JNC V4
MOV A,R1
ADD A,#01H
DA A
MOV R1,A
V4: NOP
RET
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
Laboratório de Microprocessadores e Microcontroladores
11
3.3 Acionamento de Motor de Corrente Contínua
O programa dado na Tabela 7 aciona um motor de corrente contínua através da porta P2. O pushbutton no pino P3.3 é usado para inverter o sentido de rotação do motor.
Tabela 7: Acionamento de um motor de corrente contínua através da porta P1
Rótulo
Mnemônicos
Comentários
IN1 EQU P2.0
; Associa entrada IN1 ao pino P2.0
IN2 EQU P2.1
; Associa entrada IN2 ao pino P2.1
ORG 00H
LJMP INICIO
INICIO:
ORG 30H
MOV SP,#2FH
SENTIDO:
JB P3.3,REVERSO
SETB IN1
CLR IN2
SJMP SENTIDO
; Se P3.3 = 1, desvia para REVERSO
; Se P3.3 = 0, aciona motor no sentido DIRETO fazendo
;IN1=1 e IN2 = 0
REVERSO:
CLR IN1
SETB IN2
SJMP SENTIDO
; Se P3.3 = 1, aciona motor no sentido REVERSO fazendo
;IN1=0 e IN2 = 1
Parte 1
Parte 2
END
Explique o funcionamento das Partes 1 e 2.
3.4 Controle de Velocidade de um Motor CC
O programa dado na Tabela 8 permite aumentar a velocidade através da interrupção zero e
diminuir através da interrupção 1. O temporizador zero é usado no modo 2 (recarga automática) para
gerar um sinal PWM, cujo ciclo alto/baixo é alterado pelas interrupções externas. O driver L293D é
utilizado no acionamento do motor. O motor é acionado através dos pinos P2.6 (Saida0) e P2.7 (Saida1).
Tabela 8: Controle de velocidade de um motor de corrente contínua
Rótulo
Saida0
Saida1
Mnemônicos
EQU P2.6
EQU P2.7
TON
TOFF
EQU 10H
EQU 11H
Comentários
; Bit 6 de P2 – Para acionar o motor
; Bit 7 de P2 – Para acionar o motor
; Armazena período ligado
; Armazena período desligado
ORG 00H
LJMP INICIO
ORG 03H
LJMP AUM_VELOC
; Interrupção INT0 – Aumenta velocidade
ORG 0BH
LJMP PWM
; Interrupção TEMP0  Controla velocidade
ORG 13H
LJMP DIM_VELOC
; Interrupção INT1  Diminui velocidade
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
Laboratório de Microprocessadores e Microcontroladores
ORG 30H
MOV SP,#2FH
MOV IE,#87H
MOV TCON,#05H
MOV IP,#02H
MOV TMOD,#02H
; Habilita interrupções INT0, INT1 e TEMP0
; Int0 e int1 são por transição
; Faz TEMP0 com prioridade 1
; TEMP0 no modo 2  com recarga
MOV TON, #0FH
MOV TL0,TON
MOV A,TON
CPL A
MOV TOFF,A
; Periodo ligado TON = 0FH
; TL0 = periodo ligado
; Faz A = periodo ligado
; Acha periodo desligado
; TOFF = complement do periodo ligado
MOV TH0,A
CLR F0
CLR Saida0
CLR Saida1
SETB TR0
SJMP $
; TH0 recebe o valor do periodo desligado
; Limpa flag que indica ligado/desligado (F0 = 1 ==> Ligado)
; Limpa pino P2.0
; Limpa pino P2.1
; Liga o temporizador 0
; Loop infinito aguarda uma das três interrupções habilitadas
PWM:
JB F0, DESLIGA
SETB Saida0
CLR Saida1
SETB F0
MOV TH0,TON
RETI
; Se chave estiver ligada  desliga
; Saída em nível lógico alto --> período alto do PWM
; Mantém pino P2.7 = 0 (rotação em um único sentido)
; Seta flag F0 para indicar que PWM está no período alto
; Faz TH0 = período ligado. Recarga para o ciclo desligado
; Retorna da interrupção do temporizador
DESLIGA:
CLR Saida0
CLR Saida1
CLR F0
MOV TH0, TOFF
RETI
; Saida em nível lógico zero --> período baixo do PWM
; Mantém pino P2.7 = 0 (rotação em um único sentido)
; Limpa flag F0 para indicar que PWM está no período baixo
; Faz TH0 = período desligado. Recarga para o ciclo ligado
; Retorna da interrupção do temporizador
CLR EX0
CLR CY
MOV A, TON
ADD A,#0AH
MOV B,A
SUBB A,#0F0H
JC V1
MOV B,#0F0H
MOV A,B
MOV TON,A
CPL A
MOV TOFF, A
SETB EX0
RETI
; Desabilitar interrupção externa zero
; Limpa flag de carry
; Faz A = período ligado
; Faz A = A + 10
; Guarda em B o valor de TON incrementado
; Verifica se A > F0H (limite de TON).
; Se CY = 1, então A < F0H. Limite ainda não alcançado
; Se CY = 0, B assume valor limite de TON, ou seja, B = F0H
; A recebe valor de B (novo valor de TON)
; TON recebe novo valor do período ligado
; Encontra período desligado
; Carrega em TOFF período desligado
; Reabilita interrupção zero
; Retorna da interrupção externa 0
CLR EX1
CLR CY
MOV A, TOFF
ADD A,#0AH
MOV B,A
SUBB A,#0F0H
JC V2
MOV B,#0F0H
MOV A,B
MOV TOFF,A
CPL A
MOV TON, A
SETB EX1
RETI
; Desabilitar interrupção externa 1
; Limpa flag de carry
; Faz A = período desligado
; Faz A = A + 10
; Guarda em B o valor de TOFF incrementado
; Verifica se A > F0H (limite de TOFF).
; Se CY = 1, então A < F0H. Limite ainda não alcançado
; Se CY = 0, B assume valor limite de TOFF, ou seja, B = F0H
; A recebe valor de B (TOFF)
; TOFF recebe novo valor do período desligado
; Encontra período ligado
; Carrega em TON período ligado
; Reabilita interrupção externa 1
; Retorna da interrupção externa 1
Subrotina de geração de sinal
PWM
INICIO:
AUM_VELOC:
V1:
DIM_VELOC:
V2:
END
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
12
Laboratório de Microprocessadores e Microcontroladores
13
Explique o funcionamento da subrotina de geração de sinal PWM.
Explique o funcionamento das subrotinas AUM_VELOC e DIM_VELOC.
Explique a função da linha "SJMP $"
3.5 Mostra Velocidade do Motor CC no Display LCD
O programa da Tabela 9 mostra no display LCD a velocidade de rotação de um motor de corrente
contínua.
A velocidade é medida através da interrupção externa 1 (pulsos recebidos do sensor de presença
em composição com a roda de 60 furos).
O temporizador zero é usado para gerar o tempo de amostragem de 1 s. Ou seja, a cada segundo a
contagem acumulada (nos registradores R3 e R2) através da interrupção externa 1 é transferida para os
registradores R1 e R0.
A interrupção externa zero é usada para ligar e desligar o motor, através da flag F0. No início do
programa o motor está desligado (F0 = 0).
Tabela 9: Mostra velocidade do motor em um display LCD
Rótulo
Mnemônico
RS EQU P3.5
RW EQU P3.6
EN EQU P3.7
Saida0 EQU P2.6
Saida1 EQU P2.7
DADOS EQU P0
Comentário sobre o Efeito da Operação
; RS = 0  INSTRUÇÃO. RS = 1  DADO
; RW =0  ESCRITA. RW = 1  LEITURA
; PINO DE HABILITAÇÃO DO LCD
; Bit 6 de P2 – Para acionar o motor
; Bit 7 de P2 – Para acionar o motor
; Porta P0 é o canal de dados
ORG 00H
LJMP INICIO
ORG 03H
CPL F0
RETI
; Flag usada para ligar e desligar o motor
ORG 0BH
CLR TF0
LJMP AMOSTRA
; Limpa Flag de fim de contagem do temporizador zero
; Tempo de amostragem
ORG 13H
LJMP PULSOS
; Contagem dos pulsos do sensor de velocidade
ORG 30H
INICIO: MOV SP,#2FH
; Apontador de pilha SP = 2FH
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
Laboratório de Microprocessadores e Microcontroladores
MOV TMOD,#01H
MOV IE,#87H
MOV TCON,#05H
MOV IP,#02H
MOV R0,#00
MOV R1,#00
MOV R2,#00
MOV R3,#00
MOV R7,#0FFH
MOV TH0,#4BH
MOV TL0,#0FFH
MOV R6,#20
CLR EX1
LCALL INICIA
LCALL LINHA1
LCALL LINHA2
LCALL DISPLAY
V1: JNB F0,DESLIGA
SETB TR0
SETB EX1
SETB Saida0
CLR Saida1
SJMP V1
DESLIGA: CLR TR0
CLR EX1
CLR Saida0
CLR Saida1
SJMP V1
AMOSTRA: MOV TH0,#4BH
MOV TL0,#0FFH
DJNZ R6,SAI
MOV R6,#20
MOV R0,02H
MOV R1,03H
MOV R2,#00H
MOV R3,#00H
LCALL DISPLAY
SAI: NOP
RETI
PULSOS: PUSH ACC
MOV A,R2
ADD A,#01H
DA A
MOV R2,A
JNC V2
MOV A,R3
ADD A,#01H
DA A
MOV R3,A
V2: POP ACC
RETI
; Temporizador 0 no modo 1 (16 bits)
; Interrupções INT0, INT1 e do temporizador zero habilitadas
; INT0 e INT1 por transição
; Prioridade alta para o temporizador zero - amostragem a cada 1 s
; Byte inferior da contagem
; Byte superior da contagem
; Byte inferior do acumulador da contagem de pulsos
; Byte superior do acumulador da contagem de pulsos
; Contador
; Temporizador conta de 4BFFH até FFFFH = 46080 pulsos
; 46080 x 1,085 us = 50 ms
; Contador para contar 1 s (20 x 50 ms)
; Desabilita a interrupção externa 1 (contagem dos pulsos)
; Chama subrotina que inicializa e limpa o LCD
; Chama subrotina que mostra mensagem na linha 1
; Chama subrotina que mostra mensagem na linha 2
; Chama subrotina que mostra a contagem nos displays
; Dispara temporizador zero
; Habilita interrupção externa 1 (contagem de pulsos)
; Liga motor
; Para temporizador zero
; Desabilita interrupção externa 1 (contagem de pulsos)
; Desliga motor
; Recarrega TH0 e TL0 para contagem de 50 ms
; Contagem de 4BFFH até FFFFH = 46080 pulsos x 1,085µs = 50 ms
; Verifica se R6 é zero. Se não for, sai da subrotina AMOSTRA
; Se R6=0, recarrega R6
; Transfere contagem de pulsos de R2 (02H) para R0
; Transfere contagem de pulsos de R3 (03H) para R1
; Inicializa o registrador de contagem R2
; Inicializa o registrador de contagem R3
; Chama subrotina que mostra a contagem nos displays
; Carrega acumulador com valor atual do byte inferior
; Incrementa acumulador em uma unidade
; Faz o ajuste decimal do byte inferior
; Atualiza o byte inferior da contagem, R2
; Desvia para V2 se não houver Carry, ou seja, se R2 =< 99
; Carrega acumulador com valor atual do byte superior
; Incrementa acumulador em uma unidade
; Faz o ajuste decimal do byte superior
; Atualiza o byte superior da contagem, R3
; SUBROTINA DE INICIALIZAÇÃO DO DISPLAY LCD
INICIA: MOV A,#38H
; Instrução que indica display de 16 colunas e 2 linhas
LCALL INSTR_WR
; Chama subrotina para escrever instrução no LCD
MOV A,#38H
LCALL INSTR_WR
; Instrução que indica display de 16 colunas e 2 linhas
; Chama subrotina para escrever instrução no LCD
MOV A,#0EH
LCALL INSTR_WR
; Instrução para ligar o cursor
; Chama subrotina para escrever instrução no LCD
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
14
Laboratório de Microprocessadores e Microcontroladores
MOV A,#06H
LCALL INSTR_WR
; Instrução para deslocar cursor para a direita
; Chama subrotina para escrever instrução no LCD
MOV A,#01H
LCALL INSTR_WR
RET
; Instrução para limpar LCD
; Chama subrotina para escrever instrução no LCD
; Retorna da subrotina de inicialização do LCD
LINHA1: INC R7
MOV A,R7
MOV DPTR,#MSG1
MOVC A,@A+DPTR
CJNE A,#0FFH,V11
RET
; Incrementa contador
; Carrega acumulador com o conteúdo do contador
; DPTR recebe o endereço da mensagem “MSG1”
; Acumulador recebe o código do caractere do endereço A+DPTR
; Se A = 0FFH  fim da mensagem. Caso contrário, pula para V1
V11: LCALL TEXTO_WR
LCALL ATRASO_LCD
SJMP LINHA1
LINHA2: MOV A,#192
LCALL INSTR_WR
MOV R7,#0FFH
V3: INC R7
MOV A,R7
MOV DPTR,#MSG2
MOVC A,@A+DPTR
CJNE A,#0FFH,V12
RET
V12: LCALL TEXTO_WR
SJMP V3
; Instrução para definir endereço do LCD: 192 = C0H
; Chama subrotina para escrever instrução no LCD
; Contador recebe valor FFH
; Incrementa contador
; Carrega acumulador com o conteúdo do contador
; DPTR recebe o endereço da mensagem “MSG2”
; Acumulador recebe o código do caractere do endereço A+DPTR
; Se A = 0FFH  fim da mensagem. Caso contrário, pula para V2
; Chama subrotina para escrever dados no LCD
INSTR_WR: SETB EN
CLR RW
CLR RS
MOV DADOS,A
CLR EN
LCALL ATRASO_LCD
RET
; Habilita LCD
; Operação de escrita no LCD
; Operação com instrução
; Transfere a instrução para o LCD
; Desabilita LCD
; Chama subrotina de atraso do LCD
TEXTO_WR: SETB EN
CLR RW
SETB RS
MOV DADOS,A
CLR EN
LCALL ATRASO_LCD
RET
; Habilita LCD
; Operação de escrita no LCD
; Operação com dados
; Transfere os dados para o LCD
; Desabilita LCD
; Chama subrotina de atraso do LCD
; SUBROTINAS PARA CONVERTER VALORES EM ASCII E MOSTRAR NO LCD
DISPLAY: PUSH ACC
MOV A,#0F0H
; Prepara a separação do nibble superior de R1
ANL A,R1
; Separa nibble superior de R1
SWAP A
; Inverte nibble superior com inferior
Converte dígito 4
ORL A,#30H
; Converte nibble superior de R1 em ASCII
em ASCII
PUSH ACC
; Guarda dígito 4 na pilha, antes de definir endereço no LCD
e mostra no
MOV A,#192
; Endereço do dígito 4
display
LCALL INSTR_WR
; Chama subrotina para escrever instrução no LCD
POP ACC
; Recupere dígito 4 da pilha
LCALL TEXTO_WR
; Chama subrotina para escrever dados no LCD – dígito 4
Converte dígito 3
em ASCII
e mostra no
display
MOV A,#0FH
ANL A,R1
ORL A,#30H
LCALL TEXTO_WR
Converte dígito 2 MOV A,#0F0H
; Prepara a separação do nibble inferior de R1
; Separa nibble inferior de R1
; Converte nibble inferior de R1 em ASCII
; Mostra Dígito 3 no display LCD
; Prepara a separação do nibble superior de R0
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
15
Laboratório de Microprocessadores e Microcontroladores
em ASCII
e mostra no
display
ANL A,R0
SWAP A
ORL A,#30H
LCALL TEXTO_WR
; Separa nibble superior de R0
; Inverte nibble superior com inferior
; Converte nibble superior de R1 em ASCII
; Mostra Dígito 2 no display LCD
MOV A,#0FH
Converte dígito 1
ANL A,R0
em ASCII
ORL A,#30H
e mostra no
LCALL TEXTO_WR
display
POP ACC
RET
; Prepara a separação do nibble inferior de R0
; Separa nibble inferior de R0
; Converte nibble inferior de R0 em ASCII
; Mostra Dígito 1 no display LCD
ATRASO_LCD: MOV R4,#10
V6: MOV R5,#80
DJNZ R5,$
DJNZ R4,V6
RET
; Carrega registrador R4 com valor decimal 10
; Carrega registrador R5 com valor decimal 80
; Aguarda registrador R5 zerar
; Decrementa R4. Enquanto não for zero, volta para recarregar R5
; Retorna de subrotina de atraso de tempo
ATRASO: MOV R4,#200
V5: MOV R5,#250
DJNZ R5,$
DJNZ R4,V5
RET
; Carrega registrador R4 com valor decimal 200
; Carrega registrador R5 com valor decimal 250
; Aguarda registrador R5 zerar
; Decrementa R4. Enquanto não for zero, volta para recarregar R5
; Retorna de subrotina de atraso de tempo
MSG1: DB ‘Veloc. do Motor:’, 0FFH
MSG2: DB ‘
END
rpm’, 0FFH
Explique as subrotinas AMOSTRA e PULSOS.
Escola de Engenharia Elétrica, Mecânica e de Computação – Universidade Federal de Goiás
Prof. Dr. José Wilson Lima Nerys – [email protected]
16
Download

Motor de Corrente Contínua e Display LCD