Você está na página 1de 43

UNIVERSIDADE FEDERAL DO ESPRITO SANTO CENTRO TECNOLGICO DEPARTAMENTO DE ENGENHARIA ELTRICA PROJETO DE GRADUAO

COMUNICAO SERIAL PC PLOTTER ESTUDO E UTILIZAO DO MICROCONTROLADOR PIC16F877

SERGIO PAZZINI DA SILVA MATOS

VITRIA ES FEVEREIRO/2007

SERGIO PAZZINI DA SILVA MATOS

COMUNICAO SERIAL PC PLOTTER ESTUDO E UTILIZAO DO MICROCONTROLADOR PIC16F877

Parte manuscrita do Projeto de Graduao do aluno Sergio Pazzini da Silva Matos, apresentado ao Departamento de Engenharia Eltrica do Centro Tecnolgico da Universidade Federal do Esprito Santo, para obteno do grau de Engenheiro Eletricista.

VITRIA ES FEVEREIRO/2007

SERGIO PAZZINI DA SILVA MATOS

COMUNICAO SERIAL PC PLOTTER ESTUDO E UTILIZAO DO MICROCONTROLADOR PIC16F877

COMISSO EXAMINADORA:

___________________________________ Prof. Dr. Paulo Faria Santos Amaral Orientador

___________________________________ Prof. Dr. Teodiano Freire Bastos Filho Examinador

___________________________________ Eng. Rodrigo Thompson Vargas Examinador

Vitria - ES, 26, fevereiro, 2007

DEDICATRIA

Aos meus pais, Cyro e Letcia.

AGRADECIMENTOS Agradeo a Eric Clapton, U2 e Metallica pela grande compreenso e companhia na realizao deste projeto. Agradeo aos amigos que, por muitas vezes fui ausente, mas o motivo disto est sendo apresentado aqui. Ao meu orientador, Paulo Amaral, por ter-me permitido realizar este projeto e pela ajuda e apoio durante todo o tempo. Agradeo especialmente a Rogrio Costa Pacheco Neto e Paulo Franklin Raskin Ferrua, companheiros de laboratrio nesta reta final. O apoio deles foi essencial, principalmente nos momentos nos quais nada funcionava. Grandes amigos. Agradeo aos meus pais pela pacincia e apoio em todos estes anos de estudos. Sem eles isto no seria possvel.

ii

LISTA DE FIGURAS Figura 1 - Diagrama do sistema. ....................................................................................7 Figura 2 - Diagrama de blocos do sistema.....................................................................8 Figura 3 - A plotter HP Draft Pro 7570A. ...................................................................11 Figura 4 - Detalhes dos motores da plotter. .................................................................12 Figura 5 - O circuito de comunicao serial. ...............................................................13 Figura 6 Esquema do circuito. ..................................................................................14 Figura 7 - O PIC...........................................................................................................15 Figura 8 - HCTL2016. .................................................................................................16 Figura 9 - Esquema da ligao serial. ..........................................................................17 Figura 10 - O L298. .....................................................................................................18 Figura 11 - Diagrama de blocos da ponte H dupla L298.............................................18

iii

LISTA DE TABELA Tabela 1 - Comandos implementados no projeto. .......................................................25 Tabela 2 - Resultados para o Motor 1, que puxa o papel. ...........................................27 Tabela 3 - Resultados para o Motor 2, que movimenta a pena. ..................................27

iv

SUMRIO DEDICATRIA........................................................................................................... I AGRADECIMENTOS .............................................................................................. II LISTA DE FIGURAS ............................................................................................... III LISTA DE TABELA ................................................................................................ IV SUMRIO ................................................................................................................... V RESUMO ................................................................................................................... VI INTRODUO ............................................................................................................7 1 OS ELEMENTOS DO PROJETO .................................................................9 1.1 O Microcontrolador ............................................................................................9 1.2 A Plotter ............................................................................................................10 2 O CIRCUITO DO CONTROLADOR .........................................................13 2.1 O PIC ................................................................................................................15 2.2 Os Chips de Encoder .........................................................................................16 2.3 O Chip MAX232...............................................................................................17 2.4 O L298 ..............................................................................................................17 3 A PROGRAMAO .....................................................................................19 3.1 Programando o PIC ...........................................................................................19 3.2 Funcionamento do programa ............................................................................19 3.2.1 Mudando os parmetros do PID..............................................................22 3.2.2 As interrupes ........................................................................................24 3.2.2.1 A interrupo de Timer 0 ...........................................................24 3.2.2.2 A interrupo de recepo pela porta serial ...............................24 3.3 Resumo dos comandos ......................................................................................25 3.4 Comandos interessantes ....................................................................................25 4 5 RESULTADOS OBTIDOS............................................................................27 CONSIDERAES FINAIS.........................................................................28

APNDICE A .............................................................................................................29 REFERNCIAS BIBLIOGRFICAS.....................................................................40 v

RESUMO Este trabalho constitui na elaborao de uma placa microcontrolada que realize uma comunicao serial com o PC e controle os motores de uma plotter. Na mesma placa foi projetado um circuito de medio das posies dos motores, fechando a malha para o controle atravs de um algoritmo PID. A porta serial do circuito tem como funo enviar e receber dados sobre as posies dos motores a serem controlados. Este projeto dever ser mais uma opo para experincias de laboratrio da disciplina de Microprocessadores I da Universidade Federal do Esprito Santo.

vi

