Escolar Documentos
Profissional Documentos
Cultura Documentos
CENTRO TECNOLÓGICO
DEPARTAMENTO DE ENGENHARIA ELÉTRICA
PROJETO DE GRADUAÇÃO
VITÓRIA – ES
FEVEREIRO/2007
SERGIO PAZZINI DA SILVA MATOS
VITÓRIA – ES
FEVEREIRO/2007
SERGIO PAZZINI DA SILVA MATOS
COMISSÃO EXAMINADORA:
___________________________________
Prof. Dr. Paulo Faria Santos Amaral
Orientador
___________________________________
Prof. Dr. Teodiano Freire Bastos Filho
Examinador
___________________________________
Eng. Rodrigo Thompson Vargas
Examinador
i
AGRADECIMENTOS
ii
LISTA DE FIGURAS
iii
LISTA DE TABELA
iv
SUMÁRIO
DEDICATÓRIA........................................................................................................... I
AGRADECIMENTOS .............................................................................................. II
LISTA DE FIGURAS ............................................................................................... III
LISTA DE TABELA ................................................................................................ IV
SUMÁRIO ................................................................................................................... V
RESUMO ................................................................................................................... VI
INTRODUÇÃO ............................................................................................................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 PROGRAMAÇÃO .....................................................................................19
3.1 Programando o PIC ...........................................................................................19
3.2 Funcionamento do programa ............................................................................19
3.2.1 Mudando os parâmetros do PID..............................................................22
3.2.2 As interrupções ........................................................................................24
3.2.2.1 A interrupção de Timer 0 ...........................................................24
3.2.2.2 A interrupção de recepção pela porta serial ...............................24
3.3 Resumo dos comandos ......................................................................................25
3.4 Comandos interessantes ....................................................................................25
4 RESULTADOS OBTIDOS............................................................................27
5 CONSIDERAÇÕES FINAIS.........................................................................28
APÊNDICE A .............................................................................................................29
REFERÊNCIAS BIBLIOGRÁFICAS.....................................................................40
v
RESUMO
vi
7
INTRODUÇÃO
Motores
Comunicação
Serial
Placa
microcontrolada
Relé
controlador PID para estes motores que também terão codificadores óticos de posição
visando um controle de malha fechada. E o diagrama de blocos do sistema é
apresentado na figura 2.
1 OS ELEMENTOS DO PROJETO
1.1 O Microcontrolador
Um microcontrolador é uma espécie de microprocessador programável, em um
chip otimizado para controlar dispositivos eletrônicos. Possui memória e interface de
entradas e saídas E/S(I/O) integrados, enfatizando a auto-suficiência, em contraste com
um microprocessador de propósito geral, o mesmo tipo usado nos PCs, que requer
chips adicionais para prover as funções necessárias.
Estes equipamentos são conhecidos como Sistemas Embutidos, do inglês
Embedded System, pois o microcontrolador é embutido dentro de um sistema fechado
e com funções bem específicas. Em geral, estes sistemas exigem um controle preciso
do tempo, pois trabalham em tempo real. A capacidade de processamento e de
memória variam de acordo com a aplicação, podendo ser um simples relógio ou um
equipamento industrial complexo que envolve até uma camada de sistema operacional
executando sobre o microcontrolador.
Os microcontroladores são componentes utilizados em muitos tipos de
equipamentos eletrônicos, sendo a grande maioria entre os chips vendidos. Cerca de
50% são controladores "simples", outros 20% são processadores de sinais digitais
(DSPs) mais especializados. Os microcontroladores podem ser encontrados em
máquinas de lavar, forno de microondas, telefones, etc [12].
As principais vantagens dos microcontroladores são:
• Baixo custo e consumo;
• Portátil;
• Poucos componentes (elimina necessidade de componentes externos);
• Reconfiguração por software;
• Curto tempo para desenvolvimento (time-to-make).
Os PIC (PICmicro) são uma família de microcontroladores fabricados pela
Microchip Technology, que processam dados de 8 bits (recentemente foi lançada uma
família de 16 bits com prefixo 24F) com extensa variedade de modelos e periféricos
internos, com arquitetura Harvard e conjunto de instruções RISC (conjuntos de 35
10
1.2 A Plotter
É o objeto principal deste trabalho. A plotter HP Draft Pro modelo 7570A se
encontra no laboratório de microprocessadores da Universidade Federal do Espírito
Santo.
11
2 O CIRCUITO DO CONTROLADOR
2.1 O PIC
O PIC é o elemento principal do circuito. A comunicação entre o PC e o PIC é
feita por um programa escrito em PICC e gravado na memória do PIC. Este programa
é chamado firmware, e recebe os dados enviados pelo PC através 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.
São utilizados os dois pinos de CCP no modo PWM para a movimentação dos
motores através da ponte H (chip L298). Para que estes pinos funcionem corretamente,
é preciso que o timer 2 seja configurado, definindo a freqüência do sinal PWM [2].
A ponte H é acionada pelos pinos RB1, RB2, RB4 e RB5 do PIC que fazem a
função de comandar o sentido de giro dos motores. E os pinos CCP (RC1 e RC2)
ligados aos pinos de Enable da ponte irão funcionar como reguladores de velocidade
com a qual os motores irão 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
através da sua porta paralela, que correspondem aos pinos RD0, RD1, RD2, RD3,
RD4, RD5, RD6 e RD7.
16
Figura 8 - HCTL2016.
17
2.4 O L298
O circuito integrado L298, apresentado na figura 10, é um driver duplo de alta
tensão e alta corrente projetado para aceitar níveis lógicos TTL e comandar cargas
indutivas como relés, solenóides, 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 tensão proporcional à corrente drenada por cada
ponte. Devido a sua alta corrente, o chip foi montado sobre um dissipador térmico,
para evitar aquecimento excessivo [7].
18
Figura 10 - O L298.
3 A PROGRAMAÇÃO
500. Deste modo, foi necessário introduzir este offset para o melhor funcionamento
dos motores.
Como se pode observar na parte final do código, quando a variável ypwm_m1
é maior que zero, o motor m1 gira em uma direção (direção de incremento do
encoder). Quando ypwm_m1 é menor que zero, o motor gira na direção contrária
(direção de decremento do encoder).
É necessário também ler as posições dos encoders dos motores, e para isto as
funções zera_hctl(), zera_hctl2(), le_hctl() e le_hctl2() foram elaboradas. Toda vez
que o programa é iniciado as funções zera_hctl() e zera_hctl2() são executadas para
que os valores dos encoders dos motores sejam iniciados com zero. O código da
função 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;
}
3.2.2 As interrupções
As principais funções deste programa são executadas através das interrupções
de Timer 0 e de recepção pela porta serial.
Se o primeiro caractere recebido for “s”, o envio de dados está sendo feito
através 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 posição desejada para o motor. O programa completo
se encontra no apêndice A.
sem a necessidade de desconectar um motor. Isto pode ser feito facilmente mudando a
respectiva rotina sem grandes problemas.
Uma nova implementação é a utilização da pena da plotter, acionando o relé
para levantar ou abaixar a pena, já que toda conexão existe na plotter e é de fácil
manuseio. Este comando não foi implementado neste projeto porquê não foi possível
acionar o relé. Fica a idéia para projetos futuros.
27
4 RESULTADOS OBTIDOS
Foram realizados alguns testes e colhidos valores para análise dos erros,
overshoots, que estão apresentados nas tabelas a seguir, para cada motor.
5 CONSIDERAÇÕES FINAIS
APÊNDICE 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; // indica que saída do PID esta saturada
// posicao desejada
p_ref_m1,p_ref_m2;
//********************************//
// PID //
//********************************//
union
{
signed int32 ypid;
signed long int i[2];
30
char b[4];
} vpid_m1; // Used to hold result of the PID calculations.
void pid_m1()
{
u0_m1 = (signed long int)(p_ref_m1)-p_atual_m1; // Put position error in
u0.
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.
32
void pid_m2()
{
u0_m2 = (signed long int)(p_ref_m2)-p_atual_m2; // Put position error in
u0.
pwm2=ypwm_m2;
if (ypwm_m2 >0)
{ output_high(PIN_B5);
output_low(PIN_B4);
}
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);
34
output_high(PIN_A2);
p_atual_m1=0;
}
void le_hctl()
{
signed long int p_at1;
// para inibir atualização SEL=0 e OE=0 por mais de 1 tclk
output_low(PIN_A1); // SEL já é zero, coloca OE em 0
delay_us(2);
// portd tem o high byte
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
}
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 atualização SEL=0 e OE=0 por mais de 1 tclk
output_low(PIN_A4); // SEL já é zero, coloca OE em 0
delay_us(2);
// portd tem o high byte
35
p_at2=input_D();
output_high(PIN_A3); //SEL=1 low byte
delay_us(1);
p_at2=(p_at2<<8) + input_D();
p_atual_m2=p_at2;
output_high(PIN_A4); //volta OE para 1
delay_us(1);
output_low(PIN_A3); // volta SEL para 0
}
//********************************//
// 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;
}
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;
}
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 Graduação\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
REFERÊNCIAS BIBLIOGRÁFICAS
[1] DORF, Richard G.; BISHOP, Robert H. Sistemas de Controle Modernos. 8ª ed. Rio de
Janeiro: LTC – Livros Técnicos e Científicos, Editora SA, 2001;
[3] SOUZA, David José de; LAVINIA, Nicolás César. Conectando o PIC. 2ª ed. São Paulo:
Editora Érica LTDA, 2005;