Transcript
Acionamento de motor por controle remoto via RS232 usando HC908 Paulo de Tarso Peres – Ver. 1.0 – Maio de 2004
1
Esclarecimento
Este texto é parte de um trabalho para a disciplina de Projetos Eletrônicos II, 10º semestre do Curso de Engenharia Elétrica da Escola de Engenharia da Universidade Mackenzie. O objetivo era desenvolver um sistema de controle remoto para os motores de posicionamento de uma antena de radar. Dada a finalidade didática da tarefa de essencialmente desenvolver o comando remoto dos motores, a especificação do projeto previa um controle em malha aberta. O sistema, que funcionou com êxito, foi apresentado como parte prática de um trabalho sobre o funcionamento de sistemas de radar no 1º semestre de 2004. O texto contido neste documento foi extraído do relatório entregue.
Paulo de Tarso Peres
Título: Sistema de Controle de Antena de Radar Disciplina: Projetos Eletrônicos II Autores: Marcelo da Silva Flori Paulo César Meier Paulo de Tarso Peres E.E.U.P.M – São Paulo, 2004
2
Introdução
Este projeto apresenta um sistema de controle remoto do acionamento dos motores de posicionamento de uma antena de radar. O sistema, baseado em um microcontrolador Motorola da família HC08, é capaz de controlar dois motores DC, possui um display local para monitoramento de atividades e interface de comunicação serial padrão EIA-232 (RS-232) que, através de programa armazenado, disponibiliza em terminal serial remoto o comando do sistema (Figura 1).
Antena de Radar
Canal Serial RS232/EIA232
Terminal Remoto
Sistema de controle
Figura 1 – Visão geral do sistema
Descrição do sistema
O Sistema de Controle de Posicionamento de Antena de RADAR consiste de um sistema microcontrolado baseado em um microcontrolador 68HC908QY4 (Motorola). O sistema é composto da placa principal, equipada com o microcontrolador e o hardware para um canal serial RS232 de comunicação, um sistema de displays a LED de 16 caracteres de 16 segmentos (DL1414T – Siemens) para monitoração local de funcionamento e uma placa de acionamento de relés para controle dos motores de posicionamento. A Figura 2 mostra uma visão dos componentes do hardware do sistema.
3
Motores
Acionamento Display
Placa principal
Figura 2 – Visão geral do hardware do sistema
A Placa Principal
A placa principal consta de um sistema para o MCU 68HC908, um conversor de níveis de tensão TTL/RS232 e um buffer de corrente para o acionamento dos relés. A placa possui ainda LEDs para a monitoração dos sinais de RX (recepção, verde) e TX (transmissão, vermelho) da porta de comunicações seriais RS232, da alimentação (amarelo) e um LED bicolor para cada motor controlado (vermelho para um sentido, verde para o contrário). Possui ainda 4 conectores, sendo um para a conexão com a fonte de alimentação DC, um para a conexão com a placa de relés do acionamento dos motores, um para conexão do sistema de displays e um para conexão serial RS232, padrão DB9. A fonte de alimentação do sistema é uma fonte DC chaveada comercial de 13,5V por 1A. A tensão de 5V para os circuitos integrados é obtida através de um regulador de tensão integrado 7805 também presente na placa. A Figura 3 mostra a Placa Principal em detalhe (ver Apêndice A, esquema 3).
4
Conector DB-9 RS-232 (EIA-232)
Conector de alimentação
68HC908QY4
Conector do acionamento
Conector do display
Figura 3 – Placa Principal - Detalhe
O sistema de displays
O sistema de displays é baseado no display alfanumérico inteligente com memória Siemens DL1414T. Composto por 4 displays, possui um total de 16 caracteres de capacidade, sendo capaz de apresentar todos os caracteres maiúsculos (de até 6 bits) da tabela ASCII, mais caracteres de pontuação e algarismos arábicos. Os displays possuem entrada de dados em formato paralelo, mas recebem a informação da mensagem em formato serial síncrono. Para que possam ser mostrados, os dados são convertidos para o formato paralelo através de registradores de deslocamento. A Figura 4 mostra o sistema de display em detalhe (ver Apêndice A, esquema 4).
5
Figura 4 – Sistema de displays
A placa de acionamento dos motores
Esta placa consta de 4 relés com um contato NA-NF cada e é responsável pela reversão de polaridade da alimentação dos motores e consequentemente sua inversão de sentido. Os relés possuem bobinas de 12V e são acionados por transistores bipolares (um por relé), que por sua vez recebem o sinal de controle da Placa Principal. A placa possui 3 conectores, sendo um para a alimentação dos motores, um para a entrada dos sinais de comando e alimentação do circuito e um para as conexões com os motores. A Figura 5 mostra a placa dos relés em detalhe, junto à dois micro motores DC de demonstração (ver Apêndice A, esquema 2).
Conexões dos motores
Conector dos sinais de controle
Motores de demonstração
Placa de acionamento
Alimentação dos motores
Figura 5 – Placa de Acionamento e motores de demonstração - detalhes
6
Os Motores de Demonstração
Os motores de demonstração são dois micromotores DC Fauhaber de ímãs permanentes equipados com caixas de redução. Estes motores estão fixados em um suporte de acrílico e possuem, presos a seus eixos, pás de acrílico. Estes motores têm a função de simular a presença dos motores e mecanismos presentes na antena de radar que são responsáveis por seu posicionamento. Eles são uma solução simples e de baixa potência para os testes e demonstração do sistema. Para demonstração do sistema, devem ser alimentados com uma tensão de cerca de 3V, de forma que seja facilmente visível seu funcionamento e reversão de sentido. A Figura 6 mostra em detalhe os motores e seu suporte.
Figura 6 – Motores de demonstração – vistas lateral e superior
7
Funcionamento do Sistema
Funcionamento do Hardware do Microcontrolador
O sistema apresentado deve ser capaz de comunicar-se com um terminal remoto de controle, receber instruções deste, e posicionar uma antena de RADAR conforme comandado. Para tanto, fez-se uso de um microcontrolador de 8 bits de arquitetura CISC da família HC08 da Motorola – EUA. O processador usado, especificamente um 68HC908QY4 é uma pastilha de 16 pinos, com duas portas paralelas bidirecionais configuráveis (5 e 8 bits, respectivamente). Destas, 2 bits da primeira porta foram configurados como entrada e saída, respectivamente, para serem usados como os sinais RX e TX da porta RS232. Apesar de constituírem uma porta paralela, estes bits foram assim configurados para que se pudesse implementar a comunicação serial através de rotinas de programação. A segunda porta foi inteiramente configurada como saída. O nible inferior é usado para controle dos motores, e o superior para controle do sistema de displays. Este sistema de displays é responsável pela apresentação de mensagens pertinentes ao funcionamento do sistema. O programa de controle armazenado no microcontrolador foi então elaborado para reconhecer caracteres ASCII provenientes do terminal remoto, interpreta-los e executar o acionamento dos motores conforme comandado. Comunicação serial de dados
A comunicação serial de dados é necessária para a transmissão de informações para o posicionamento da antena de RADAR por uma longa distância através de um número reduzido de condutores. Em uma transmissão serial de dados, o dado de informação é dividido em bits individuais, enviados um por vez através do canal de comunicação e dentro de intervalos de tempo pré definidos (transmissão assíncrona). A velocidade com que estes dados são transferidos é definida como Taxa de Transferência, e é entendida como sendo a quantidade de dados por unidade de tempo. Para este projeto, foi utilizada a norma de comunicação EIA232 (antiga RS232), que prevê bits de sinalização além dos de dados, níveis de tensão e velocidades de transmissão, entre outros detalhes. A placa principal do sistema se comunica com o terminal remoto à 4800bps, usando 8 bits de dados, 1 bit de parada e nenhum de paridade. A Figura 7 ilustra o padrão de comunicação serial assíncrona.
8
Pacote de dados
Dados: 8 bits Informação: 11 bits
Para 4800 bps, T=1/4800 T=208,3us
D
D
D D
D
D
D
D P
T LSB
MSB
Stop
Start
8 bits de informação
Onde: T=1/Baud Rate LSB: Bit menos significativo MSB: Bit mais significativo
Figura 7 – Comunicação serial assíncrona
Sistema de Displays
O sistema de displays utilizado para mostrar mensagens de monitoração do funcionamento do sistema, de forma semelhante à comunicação serial, utiliza comunicação serial (neste caso síncrona) para seu funcionamento. Isto ocorre dado a necessidade de 6 bits de dados, 4 de endereçamento, e 4 de sinalização (somando 14 bits) para se proceder a escrita em display. Uma vez que o microcontrolador possui ao todo 13 bits de saída, este não poderia acionar o sistema de displays em uma implementação paralela. A solução encontrada foi o uso de registradores de deslocamento configurados de forma a receber a informação serial de dados, assim como a informação de tempo e sinalização dos 4 bits que foram disponibilizados no microcontrolador para este fim. Pôde-se desta forma, inclusive, recorrer ao uso de rotinas de programação muito semelhantes às usadas para a comunicação com o terminal remoto (ver Apêndice B). Este procedimento facilitou em muito o desenvolvimento do programa de controle. A Figura 8 ilustra 3 dos 4 sinais de controle do sistema de displays. Para efeito de simplificação o sinal de CLEAR dos registradores foi omitido.
8 bits de informação
Dados
D
D
D D
D
D
D
D
Clock
Escrita
Figura 8 – Sinais da comunicação síncrona com o display
9
Programa armazenado
O firmware de controle do sistema executa basicamente as seguintes operações: - Esperar pela recepção de um caracter pela porta serial - Se um caracter for recebido, compara-lo com a tabela de comandos - Executar o acionamento correspondente e sinaliza-lo em caso de comando válido - Sinalizar erro em caso de comando inválido - Repetir do início O sistema ainda sinaliza na tela do terminal remoto e no sistema de display quando um comando é executado ou um erro é detectado. Em caso de erro de comunicação, o sistema está programado de forma a parar todos os motores como medida de segurança.
Figura 9 – Tela do terminal remoto RS232
10
Operação do terminal remoto
Ao ser inicializado, o sistema imprime uma tela com as seguintes opções: Controle de Antena de RADAR =========================== * [0] - Motores parados * Azimute [1] Positivo [2] Negativo * Elevacao [3] Positiva [4] Negativa E.E.U.P.M. - 1.o sem/2004 - M.F./P.C.M/P.T.P. *PRONTO! [V.1.1] Onde as entradas válidas são os números 0 a 4 do teclado do terminal. Estas entradas comandam os movimentos de posicionamento da antena. Por exemplo, a entrada [1] resultará no acionamento do motor de azimute na direção estabelecida como positiva. Paralelamente, o terminal mostrará a mensagem correspondente à ação executada, assim como o display alfanumérico (Figura 10): *PRONTO! [V.1.1] AZIMUTE POSITIVO
Figura 10 – Mensagem de monitoramento do azimute
Caso seja comandada uma entrada inválida, isto é, um caracter fora da faixa estabelecida, uma condição de erro será sinalizada e as opções de entrada serão reimpressas. Neste caso os motores serão desligados pelo sistema (Figura 11). Após este procedimento, o sistema retorna a condição de recebimento de comandos. *PRONTO! [V.1.1] >>>>ERRO<<<< Controle de Antena de RADAR =========================== * [0] - Motores parados * Azimute [1] Positivo [2] Negativo * Elevacao [3] Positiva [4] Negativa E.E.U.P.M. - 1.o sem/2004 - M.F./P.C.M/P.T.P. MOTORES PARADOS *PRONTO! [V.1.1]
11
Figura 11 – Mensagens da seqüência de erro
12
Referências
CANZIAN, E.,”Minicurso: Comunicação Serial RS-232”, CNZ Engenharia e Informática Ltda., apostila LIZZARRAGA, H.,”Técnicas de Comunicación Série para Microcontroladores de la Flia. HC908 que no posean Módulo SCI”, Comentario Tecnico, SyHDe – Soft y Hard Desarrollos M68HC08 Microcontrollers: CPU08 Central Processor Unit Reference Manual, Motorola Semiconductor, Ver 3, EUA, 2001. MC68HC908QY4/QT4/QY2/QT2/QY1/QT1Datasheets, Motorola Semiconductor, Ver. 1, EUA, 2003. DL1414T: Datasheet, Siemens Components, 1993.
Apêndice A
Esquemas elétricos e lista dos componentes
Lista de componentes
Esquema 2 - Acionamento dos Motores Quantidade Tipo Valor Ref ======================================================================== 4 2N2222A Q1,Q2,Q3,Q4 4 DIODE 1N4007 D1,D2,D3,D4 2 MOTORSERVO 1516E012S M1,M2 4 RELAY1BM CZ2.530 K1,K2,K3,K4 4 RES 4k7 R1,R2,R3,R4
Esquema 3 - Placa Principal (Microcontrolador) Quantidade Tipo Valor Ref ======================================================================== 2 2N2222A Q1,Q2 1 7406 U2 4 CAP 100nF C5,C7,C8,C9 1 DB9M P1 1 LED AM D7 2 LED VD D3,D5 1 LED VD(RX) D1 2 LED VM D4,D6 1 LED VM(TX) D2 1 LM7805CTB U4 1 MAX232 U1 1 MC68HC908QY2/4 U3 1 POLCAP 100uF C6 4 POLCAP 1uF C1,C2,C3,C4 3 RES 220 R1,R2,R9 2 RES 2k7 R3,R4 4 RES 560 R5,R6,R7,R8 1 XTAL_OSC 20.00000MHz XL1
Esquema 4 - Placa dos Displays Quantidade Tipo Valor Ref ======================================================================== 2 74164 U1,U3 1 74368 U2 3 CAP 100nF C1,C2,C3 4 DL1414T DS1,DS2,DS3,DS4
Apêndice B Listagem do programa fonte em linguagem assembly Motorola 68HC908
Listagem do Programa (Versão 1.1) XDEF Entry,main,t_isr,_Startup Include 'qtqy_registers.inc' t50ms
EQU
31249
;delay de 50ms em 20MHz
;*** Equates para controle dos motores motor_1p motor_1n motor_2p motor_2n
EQU EQU EQU EQU
0 1 2 3
pos_m1 neg_m1 pos_m2 neg_m2 stp_mx
EQU EQU EQU EQU EQU
"1" "2" "3" "4" "0"
;*** Equates para controle da porta serial tser rser
EQU 128 EQU 63
pser
EQU PORTA
ptx prx chr_0 chr_1
;delay de tx serial 4800 baud em 20MHz ;delay de rx serial 4800 baud em 20MHz
EQU 0 EQU 2 EQU $0081 EQU $0082
;*** Equates para controle de display clear clock dado write
EQU 7 EQU EQU 5 EQU 4
pdisp char pos pos_a pos_b contr
EQU EQU EQU EQU EQU EQU
6
PORTB $0083 $0084 $0085 $0086 $0087
;*** Equates para controle de display ;*** Definicoes de mensagens ;************************ 1111111 ;************************1234567890123456 msg_pronto: DC.B "*PRONTO! [V.1.1]",0 msg_erro: DC.B " >>>>ERRO<<<<",0 msg_spare: DC.B "MOTORES PARADOS",0 msg_motor1p: DC.B "AZIMUTE POSITIVO",0 msg_motor1n: DC.B "AZIMUTE NEGATIVO",0 msg_motor2p: DC.B "ELEVAC. POSITIVA",0 msg_motor2n: DC.B "ELEVAC. NEGATIVA",0
disp_cls:
DC.B
"
",0 ;Nao alterar!
ser_crlf:
DC.B
13,10,0
msg_intro1: DC.B "Controle de Antena de RADAR",13,10,0 msg_intro2: DC.B "===========================",13,10,0 msg_intro3: DC.B "* [0] - Motores parados",13,10,0 msg_intro4: DC.B "* Azimute [1] Positivo [2] Negativo",13,10,0 msg_intro5: DC.B "* Elevacao [3] Positiva [4] Negativa",13,10,0 msg_intro6: DC.B "E.E.U.P.M. - 1.o sem/2004 M.F./P.C.M/P.T.P.",13,10,0 ;*** Definicoes de mensagens _Startup: Entry: ldhx #$00FF txs clrh sei main:
clrx lda sta lda sta
#00001001B ;original CONFIG2 #00011001B CONFIG1
lda sta lda sta
#$FF PORTA #00000001B DDRA
lda sta lda sta lda sta
#$FF PORTB #$FF DDRB #$FF PTBPUE
; configura portA como saida apenas em
PTA0
; configura saidas no portB ; habilita resistores de pull-up
lda #$02 sta OSCSTAT
; Nao inicia no clock externo sem isso!!! ;=========================================
;*** main_loop: lda sta sta jsr com_loop:
#$00 PORTB PORTA introd
jsr set_disp ldhx #msg_pronto jsr wr_str jsr dly_1s ldhx #msg_pronto jsr snd_str ldhx #ser_crlf jsr snd_str jsr rd_char
;Display
;Serial
;Leitura de entrada e escolha do motor
cmp beq cmp beq cmp beq cmp beq cmp beq
parados:
pos_m1 motor1p neg_m1 motor1n pos_m2 motor2p neg_m2 motor2n stp_mx parados
jsr cls_disp ldhx #msg_erro jsr wr_str ldhx #msg_erro jsr snd_str ldhx #ser_crlf jsr snd_str jsr introd
;Display
bclr bclr bclr bclr
; Para todos os motores
motor_1p,PORTB motor_1n,PORTB motor_2p,PORTB motor_2n,PORTB
jsr dly_1s jsr cls_disp ldhx #msg_spare jsr wr_str ldhx #msg_spare jsr snd_str ldhx #ser_crlf jsr snd_str jsr dly_1s bra com_loop ;*** MOTOR 1 motor1p: jsr bra motor1n: jsr bra
mot1p com_loop mot1n com_loop
;*** MOTOR 2 motor2p: jsr bra motor2n: jsr bra jmp
mot2p com_loop mot2n com_loop main_loop
;Mensagem de introducao pela serial introd: ldhx #ser_crlf jsr snd_str ldhx #msg_intro1 jsr snd_str ldhx #msg_intro2 jsr snd_str ldhx #ser_crlf jsr snd_str ldhx #msg_intro3 jsr snd_str ldhx #msg_intro4
;Serial
;Display
;Serial
jsr snd_str ldhx #msg_intro5 jsr snd_str ldhx #ser_crlf jsr snd_str ldhx #msg_intro6 jsr snd_str rts ; Rotinas de controle de motor mot1p: jsr cls_disp ldhx #msg_motor1p jsr wr_str ldhx #msg_motor1p jsr snd_str ldhx #ser_crlf jsr snd_str bset motor_1p,PORTB bclr motor_1n,PORTB jsr dly_1s rts mot1n: jsr cls_disp ldhx #msg_motor1n jsr wr_str ldhx #msg_motor1n jsr snd_str ldhx #ser_crlf jsr snd_str bset motor_1n,PORTB bclr motor_1p,PORTB jsr dly_1s rts mot2p:
mot2n:
jsr cls_disp ldhx #msg_motor2p jsr wr_str ldhx #msg_motor2p jsr snd_str ldhx #ser_crlf jsr snd_str bset motor_2p,PORTB bclr motor_2n,PORTB jsr dly_1s rts jsr cls_disp ldhx #msg_motor2n jsr wr_str ldhx #msg_motor2n jsr snd_str ldhx #ser_crlf jsr snd_str bset motor_2n,PORTB bclr motor_2p,PORTB jsr dly_1s rts
;Serial
;Serial
;Serial
;Serial
;cls_disp - apaga conteudo do display cls_disp: mov #16,contr ; caracteres restantes mov #128,pos_a ; info de display mov #$00,pos_b ; info de caracter mov #$00,pos
ldhx #disp_cls jsr wr_str rts ; Escrita de string a partir do endereco passado em #HX wr_str: wr_str2: lda ,X cbeqa #0,eost jsr wr_msgd aix #1 ;sempre usar AIX bra wr_str2 eost: clra rts ; Escrita de msg em display wr_msgd: sta char jsr wr_disp psha lda pos_b eor #$FF and #$03 ora pos_a sta char jsr wr_disp inc pos_b dbnz contr,nao_zero mov #128,pos_a ;Zera controles mov #$00,pos_b mov #16,contr nao_zero: lda pos_b ;Testa fim do display cmp #$04 bhs res_od bra cont_od res_od: lda pos_b ;reset do display e passagem p. o prox. and #$03 sta pos_b lsr pos_a cont_od: pula bclr write,pdisp ;Autoriza escrita jsr dly_st bset write,pdisp rts ; set_disp - Inicializa display set_disp: mov #16,contr mov #128,pos_a mov #$00,pos_b mov #$00,pos bclr clear,pdisp bset write,pdisp bclr dado,pdisp bset clock,pdisp jsr dly_st bset clear,pdisp rts ; Escreve caracter na forma serial wr_disp: psha lda #08 testa_a: cbeqa #00,fim_wr brset 0,char,deu_1b
; caracteres restantes ; info de display ; info de caracter
deu_1b:
deu_0b:
fim_wr:
bra deu_0b bset dado,pdisp bclr clock,pdisp jsr dly_st bset clock,pdisp jsr dly_st lsr char deca bra testa_a bclr dado,pdisp bclr clock,pdisp jsr dly_st bset clock,pdisp jsr dly_st lsr char deca bra testa_a pula rts
;*Sub rotinas seriais* ;rd_char - le caractere da serial e devolve valor em A rd_char: mov #$00,chr_1 lda #07 brset prx,pser,* jsr dly_st ;espera start bit le_porta: jsr dly_rs brset prx,pser,rec_1 bra rec_0 rec_1: psha lda chr_1 ora #$80 lsra sta chr_1 pula jsr dly_rs dbnza le_porta bra rd_end rec_0: psha lda chr_1 and #$7F lsra sta chr_1 pula jsr dly_rs dbnza le_porta rd_end: jsr dly_st lda chr_1 rts ;snd_str - Envia string pela serial snd_str: lda ,X cbeqa #0,s_eost jsr snd_char aix #1 ;sempre usar AIX bra snd_str s_eost: clra rts ;snd_chr ;envia caracter no formato 8N1 snd_char: sta chr_0 ;[3]
sc_vol: deu_1:
deu_0:
ret_snd:
psha ;[2] lda #08 ;[2] bclr ptx,pser ;[4] start bit (11) jsr dly_st ;[4] brset 0,chr_0,deu_1 ;[5]testa e desvia se igual a 1 bra deu_0 ;[3] bset ptx,pser ;[4]aciona a porta jsr dly_st ;[4]espera lsr chr_0 ;[4]rotaciona byte dbnza sc_vol ;[3]decrementa A e retorna se nao 0 bra ret_snd ;[3] bclr ptx,pser ;[4]aciona a porta jsr dly_st ;[4]espera lsr chr_0 ;[4]rotaciona byte dbnza sc_vol ;[3]decrementa A e retorna se nao 0 bset ptx,pser ;[4]1 stop bit jsr dly_st ;[4] pula ;[2] rts ;[4]
;dly_st - Delay serial p. TX ;Ver 1.1 - Ttotal=13+8*tser dly_st: pshx pshh ldhx #tser loop_s: aix #-1 cphx #0 bne loop_s pulh pulx nop rts ;dly_rs - Delay serial p. TX ;Ver 1.1 - Ttotal=13+8*tser dly_rs: pshx pshh ldhx #rser ;[3] loop_sb: aix #-1 cphx #0 bne loop_sb pulh pulx nop rts dly_1s:
loop0: loop1:
pshx pshh psha lda ldhx aix cphx bne deca bne pula pulh pulx rts
#20 #t50ms #-1 #0 loop1 loop0
;retorna
;[2] salva registradores ;[2] ;[3] ;[(2+] ;[3+] ;[+3)*tser] ;[2] ;[2] ;[1] ;[4] 1 ciclo serial =1+13+8*tser
;[2] salva registradores ;[2] ;[(2+] ;[3+] ;[+3)*tser] ;[2] ;[2] ;[1] ;[4] 1 ciclo serial =1+13+8*tser
;multiplicador ;fatia de tempo
t_isr: done_tisr: rti END ;fim do programa