INTRODUO
Um trabalho de concluso de curso pressupe a utilizao dos conceitos e habilidade adquiridos no mesmo. O curso de Engenharia Eltrica proporciona ao aluno a aquisio de contedos e o desenvolvimento de habilidades que possibilitam a elaborao de trabalhos prticos onde ficam evidenciadas as possibilidades desta rea de conhecimento que a Engenharia Eltrica. Motivado por estes dois itens: Elaborar um trabalho de concluso de curso e a utilizao prtica dos conceitos e habilidades adquiridos, surge o objeto deste projeto: Utilizar um microcontrolador para que, via PC, os motores da plotter existente no laboratrio de Microeletrnica do Departamento de Engenharia Eltrica da UFES sejam acionados. O diagrama abaixo mostra um esquema do sistema como um todo.

Motores Comunicao Serial

Placa microcontrolada Rel

Figura 1 - Diagrama do sistema.

Para a execuo deste projeto foram utilizados conceitos de microcontroladores, motores CC, sensores, teorias de controle de malha fechada, controladores PID e linguagem de programao, que foram adquiridos durante este curso. Sendo assim, o objetivo do projeto se constitui da seguinte maneira: Substituir toda a parte eletrnica de uma plotter por uma placa microcontrolada que se comunique via porta serial com o PC, implementando os comandos dos motores da plotter, usando ponte H com PWM. Ser implementado um

8 controlador PID para estes motores que tambm tero codificadores ticos de posio visando um controle de malha fechada. E o diagrama de blocos do sistema apresentado na figura 2.

Figura 2 - Diagrama de blocos do sistema.

O projeto foi subdividido em etapas descritas nos captulos deste relatrio: Uma pesquisa bibliogrfica sobre microcontroladores e, especialmente o microcontrolador PIC 16F877, que est resumidamente apresentada no captulo 1, intitulado Os Elementos do Projeto. Ainda neste captulo so apresentados alguns dados sobre a plotter. Montagem da placa para a comunicao serial entre o PC e o PIC cujos principais circuitos esto apresentados no captulo 2: O Circuito de Comunicao Serial; A programao em linguagem C utilizada para programar o PIC, apresentadas no captulo 3, intitulado Programando o PIC; E no captulo 4, os resultados obtidos. Este trabalho apresenta tambm as consideraes finais sobre o projeto: Resultados, problemas apresentados, possibilidades de outros estudos.

OS ELEMENTOS DO PROJETO

1.1 O Microcontrolador Um microcontrolador uma espcie de microprocessador programvel, em um chip otimizado para controlar dispositivos eletrnicos. Possui memria e interface de entradas e sadas E/S(I/O) integrados, enfatizando a auto-suficincia, em contraste com um microprocessador de propsito geral, o mesmo tipo usado nos PCs, que requer chips adicionais para prover as funes necessrias. Estes equipamentos so conhecidos como Sistemas Embutidos, do ingls Embedded System, pois o microcontrolador embutido dentro de um sistema fechado e com funes bem especficas. Em geral, estes sistemas exigem um controle preciso do tempo, pois trabalham em tempo real. A capacidade de processamento e de memria variam de acordo com a aplicao, podendo ser um simples relgio ou um equipamento industrial complexo que envolve at uma camada de sistema operacional executando sobre o microcontrolador. Os microcontroladores so componentes utilizados em muitos tipos de equipamentos eletrnicos, sendo a grande maioria entre os chips vendidos. Cerca de 50% so controladores "simples", outros 20% so processadores de sinais digitais (DSPs) mais especializados. Os microcontroladores podem ser encontrados em mquinas de lavar, forno de microondas, telefones, etc [12]. As principais vantagens dos microcontroladores so: Baixo custo e consumo; Porttil; Poucos componentes (elimina necessidade de componentes externos); Reconfigurao por software; Curto tempo para desenvolvimento (time-to-make). Os PIC (PICmicro) so uma famlia de microcontroladores fabricados pela Microchip Technology, que processam dados de 8 bits (recentemente foi lanada uma famlia de 16 bits com prefixo 24F) com extensa variedade de modelos e perifricos internos, com arquitetura Harvard e conjunto de instrues RISC (conjuntos de 35

10 instrues e de 76 instrues), com recursos de programao por Memria Flash, E2PROM e OTP. Os microcontroladores PIC tm famlias com ncleos de processamento de 12 bits, 14 bits e 16 bits e trabalham em velocidades de 0kHz (ou CC) a 48MHz, usando ciclo de instruo mnimo de 4 perodos de clock, o que permite uma velocidade de no mximo 10 MIPS (Milhes de Instrues Por Segundo). H o reconhecimento de interrupes tanto externas como de perifricos internos. Funcionam com tenses de alimentao de 2 a 6V e os modelos possuem encapsulamento de 6 a 100 pinos em diversos formatos (SOT23, DIP, SOIC, TQFP, etc). Neste projeto utilizamos um microcontrolador da famlia PIC, pelo fato de ser bastante poderoso e j ter sido estudado durante o curso de Engenharia Eltrica. Seu modelo o PIC 16F877 e tem as seguintes caractersticas [3]: 40 pinos, o que possibilita a montagem de um hardware capaz de interagir com diversos recursos e funes ao mesmo tempo; Via de programao com 14 bits e 35 instrues; 33 portas configurveis como entrada ou sada; Memria de programao E2PROM FLASH, permitindo a gravao rpida do programa diversas vezes no mesmo chip, sem a necessidade de apag-lo por meio de luz ultravioleta; Memria de programa com 8kwords, com capacidade de escrita e leitura pelo prprio cdigo interno; Memria E2PROM (no-voltil) interna com 256 bytes; Memria RAM com 368 bytes; Comunicaes seriais: SPI, I2C e USART; Dois mdulos CCP: Capture, Compare e PWM.

