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