1.2 A Plotter o objeto principal deste trabalho. A plotter HP Draft Pro modelo 7570A se encontra no laboratrio de microprocessadores da Universidade Federal do Esprito Santo.

11 Uma plotter uma impressora destinada a imprimir desenhos em grandes dimenses, com elevada qualidade e rigor como, por exemplo, plantas arquitetnicas e mapas cartogrficos. Primeiramente destinada impresso de desenhos vetoriais, atualmente encontram-se em avanado estado de evoluo, permitindo impresso de imagens em grande formato com qualidade fotogrfica [11]. Possui uma srie de comandos padronizados para realizao de diversas funes, tais como desenhar arcos, linhas cheias, linhas tracejadas, caracteres, preenchimento de polgonos, entre outros. Neste projeto vamos nos concentrar em alguns de seus comandos mais bsicos. A plotter utilizada neste projeto se apresenta na figura 3.

Figura 3 - A plotter HP Draft Pro 7570A.

A visualizao de seus motores apresentada na figura 4 abaixo, onde se pode ver o motor que puxa o papel na parte de cima, com o cilindro que move o papel, e o motor que move a pena, que se desloca por meio de uma grande correia, ao longo do eixo cilndrico.

12

Figura 4 - Detalhes dos motores da plotter.

HPGL a linguagem de controle primria das impressoras usada pelas plotters da Hewlett-Packard. HPGL significa Hewlett-Packard Graphics Language (Linguagem Grfica da Hewlett-Packard), e mais tarde se tornou padro para quase todas as plotters. Esta linguagem formada por uma srie de duas letras, seguida por parmetros opcionais. Por exemplo, um arco pode ser desenhado em uma pgina atravs do seguinte comando: AA100,100,50; Isto significa Arc Absolute (Arco Absoluto) e seus parmetros definem o centro do arco em 100,100 no seu sistema de coordenadas, com um ngulo inicial de 50 graus anti-horrio. Seu sistema de coordenadas foi baseado na menor unidade que estes equipamentos podem suportar, e foi setado em 25m. Para este projeto, foi definida uma linguagem especfica para o controle dos motores, que ser explicada com detalhes mais frente.

13

O CIRCUITO DO CONTROLADOR
A comunicao serial entre o PC e a Plotter e o controle dos motores foram

realizados por meio de um circuito eletrnico construdo em uma placa universal, contendo um microcontrolador PIC 16F877 da Microchip, um chip L298 que contm duas pontes H para acionamento dos dois motores DC de 12 V da Plotter, dois chips de encoder HCTL2016, um flip flop para dividir o clock para os chips de encoder, um chip MAX232 para comunicao serial, um oscilador de 16MHz, alm de diodos, resistores, leds, capacitores e conectores. O circuito eletrnico construdo est apresentado na figura 5 e seu esquema apresentado na figura 6. O circuito alimentado com tenses de 5V para os chips e 12V para os motores e as pontes H do LM298, e possui as seguintes funcionalidades: Led indicador de alimentao; Led acionvel pelo circuito; Comunicao com o PC atravs da porta serial; Controlar a direo de movimentao dos motores; Alterar o estado lgico de alguns pinos do PIC; Ler o estado lgico de alguns pinos do PIC.

Figura 5 - O circuito de comunicao serial.

14

Figura 6 Esquema do circuito.

15 2.1 O PIC O PIC o elemento principal do circuito. A comunicao entre o PC e o PIC feita por um programa escrito em PICC e gravado na memria do PIC. Este programa chamado firmware, e recebe os dados enviados pelo PC atravs da porta serial, interpreta-os, e executa os comandos correspondentes no PIC. A sua pinagem apresentada na figura 7 a seguir.

Figura 7 - O PIC.

So utilizados os dois pinos de CCP no modo PWM para a movimentao dos motores atravs da ponte H (chip L298). Para que estes pinos funcionem corretamente, preciso que o timer 2 seja configurado, definindo a freqncia do sinal PWM [2]. A ponte H acionada pelos pinos RB1, RB2, RB4 e RB5 do PIC que fazem a funo de comandar o sentido de giro dos motores. E os pinos CCP (RC1 e RC2) ligados aos pinos de Enable da ponte iro funcionar como reguladores de velocidade com a qual os motores iro girar. Os chips de encoder possuem um barramento de 8 bits no qual a palavra incrementada ou decrementada relativa aos encoders dos motores lida pelo PIC atravs da sua porta paralela, que correspondem aos pinos RD0, RD1, RD2, RD3, RD4, RD5, RD6 e RD7.

16 Os pinos RC7 e RC6 so utilizados, respectivamente, como receptor e transmissor da comunicao serial do PIC. Estes pinos so conectados ao chip MAX232 que faz a interface com a porta serial do PC. Este chip ser descrito melhor mais frente.

2.2 Os Chips de Encoder O HCTL2016 um circuito integrado que executa as funes de decodificador em quadratura, contador e interface com o barramento. Este chip possui dois canais (CHA e CHB) para a entrada do sinal em quadratura, e um barramento de 8 bits de sada do sinal decodificado. Neste projeto, foram utilizados dois chips HCTL2016, apresentados na figura 8, operando em 8MHz, sendo necessria a utilizao de um flip flop para a diviso do clock proveniente do oscilador de 16MHz [5]. Os pinos CHA e CHB so ligados aos sinais em quadratura provenientes dos encoders dos motores, e os pinos D0 a D7 so conectados aos pinos RD0 a RD7 do PIC. Como so utilizados dois destes chips, este barramento de 8 bits do PIC compartilhado pelos dois chips, porm, atravs de comandos via software, estes chips nunca iro enviar seus dados pelo barramento ao mesmo tempo.

Figura 8 - HCTL2016.

17 2.3 O Chip MAX232 O chip MAX232 um transmissor/receptor duplo que inclui um gerador capacitivo de tenso para fornecer nveis de tenso EIA-232 (-15V a +15V) a partir de uma nica fonte de 5V. Cada receptor converte as entradas EIA-232 aos nveis de 5V TTL/CMOS. Cada transmissor converte nveis de entrada TTL/CMOS nos nveis EIA232 [6]. Para este projeto foi utilizada apenas uma das duas vias de RX/TX do MAX232 conectado aos pinos RC6 e RC7 do PIC, transmissor e receptor, respectivamente. O esquema da ligao do PC com a placa mostrado na figura 9.

Figura 9 - Esquema da ligao serial.

2.4 O L298 O circuito integrado L298, apresentado na figura 10, um driver duplo de alta tenso e alta corrente projetado para aceitar nveis lgicos TTL e comandar cargas indutivas como rels, solenides, motores CC e de passo. Os dois pinos de Enable permitem habilitar e desabilitar o dispositivo independentemente dos sinais de entrada. Possui o emissor dos transistores ligados ao pino de SENSE onde, acoplando-se um resistor externo, pode-se obter uma tenso proporcional corrente drenada por cada ponte. Devido a sua alta corrente, o chip foi montado sobre um dissipador trmico, para evitar aquecimento excessivo [7].

18

Figura 10 - O L298.

Com os pinos de entradas e Enable ligados ao PIC, possvel acionar os motores que esto conectados aos pinos de sada do L298, possibilitando o controle da direo de giro, a partir dos pinos de entrada, e o controle da tenso fornecida para cada motor, a partir dos pinos de Enable conectados aos pinos de PWM do PIC que fazem o chaveamento dos transistores do chip que controlam a tenso de sada. O diagrama de blocos do L298 mostrado na figura 11.

Figura 11 - Diagrama de blocos da ponte H dupla L298.

19

3 A PROGRAMAO
3.1 Programando o PIC Para que a comunicao serial e o acionamento dos motores funcionem, preciso que o PIC seja programado com um software adequado, elaborado em uma linguagem robusta e eficiente. Neste projeto, foi utilizada a Linguagem C para construir o software a ser carregado no PIC.

3.2 Funcionamento do programa A execuo do programa feita basicamente atravs de interrupes, que sero explicadas mais frente. O programa fica em um loop infinito e, quando acontece uma interrupo, ocorre um desvio para realizar a funo definida pela interrupo. Assim que as funes terminam, o programa volta ao loop infinito, esperando uma nova interrupo. O programa possui vrias funes para que ele seja executado de modo mais eficaz. As funes pid_m1() e pid_m2() so anlogas, cada uma para cada motor da plotter, e calcula o ciclo de trabalho (duty cicle) dos pwms do PIC a partir das posies atuais e desejadas (no caso, chamadas referncias no software) e os termos proporcional, integral e derivativo dos motores. O trecho do programa com o cdigo da funo pid_m1() descrito abaixo.
void pid_m1() { u0_m1 = (signed long int)(p_ref_m1)-p_atual_m1; vpid_m1.ypid = (signed int32)kp_m1 * u0_m1; if (!saturated_m1) { integral_m1 +=(signed int32)u0_m1; if (integral_m1 < -30000) integral_m1=-30000; else if (integral_m1 > 30000) integral_m1=30000; } vpid_m1.ypid+= (signed int32)ki_m1*integral_m1; vpid_m1.ypid+= (signed int32)kd_m1*(u0_m1-u1_m1);

20
if (vpid_m1.ypid<-8388607) vpid_m1.ypid= -8388607; else if (vpid_m1.ypid>8388607) vpid_m1.ypid=8388607; vpid_m1.b[0]=vpid_m1.b[1]; vpid_m1.b[1]=vpid_m1.b[2]; ypwm_m1= vpid_m1.i[0]; u1_m1 = u0_m1; saturated_m1 = 0; if (ypwm_m1 > 0) ypwm_m1=ypwm_m1+500; else if (ypwm_m1 < 0) ypwm_m1=ypwm_m1-500; if(ypwm_m1 > 1000) { ypwm_m1 = 1000; saturated_m1 = 1; } else if(ypwm_m1 < -1000) { ypwm_m1 = -1000; saturated_m1 = 1; } if (ypwm_m1 >0) { output_high(PIN_B2); output_low(PIN_B1); } else if (ypwm_m1 <0) { output_high(PIN_B1); output_low(PIN_B2); ypwm_m1=-ypwm_m1; } set_pwm1_duty(ypwm_m1); }

Pode-se observar tambm um trecho desta funo onde a varivel ypwm_m1 incrementada ou decrementada de um fator de 500. Isto se deve ao fato de que, durante a execuo do projeto, foi verificado que os motores possuem uma zona morta e no conseguem se mover, ficando frouxos, at que esta varivel esteja em torno de

21 500. Deste modo, foi necessrio introduzir este offset para o melhor funcionamento dos motores. Como se pode observar na parte final do cdigo, quando a varivel ypwm_m1 maior que zero, o motor m1 gira em uma direo (direo de incremento do encoder). Quando ypwm_m1 menor que zero, o motor gira na direo contrria (direo de decremento do encoder). necessrio tambm ler as posies dos encoders dos motores, e para isto as funes zera_hctl(), zera_hctl2(), le_hctl() e le_hctl2() foram elaboradas. Toda vez que o programa iniciado as funes zera_hctl() e zera_hctl2() so executadas para que os valores dos encoders dos motores sejam iniciados com zero. O cdigo da funo zera_hctl() apresentado abaixo.
void zera_hctl() { // coloca oe do hctl2016 em 1 output_high(PIN_A1); // coloca SEL do hctl2016 em 0 output_low(PIN_A0); // coloca Reset do hctl2016 em 1 output_high(PIN_A2); output_low(PIN_A2); delay_us(1); output_high(PIN_A2); p_atual_m1=0; }

Durante o programa preciso atualizar as posies dos motores, e as funes le_hctl() e le_hctl2() tm tal objetivo. Abaixo pode-se ver o cdigo da funo le_hctl().
void le_hctl() { signed long int p_at1; // para inibir atualizao SEL=0 e OE=0 por mais de 1 tclk output_low(PIN_A1); delay_us(2); // portd tem o high byte // SEL j zero, coloca OE em 0

22
p_at1=input_D(); output_high(PIN_A0); //SEL=1 low byte delay_us(1); p_at1=(p_at1<<8) + input_D(); p_atual_m1=p_at1; output_high(PIN_A1); //volta OE para 1 delay_us(1); output_low(PIN_A0); } // volta SEL para 0

A funo rs232_envia() responsvel pelo envio das posies atuais dos motores via porta serial, para o PC e sua rotina apresentada abaixo. Seu cdigo mostrado abaixo.
void rs232_envia() { le_hctl(); printf("%Ld\n\r", p_atual_m1); le_hctl2(); printf("%Ld\n\r", p_atual_m2); }

3.2.1 Mudando os parmetros do PID Foi criada uma rotina para fazer o ajuste dos parmetros do PID enquanto o circuito estivesse ligado, para evitar que o PIC fosse regravado toda vez que um parmetro fosse mudado. Esta rotina foi implementada dentro da interrupo da porta serial, que ser apresentada mais frente. O cdigo desta rotina est apresentado logo abaixo.
if (dados[x] == 0x2b) { x = 0; a = a*10; } if (dados[x] == 0x2d) { x = 0; a = a/10; } if (dados[x] == 0x61) { x = 0; kp_m1 = kp_m1+a; kp_m2 = kp_m2+a;

23
} if (dados[x] == 0x62) { x = 0; kp_m1 = kp_m1-a; kp_m2 = kp_m2-a; } if (dados[x] == 0x63) { x = 0; ki_m1 = ki_m1+a; ki_m2 = ki_m2+a; } if (dados[x] == 0x64) { x = 0; ki_m1 = ki_m2-a; ki_m2 = ki_m2-a; } if (dados[x] == 0x65) { x = 0; kd_m1 = kd_m1+a; kd_m2 = kd_m2+a; } if (dados[x] == 0x66) { x = 0; kd_m1 = kd_m1-a; kd_m2 = kd_m2-a; }

O ajuste feito somando ou subtraindo um valor mltiplo de dez, que definido pressionando as teclas + para multiplicar o valor por dez, e - para dividir este valor por dez. Com este valor correto, o prximo passo ajustar o parmetro do PID. O parmetro proporcional incrementado pressionando-se a tecla a, e decrementado pressionando-se a tecla b. Analogamente, o parmetro integral incrementado ou decrementado pressionando-se as teclas c e d, respectivamente. Por fim, o parmetro derivativo utiliza as teclas e e f para incrementar ou decrementar seu valor. Todos os comandos esto resumidos mais frente. Vale lembrar que nesta rotina os parmetros dos dois motores so ajustados ao mesmo tempo. Para o ajuste neste projeto, foi desconectado um motor e feito o ajuste para o outro motor que permaneceu conectado.

24 3.2.2 As interrupes As principais funes deste programa so executadas atravs das interrupes de Timer 0 e de recepo pela porta serial.

3.2.2.1 A interrupo de Timer 0 Esta interrupo sempre acontece quando o contador Timer 0 estoura, ou seja, sempre que ele passar de 0xFF para 0x00. A cada estouro deste contador a varivel conta incrementada. No momento em que a varivel conta chega a 5, as funes le_hctl(), le_hctl2(), pid_m1() e pid_m2() so executadas, e a varivel conta zerada, recomeando o ciclo. Cada ciclo dura aproximadamente 10ms e seu cdigo apresentado abaixo.
#int_timer0 void contador() { conta++; if (conta == 5) { le_hctl(); le_hctl2(); pid_m1(); pid_m2(); conta=0; } }

3.2.2.2 A interrupo de recepo pela porta serial Esta interrupo acontece quando um dado recebido pela porta serial. Este projeto foi concebido com duas formas de receber dados, por caracteres digitados no teclado ou por envio dos dados atravs de um programa em Assembly. Estes dados recebidos pelo software so analisados e, se o primeiro caractere recebido for o caractere r, o programa reconhece a entrada de dados pelo teclado e espera receber mais 6 caracteres. O prximo caractere a escolha do motor a ser acionado e os ltimos 5 caracteres, em forma de dgitos, definem a posio que o motor dever alcanar.

25 Se o primeiro caractere recebido for s, o envio de dados est sendo feito atravs de um programa em Assembly, e assim o software do PIC saber que deve aguardar mais 3 bytes, com o primeiro definindo qual motor ser acionado e os dois ltimos, em formato decimal, a posio desejada para o motor. O programa completo se encontra no apndice A.

3.3 Resumo dos comandos Na tabela abaixo possvel ver o resumo de todos os comandos aplicados ao circuito controlador.

Caractere enviado r

Comando realizado pelo circuito


Indica o recebimento de dados pelo teclado, aguarda a escolha do motor (1 escolhe o motor 1 e 2 escolhe o motor 2) e em seguida aguarda a posio desejada (atravs de cinco caracteres numricos) Indica o recebimento de dados pelo programa em Assembly, aguarda a escolha do

s a b c d e f + -

motor (1 escolhe o motor 1 e 2 escolhe o motor 2) e em seguida aguarda a posio desejada (atravs de dois bytes) Incrementa o termo proporcional dos motores de um fator a Decrementa o termo proporcional dos motores de um fator a Incrementa o termo integral dos motores de um fator a Decrementa o termo integral dos motores de um fator a Incrementa o termo derivativo dos motores de um fator a Decrementa o termo derivativo dos motores de um fator a Multiplica o fator a por 10 Divide o fator a por 10 Tabela 1 - Comandos implementados no projeto.

3.4 Comandos interessantes Para aplicaes futuras, alguns comandos podem ser implementados ou melhorados conforme a aplicao que se desejar. Um destes melhoramentos seria a possibilidade de ajustar os parmetros do PID independentemente para cada motor,

26 sem a necessidade de desconectar um motor. Isto pode ser feito facilmente mudando a respectiva rotina sem grandes problemas. Uma nova implementao a utilizao da pena da plotter, acionando o rel para levantar ou abaixar a pena, j que toda conexo existe na plotter e de fcil manuseio. Este comando no foi implementado neste projeto porqu no foi possvel acionar o rel. Fica a idia para projetos futuros.

27

4 RESULTADOS OBTIDOS
Foram realizados alguns testes e colhidos valores para anlise dos erros, overshoots, que esto apresentados nas tabelas a seguir, para cada motor.

Pos. Atual M1 0 4000 7000 15000 5000 3000 2502

Pos. Ref. M1 4000 7000 15000 5000 3000 2500 0

Pos. Final M1 4000 7000 15000 5000 3000 2502 1

Erro 0 0 0 0 0 2 1

Overshoot 0 7015 15200 4930 3005 2470 -20

Tabela 2 - Resultados para o Motor 1, que puxa o papel.

Pos. Atual M2 0 4005 7003 15002 5000 2998 2495

Pos. Ref. M2 4000 7000 15000 5000 3000 2500 0

Pos. Final M2 4005 7003 15002 5000 2998 2495 -1

Erro 5 3 2 0 -2 -5 -1

Overshoot 4009 7004 15003 4996 2998 2494 -1

Tabela 3 - Resultados para o Motor 2, que movimenta a pena.

28

5 CONSIDERAES FINAIS
O universo de aplicaes dos microcontroladores est em grande expanso, sendo que a maior parcela dessas aplicaes em sistemas embutidos. A expresso sistema embutido se refere ao fato do microcontrolador ser inserido nas aplicaes (produtos) e usado de forma exclusiva por elas. Neste projeto foi possvel construir um sistema de comunicao serial com um PC que possibilitou o acionamento e controle de motores de uma plotter gerenciados pelo microcontrolador. O objetivo do projeto foi alcanado, pois possvel controlar a posio dos motores da plotter, gerenciados pelo PIC. Estes motores se movimentam de forma independente, definida na programao do PIC, proporcionando curvas e diagonais mais precisas. Este projeto reuniu uma gama de conhecimentos adquiridos ao longo do curso de Engenharia Eltrica, dos quais podemos citar conhecimentos de eletrnica ao construir a placa, programao, ao elaborar o software, e controle, realizando um algoritmo PID para comandar de forma eficiente os motores. O projeto ultrapassou o cronograma previsto no anteprojeto j que a programao e teste exigiram um tempo maior de utilizao do PC que se liga plotter, e o mesmo teve de ser compartilhado com alunos que estavam elaborando outros trabalhos. Devido a problemas da plotter, como desgaste das peas, motores velhos, correias e roldanas danificadas, no foi possvel realizar o controle timo dos motores, ocorrendo um pequeno desvio algumas vezes quando os motores so acionados. Porm, isto no impediu a concluso do projeto de modo satisfatrio, e este equipamento est apto a fazer parte das experincias de laboratrio da disciplina Microprocessadores I, como proposto inicialmente.

29

APNDICE A
#include "C:\clp\teste_led.h" #include <stdlib.h> int conta; int x = 0; int a = 1; char dados[7],posicao[6]; unsigned char saturated_m1, saturated_m2; signed long int // posicao atual p_atual_m1,p_atual_m2, // posicao desejada p_ref_m1,p_ref_m2; signed long int // current and previous position error u0_m1,u1_m1,u0_m2,u1_m2, // PID gain constants kp_m1,ki_m1,kd_m1,kp_m2,ki_m2,kd_m2, // duty cycle derivado do clculo do PID ypwm_m1,ypwm_m2,pwm1,pwm2; signed int32 integral_m1,integral_m2; //********************************// // PID // //********************************// union { signed int32 ypid; signed long int i[2]; // PID error accumulation // indica que sada do PID esta saturada

30
char b[4]; } vpid_m1; void pid_m1() { u0_m1 = (signed long int)(p_ref_m1)-p_atual_m1; u0. // Calculate proportional term of PID vpid_m1.ypid = (signed int32)kp_m1 * u0_m1; if (!saturated_m1) { integral_m1 +=(signed int32)u0_m1; if (integral_m1 < -30000) integral_m1=-30000; else if (integral_m1 > 30000) integral_m1=30000; } vpid_m1.ypid+= (signed int32)ki_m1*integral_m1; vpid_m1.ypid+= (signed int32)kd_m1*(u0_m1-u1_m1); if (vpid_m1.ypid<-8388607) vpid_m1.ypid= -8388607; else if (vpid_m1.ypid>8388607) vpid_m1.ypid=8388607; // If PID result is positive limit result // to 24-bit value vpid_m1.b[0]=vpid_m1.b[1]; vpid_m1.b[1]=vpid_m1.b[2]; ypwm_m1= vpid_m1.i[0]; u1_m1 = u0_m1; // Save current error in u1 // Shift PID result right to get upper // 16 bits of 24-bit result in // Calculate integral term of PID // Calculate differential term of PID // If PID result is negative limit result // to 24-bit value // Bypass integration if saturated. // Put position error in // Used to hold result of the PID calculations.

31
saturated_m1 = 0; if (ypwm_m1 > 0) ypwm_m1=ypwm_m1+500; else if (ypwm_m1 < 0) ypwm_m1=ypwm_m1-500; if(ypwm_m1 > 1000) { ypwm_m1 = 1000; saturated_m1 = 1; } else if(ypwm_m1 < -1000) { ypwm_m1 = -1000; saturated_m1 = 1; } pwm1=ypwm_m1; if (ypwm_m1 >0) { output_high(PIN_B2); output_low(PIN_B1); } else if (ypwm_m1 <0) { output_high(PIN_B1); output_low(PIN_B2); ypwm_m1=-ypwm_m1; } set_pwm1_duty(ypwm_m1); } union { signed int32 ypid2; signed long int j[2]; char c[4]; } vpid_m2; // Used to hold result of the PID calculations. // Clear saturation flag

32
void pid_m2() { u0_m2 = (signed long int)(p_ref_m2)-p_atual_m2; u0. // Calculate proportional term of PID vpid_m2.ypid2 = (signed int32)kp_m2 * u0_m2; if (!saturated_m2) { integral_m2 +=(signed int32)u0_m2; if (integral_m2 < -256000) integral_m2=-256000; else if (integral_m2 > 256000) integral_m2=256000; } vpid_m2.ypid2+= (signed int32)ki_m2*integral_m2; vpid_m2.ypid2+= (signed int32)kd_m2*(u0_m2-u1_m2); PID if (vpid_m2.ypid2<-8388607) vpid_m2.ypid2= -8388607; else if (vpid_m2.ypid2>8388607) vpid_m2.ypid2= 8388607; // If PID result is positive limit result // to 24-bit value vpid_m2.c[0]=vpid_m2.c[1]; vpid_m2.c[1]=vpid_m2.c[2]; ypwm_m2= vpid_m2.j[0]; u1_m2 = u0_m2; saturated_m2 = 0; // Save current error in u1 // Clear saturation flag // Shift PID result right to get upper // 16 bits of 24-bit result in // If PID result is negative limit result // to 24-bit value // Calculate integral term of PID // Calculate differential term of // Bypass integration if saturated. // Put position error in

33
if(ypwm_m2 > 800) { ypwm_m2 = 800; saturated_m2 = 1; } else if(ypwm_m2 < -800) { ypwm_m2 = -800; saturated_m2 = 1; } pwm2=ypwm_m2; if (ypwm_m2 >0) { } else { output_high(PIN_B4); output_low(PIN_B5); ypwm_m2=-ypwm_m2; } set_pwm2_duty(ypwm_m2); } //********************************// // HCTL2016 // //********************************// void zera_hctl() { // coloca oe do hctl2016 em 1 output_high(PIN_A1); // coloca SEL do hctl2016 em 0 output_low(PIN_A0); // coloca Reset do hctl2016 em 1 output_high(PIN_A2); output_low(PIN_A2); delay_us(1); output_high(PIN_B5); output_low(PIN_B4);

34
output_high(PIN_A2); p_atual_m1=0; } void le_hctl() { signed long int p_at1; // para inibir atualizao SEL=0 e OE=0 por mais de 1 tclk output_low(PIN_A1); delay_us(2); // portd tem o high byte p_at1=input_D(); output_high(PIN_A0); delay_us(1); p_at1=(p_at1<<8) + input_D(); p_atual_m1=p_at1; output_high(PIN_A1); delay_us(1); output_low(PIN_A0); } void zera_hctl2() { // coloca oe do hctl2016-2 em 1 output_high(PIN_A4); // coloca SEL do hctl2016-2 em 0 output_low(PIN_A3); // coloca Reset do hctl2016 em 1 output_high(PIN_A2); output_low(PIN_A2); delay_us(1); output_high(PIN_A2); p_atual_m2=0; } void le_hctl2() { signed long int p_at2; // para inibir atualizao SEL=0 e OE=0 por mais de 1 tclk output_low(PIN_A4); delay_us(2); // portd tem o high byte // SEL j zero, coloca OE em 0 // volta SEL para 0 //volta OE para 1 //SEL=1 low byte // SEL j zero, coloca OE em 0

35
p_at2=input_D(); output_high(PIN_A3); delay_us(1); p_at2=(p_at2<<8) + input_D(); p_atual_m2=p_at2; output_high(PIN_A4); delay_us(1); output_low(PIN_A3); } //********************************// // Recebendo dados // //********************************// #INT_RDA void rs232_recebe() { dados[x] = getc(); if (dados[x] == 0x72) { x = 0; dados[0]=0x72; } if (dados[x] == 0x73) { x = 0; dados[0]=0x73; } if (dados[x] == 0x2b) { x = 0; a = a*10; } if (dados[x] == 0x2d) { x = 0; a = a/10; } if (dados[x] == 0x61) { x = 0; kp_m1 = kp_m1+a; kp_m2 = kp_m2+a; } if (dados[x] == 0x62) { x = 0; kp_m1 = kp_m1-a; kp_m2 = kp_m2-a; } // volta SEL para 0 //volta OE para 1 //SEL=1 low byte

36
if (dados[x] == 0x63) { x = 0; ki_m1 = ki_m1+a; ki_m2 = ki_m2+a; } if (dados[x] == 0x64) { x = 0; ki_m1 = ki_m2-a; ki_m2 = ki_m2-a; } if (dados[x] == 0x65) { x = 0; kd_m1 = kd_m1+a; kd_m2 = kd_m2+a; } if (dados[x] == 0x66) { x = 0; kd_m1 = kd_m1-a; kd_m2 = kd_m2-a; } // Recebendo dados do teclado if (dados[0] == 0x72) x++; if (x == 7) { x = 0; posicao[0]=dados[2]; posicao[1]=dados[3]; posicao[2]=dados[4]; posicao[3]=dados[5]; posicao[4]=dados[6]; posicao[5] = 0; if (dados[1] == 0x31) { p_ref_m1=atol(posicao); printf("1 %Ld\n\r", p_ref_m1); } else if (dados[1] == 0x32) { p_ref_m2=atol(posicao); printf("2 %Ld\n\r", p_ref_m2); }

37
else printf("Escolha incorreta do motor\n\r"); } // Recebendo dados do programa em Assembly if (dados[0] == 0x73) { x++; if (x == 4) { x = 0; if (dados[1] == 0x31) { p_ref_m1=dados[2]; p_ref_m1=(p_ref_m1<<8) + dados[3]; } else if (dados[1] == 0x32) { p_ref_m2=dados[2]; p_ref_m2=(p_ref_m2<<8) + dados[3]; } else printf("Escolha incorreta do motor\n\r"); } } if (input(PIN_B7)) output_low(PIN_B7); // desliga led else output_high(PIN_B7); } //********************************// // Enviando dados // //********************************// void rs232_envia() { le_hctl(); printf("%Ld\n\r", p_atual_m1); le_hctl2(); printf("%Ld\n\r", p_atual_m2); }

38
#int_timer0 void contador() { conta++; if (conta == 5) { le_hctl(); le_hctl2(); pid_m1(); pid_m2(); conta=0; } } //********************************// // Programa principal // //********************************// void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_1, 255,1); SET_TRIS_A( 0xe0 ); SET_TRIS_B( 0x00 ); SET_TRIS_D( 0xff ); setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER0); zera_hctl(); zera_hctl2(); putc(0x0c);

39
printf("Projeto de Graduao\n\r"); printf("Aluno Sergio Pazzini da Silva Matos\n\r"); printf("\n\r");

u1_m1=0; u1_m2=0; saturated_m1=0; saturated_m2=0; integral_m1=0; integral_m2=0; // Ganhos do PID kp_m1=200; kp_m2=200; ki_m1=7; ki_m2=7; kd_m1=300; kd_m2=300; conta=0; p_ref_m1=0; p_ref_m2=0; while (true) { rs232_envia(); delay_ms(500); } }

40

REFERNCIAS BIBLIOGRFICAS
[1] DORF, Richard G.; BISHOP, Robert H. Sistemas de Controle Modernos. 8 ed. Rio de Janeiro: LTC Livros Tcnicos e Cientficos, Editora SA, 2001; [2] PEREIRA, Fbio. Microcontroladores PIC - Programao em C. 4 ed. So Paulo: Editora rica LTDA, 2005; [3] SOUZA, David Jos de; LAVINIA, Nicols Csar. Conectando o PIC. 2 ed. So Paulo: Editora rica LTDA, 2005; [4] Datasheet do microcontrolador PIC 16F87X Disponvel: http://www.microchip.com [capturado em 26/03/2006]; [5] Datasheet do chip HCTL2016 Disponvel: http://pdf1.alldatasheet.com/datasheetpdf/view/64648/HP/HCTL-2016.html? [capturado em 26/03/2006]; [6] Datasheet do chip MAX232 Disponvel: http://www.alldatasheet.com/datasheetpdf/pdf/27224/TI/MAX232.html [capturado em 26/03/2006]; [7] Datasheet do chip L298 Disponvel: http://www.alldatasheet.com/datasheet-

pdf/pdf/22437/STMICROELECTRONICS/L298.html [capturado em 26/03/2006]; [8] Curso de Linguagem C da Universidade Federal de Minas Gerais, Apostila; [9] Notas de aula sobre a Linguagem Assembly; [10] http://www.microchipc.com [acessado em 30/03/2006]; [11] http://pt.wikipedia.org/wiki/Plotter [acessado em 20/01/2006]; [12] http://pt.wikipedia.org/wiki/Microcontrolador [acessado em 01/02/2007].

Você também pode gostar