Escolar Documentos
Profissional Documentos
Cultura Documentos
CENTRO TECNOLÓGICO
DEPARTAMENTO DE ENGENHARIA ELÉTRICA
PROJETO DE GRADUAÇÃO
VITÓRIA – ES
02/2007
PAULO FRANKLIM MAIA RASKIM FERRUA
VITÓRIA – ES
02/2007
PAULO FRANKLIM MAIA RASKIM FERRUA
COMISSÃO EXAMINADORA:
___________________________________
Prof. Dr. Paulo Farias Santos Amaral
Orientador
___________________________________
Prof. Dra. Raquel FrizeraVassallo
Examinadora
___________________________________
Prof. Dr. Alessandro Mattedi
Examinador
i
AGRADECIMENTOS
ii
LISTA DE FIGURAS
iii
LISTA DE TABELA
iv
GLOSSÁRIO
CLP Controlador Lógico Programável
EEPROM Electrically-Erasable Programmable Read-Only Memory
PLC Programmable Logic Controller.
PID Proporcional-Integral-Derivativo
PWM Pulse Width Modulation ou Modulação por Largura de Pulso
v
SUMÁRIO
DEDICATÓRIA........................................................................................................... I
AGRADECIMENTOS .............................................................................................. II
LISTA DE FIGURAS ............................................................................................... III
LISTA DE TABELA ................................................................................................ IV
GLOSSÁRIO ............................................................................................................... V
RESUMO ................................................................................................................ VIII
1 INTRODUÇÃO ................................................................................................9
1.1 Ferramentas Utilizadas......................................................................................10
1.1.1 Compilador C CCS ..................................................................................10
1.1.2 MPLAB ...................................................................................................11
1.1.3 Eagle ........................................................................................................11
2 CONTROLADOR LÓGICO PROGRAMÁVEL .......................................13
2.1 Funcionamento do CLP ....................................................................................14
2.2 Programação do CLP ........................................................................................15
2.2.1 Linguagem LADDER ou Diagrama de Relés .........................................16
3 DESENVOLVIMENTO DO HARDWARE ................................................18
3.1 Microcontroladores PIC ....................................................................................18
3.1.1 Características do PIC 16F877 ................................................................18
3.2 Definições .........................................................................................................19
3.3 Entradas Digitais ...............................................................................................19
3.4 Saídas Digitais ..................................................................................................20
3.5 Entradas Analógicas..........................................................................................21
3.6 Saídas Analógicas .............................................................................................22
3.7 A Fonte de Alimentação ...................................................................................23
3.8 Display LCD .....................................................................................................23
3.9 Botões................................................................................................................24
3.10 Comunicação Serial ........................................................................................24
4 DESENVOLVIMENTO DO PROGRAMA RESIDENTE ........................25
4.1 Cabeçalho ..........................................................................................................25
vi
4.2 Instruções ..........................................................................................................26
4.3 Variáveis ...........................................................................................................27
4.4 Programação do PIC .........................................................................................29
4.4.1 Entradas e Saídas Digitais .......................................................................29
4.4.2 Entradas Analógicas ................................................................................30
4.4.3 Controle do PWM ...................................................................................31
4.4.4 Interrupções .............................................................................................31
4.4.5 Cronômetros (Timers) .............................................................................32
4.5 Rotinas ..............................................................................................................32
4.5.1 Rotina Principal .......................................................................................33
4.5.2 Carregamento do Ladder .........................................................................35
4.5.3 Função AND() .........................................................................................37
4.6 Monitorando o programa pela porta serial ........................................................37
5 TESTES E RESULTADOS ...........................................................................38
6 CONCLUSÕES ..............................................................................................43
APÊNDICE A – CIRCUITO PRINCIPAL .............................................................44
APÊNDICE B – CIRCUITO COMPLETO DE ENTRADAS DIGITAIS ...........45
APÊNDICE C – CIRCUITO COMPLETO DE SAÍDAS DIGITAIS ..................46
APÊNDICE D – CIRCUITO COMPLETO DE ENTRADAS ANALÓGICAS ..47
APÊNDICE E – CIRCUITO COMPLETO DE SAÍDAS ANALÓGICAS .........48
REFERÊNCIAS BIBLIOGRÁFICAS.....................................................................61
vii
RESUMO
Este trabalho apresenta o estudo e o desenvolvimento de um micro PLC em
um microcontrolador da família PIC da empresa Microchip.
Para tal foi necessário estudar os PLCs do mercado, analisando suas
características e aplicações principais. As funcionalidades dos Micro-PLCs atuais
também foram observadas. A seguir estudou-se profundamente as características do
PIC 16F877, escolhido para desempenhar a função de micro PLC, a fim de adequar as
funções a serem implementadas.
De posse deste conhecimento foi possível projetar a interface de entradas e
saídas do Micro-PLC.
O micro PLC também é composto por um software capaz de executar um
programa específico de controle. Para o desenvolvimento desse software nativo no
PIC, algo como um mini-sistema operacional, estudou-se a linguagem de programação
C.
viii
9
1 INTRODUÇÃO
1.1.2 MPLAB
O MPLAB é um programa que tem a função de um gerenciador, para o
desenvolvimento de projetos com a família PIC de microcontroladores. É distribuído
gratuitamente pela Microchip, fabricante dos PICs.
O MPLAB integra num único ambiente o editor de programa fonte, o
compilador, o simulador e quando conectado às ferramentas da Microchip também
integra o gravador do PIC, o emulador etc.
O Programa fonte, ou simplesmente fonte do programa é uma seqüência em
texto, escrita numa linguagem de programação que será convertida em códigos de
máquina para ser gravado no PIC.
O Compilador é o programa que converte o fonte em códigos de máquina.
O Simulador é o programa que simula o funcionamento da CPU (PIC),
conforme o programa fonte que está sendo desenvolvido.
O Projeto no MPLAB é um conjunto de arquivos e informações que diz ao
ambiente integrado qual o PIC que estamos usando, qual freqüência de clock, qual a
linguagem de programação usada, qual o layout das janelas etc. Enfim o projeto é o
nosso trabalho de uma forma global. E para ele guardar todas essas informações basta
salvar e fechar só o projeto, sem se preocupar em fechar todas as janelas abertas no
ambiente integrado [4].
É importante lembrar que o MPLAB se integra ao ambiente Windows,
permitindo cópia de arquivos, de textos de um aplicativo para outro de uma forma bem
simplificada.
1.1.3 Eagle
Este software é utilizado para desenhar circuitos impressos e esquemas
eletrônicos. Eagle é a sigla para Easily Applicable Graphical Layout Editor.
Os componentes são arranjados manualmente na placa, com a ajuda das linhas
coloridas que mostram as conexões eventuais entre os pinos que são requeridos pelo
diagrama esquemático, isto ajuda a encontrar uma colocação que permita a disposição
mais eficiente das trilhas [7].
12
Figura 3 Diagrama lógico (esquerda) e programa ladder (direita) para o acionamento de um motor.
18
3 DESENVOLVIMENTO DO HARDWARE
3.2 Definições
A definição de um hardware básico é o ponto principal do projeto, pois a partir
desse ponto foi possível determinar as funções de cada pino do PIC16F877 e o fluxo
de dados do CLP.
Características:
• 8 entradas digitais
• 8 saídas digitais
• 3 entradas analógicas
• 2 saídas PWM
• 1 display LCD com 2 linhas e 16 colunas
• 4 botões
• 0 a 5V
• 0 a 10V
• 4 a 20mA
Para entrada de 0 a 10V, deve-se colocar o jumper JP2 na posição 1-2 e o
jumper JP1 na posição 5-3.
Para entrada de 0 a 5V, deve-se colocar o jumper JP2 na posição 1-2 e o
jumper JP1 na posição 1-3.
Para entrada de 4 a 20mA, deve-se colocar o jumper JP2 na posição 2-3 e o
jumper JP1 na posição 6-4.
3.9 Botões
Os botões da parte frontal do Micro-CLP, Figura 14, estão ligados da seguinte
forma:
• Botão B1 ligado ao pino RE2
• Botão B3 ligado ao pino RE1
• Botão B5 ligado ao pino RE0
• Botão B8 ligado ao pino RB0
4.1 Cabeçalho
Para a manipulação das funções de controlador Proporcional-Integral-
Derivativo (PID), temporizadores, contadores e comparadores é necessário o envio de
algumas constantes específicas para cada função. São elas:
• SP1 e SP2 – Set Point, referência do PID1 e do PID2 respectivamente;
• KP1 e KP2 – Constantes de proporcionalidade;
• KI1 e KI2 – Constantes de integração;
• KD1 e KD2 – Constantes de derivação;
• K1 e K2 – Constantes de comparação;
26
4.2 Instruções
Para definir a possível quantidade de instruções é necessário determinar o
formato das instruções na palavra de 14 bits da memória de programa EEPROM. O
padrão escolhido é o seguinte:
Instruções Digitais
Bits de 13 a 8 – Código da instrução Bits 7 a 0 – Índice das variáveis
• AND_B()
• AND_NOT()
• OR()
• OUT()
• OUT_NOT()
• DISPLAY()
• END
Na Tabela 1 encontram-se a codificação de cada instrução.
4.3 Variáveis
De posse da quantidade de entradas e saídas passa-se a definir as variáveis
digitais e analógicas possíveis. A Tabela 2 mostra o mapeamento das variáveis que
serão gravadas na memória de dados EEPROM a partir do endereço 0x1C, que é o
endereço imediatamente após o cabeçalho de constantes.
A denominação das variáveis evidencia a separação dos tipos da seguinte
maneira:
• Iniciadas com ‘X’ – variáveis digitais de entrada física.
• Iniciadas com ‘Y’ – variáveis digitais de saída física.
• Iniciadas com ‘I’ – variáveis digitais internas.
• Iniciadas com ‘M’ – variáveis digitais de saída do comparador 1.
• Iniciadas com ‘N’ – variáveis digitais de saída do comparador 2.
28
Início
Inicialização
Leitura das
entradas;
Execução do Carregamento do
Programa Ladder Programa Ladder
Atualização das
saídas
Aguardando
Ladder Carregado
semelhante, ocorre para as outras portas. O bit menos significativo se refere ao pino 0
de A, B, C, D ou E. O valor binário 1 indica que o pino é configurado como entrada e
o valor 0 indica que o pino é configurado como saída. A função em CCS para setar a
direção estas portas é set_tris_d() para a porta D. Observa-se a utilização desta função
no trecho de código a seguir.
// Leitura do estado das entradas
int ler_entrada()
{
int ent;
set_tris_d(0xff);
output_low(PIN_C0);
ent=input_d();
output_high(PIN_C0);
return ent;
}
Os valores output de todos os pinos digitais podem ser mudados usando os
comandos seguintes simultaneamente:
output_b(0xFF); // fixa todos os pinos de saída de B em 1
4.4.4 Interrupções
Uma interrupção é um evento que força uma chamada a uma seqüência de
dados que normalmente é definida como rotina ou serviço de interrupção. Fontes
típicas de interrupções no PIC incluem uma transição positiva ou negativa na entrada
de RB.0/INT, uma mudança em quaisquer das entradas RB4 - RB7 ou a saturação
(overflow) de algum contador ou timer na mudança de valor de 0xFF(255) para 0x00
32
4.5 Rotinas
Nesta seção analisaremos algumas rotinas principais.
33
Depois de ler todas as entradas (X0 a X7), segue-se para o trecho em que
escolhe-se: carregar um novo programa Ladder ou ficar parado.
selecao = ~ler_botoes();
while ((bit_test(selecao,2)==1))
{
teste = bit_test(selecao,1);
switch (teste)
{
break;
case 1 : p2 = 0x1c00;
p1 = 0;
pc = 0;
x = 0;
carrega=0;
lcd_gotoxy(1,1);
printf(lcd_putc,"Carregar Ladder ");
printf("Carregar Ladder ");
carregar_ladder();
break;
default : selecao = ~ler_botoes();
teste2 = bit_test(selecao,3);
while (teste2==1)
{
lcd_gotoxy(1,1);
34
break;
}
selecao = ~ler_botoes();
}
codigo = read_program_eeprom(p2);
indice= codigo & 0b11111111;
num_funcao= codigo >> 8;
p2++;
lcd_gotoxy(1,1);
printf(lcd_putc,"Executando ");
printf("Executando ");
switch (num_funcao)
{
case 0b000000 : LD(indice);
printf(" LD %u", indice);
break;
case 0b000001 : LD_NOT(indice);
printf(" LD_NOT %u", indice);
break;
case 0b000010 : AND(indice);
printf(" AND %u", indice);
35
break;
case 0b000011 : AND_NOT(indice);
printf(" AND_NOT %u", indice);
break;
case 0b000100 : AND_B();
printf(" AND_B %u", indice);
break;
case 0b000101 : OR();
printf(" OR %u", indice);
break;
case 0b000110 : OUT(indice);
printf(" OUT %u", indice);
break;
case 0b000111 : OUT_NOT(indice);
printf(" OUT_NOT %u", indice);
break;
case 0b001000 : DISPLAY(indice);
break;
case 0b111111 : printf ("END OF FILE!");
p2 = 0x1c00;
atualizar_saida();
break;
default : lcd_gotoxy(1,2);
printf ("funcao nao implementada");
printf (lcd_putc,"funcao nao implementada");
break;
}
delay_ms(100);
que ou igual 27 significa que os dados que estão chegando pertencem ao cabeçalho,
logo são armazenados na memória de programa EEPROM.
Quando pc atinge 28, a cada dois bytes formam-se uma palavra que é gravada
na memória de programa, estas são as instruções Ladder .
void carregar_ladder()
{
while (carrega==0)
{
dados=getc();
if (pc>27)
{
dadosp[x]=dados;
x++;
if (x==2)
{
x=0;
cod_prog = dadosp[0];
cod_prog = (cod_prog<<8) +dadosp[1];
write_program_EEPROM (0x1c00 + p1,cod_prog);
if (cod_prog == 0xffff)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Ladder Carregado");
carrega=1;
}
p1++;
}
}
else
{
write_EEPROM( pc, dados );
pc++;
}
}
37
5 TESTES E RESULTADOS
Os testes feitos no Micro-CLP foram essenciais não apenas para este projeto
mas também para o projeto de desenvolvimento do ambiente de programação Ladder
elaborado pelo aluno Rogério Costa Pacheco Neto. Os testes foram realizados em
conjunto.
A aplicação utilizada foi o exemplo do controle de um portão eletrônico.
Para este exemplo utilizou-se, as seguintes considerações:
• Botão de comando para abrir o portão, porta X0.
• Botão de comando para fechar o portão, porta X1.
• Sensor de fim de curso portão aberto, na porta X2.
• Sensor de fim de curso portão fechado, na porta X3.
• Saída para motor, abrir o portão Y0.
• Saída para motor, fechar o portão Y1.
Gerando o diagrama Ladder visto na Figura 12.
Analisando o ladder temos, apertando o botão para abrir o portão (X0), e o
sensor de portão aberto (X2) não estando ativado, vai acionar a saída interna I00, que é
utilizada como selo para que ela só seja desligada quando ocorrer o fim de curso de
portão aberto, ou o botão de fechar (X1) seja acionado.
A saída interna I00 é passada para a saída física Y0 que indica que o motor
deve ser ligado para abrir o portão.
Caso o botão pressionado seja o de fechar o portão (X1), e sensor de portão
fechado (X3) não estando ativado, vai acionar a saída interna I01, que também será
utilizada como selo para que só seja desligada quando ocorrer o fim de curso de portão
fechado, ou o botão de abrir (X0) seja acionado.
A saída interna I01 é passada para a saída física Y1 que indica que o motor
deve ser ligado para fechar o portão.
39
6 CONCLUSÕES
#case
#include "clp.h"
#include "LCD.C"
#use delay(clock=20000000)
int i2;
long value, min, max;
struct botoes
{
short int b3;
short int b2;
short int b1;
short int b0;
} botao;
struct out_porta
{
short int y0;
short int y1;
short int y2;
short int y3;
short int y4;
50
// Saída
saida(int valor)
{
output_high(PIN_C0);
set_tris_d(0x00);
output_d(valor);
output_high(PIN_C3);
delay_us(1);
output_low(PIN_C3);
set_tris_d(0xFF);
}
botao.b2 = input(PIN_E1);
botao.b3 = input(PIN_E2);
entbot = botao;
return (entbot);
}
//----------LD()
//----------LD_NOT()
{
temp[pf] = ~read_eeprom(0x1C + endf);
printf("\n\rTEMP= %u", temp[pf]);
++pf;
}
//----------AND()
//----------AND_B()
void AND_B()
{
--pf;
temp[pf-1] = temp[pf-1] & temp[pf];
printf("\n\rTEMP= %u", temp[pf-1]);
}
//----------AND_NOT()
//----------OR()
53
void OR()
{
--pf;
temp[pf-1] = temp[pf-1] | temp[pf];
printf("\n\rTEMP= %u", temp[pf-1]);
}
//----------OUT()
//----------OUT_NOT()
//----------DISPLAY()
//----------Carregar Ladder
void carregar_ladder()
{
while (carrega==0)
{
dados=getc();
if (pc>27)
{
dadosp[x]=dados;
x++;
if (x==2)
{
x=0;
cod_prog = dadosp[0];
cod_prog = (cod_prog<<8) +dadosp[1];
write_program_eeprom (0x1c00 + p1,cod_prog);
if (cod_prog == 0xffff)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Ladder Carregado");
carrega=1;
teste=0;
delay_ms(1000);
}
p1++;
}
}
else
{
write_eeprom( pc, dados );
pc++;
}
}
}
55
//-----------------zera eeprom
void zera_eeprom()
{
while (i3<=55)
{
write_eeprom( 0x24+i3 , 0x00 );
i3++;
}
}
void atualizar_saida()
{
if (read_eeprom(0x24)==0xff) saida_porta.y0 = 1;
else saida_porta.y0 = 0;
if (read_eeprom(0x25)==0xff) saida_porta.y1 = 1;
else saida_porta.y1 = 0;
if (read_eeprom(0x26)==0xff) saida_porta.y2 = 1;
else saida_porta.y2 = 0;
if (read_eeprom(0x27)==0xff) saida_porta.y3 = 1;
else saida_porta.y3 = 0;
if (read_eeprom(0x28)==0xff) saida_porta.y4 = 1;
else saida_porta.y4 = 0;
if (read_eeprom(0x29)==0xff) saida_porta.y5 = 1;
else saida_porta.y5 = 0;
if (read_eeprom(0x2A)==0xff) saida_porta.y6 = 1;
else saida_porta.y6 = 0;
if (read_eeprom(0x2B)==0xff) saida_porta.y7 = 1;
else saida_porta.y7 = 0;
teste2=saida_porta;
saida (teste2);
printf (" \n\rSaida=%u ", teste2);
}
void main() {
56
rs232_errors=0;
set_tris_c(0xb0);
set_tris_a(0xFF);
set_tris_d(0xff);
set_tris_e(0xff);
setup_adc_ports( RA0_RA1_RA3_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,249,5);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_OFF);
lcd_init();
output_high(PIN_C0);
output_low(PIN_C3);
zera_eeprom();
putc(0x0c);
printf(lcd_putc,"\fMicroCLP");
printf("\fMicroCLP\n\r");
57
while (TRUE)
{
entradas = ler_entrada();
if ( bit_test(entradas,0)) write_eeprom( 0x1C, 0xff);
else write_eeprom( 0x1C, 0);
selecao = ~ler_botoes();
while ((bit_test(selecao,2)==1))
{
teste = bit_test(selecao,1);
switch (teste)
{
58
break;
case 1 : p2 = 0x1c00;
p1 = 0;
pc = 0;
x = 0;
carrega=0;
lcd_gotoxy(1,1);
printf(lcd_putc,"Carregar Ladder ");
printf("Carregar Ladder ");
carregar_ladder();
break;
default : selecao = ~ler_botoes();
teste2 = bit_test(selecao,3);
while (teste2==1)
{
lcd_gotoxy(1,1);
printf("\r Aguardando ");
printf(lcd_putc," Aguardando ");
delay_ms(200);
selecao = ~ler_botoes();
if ((bit_test(selecao,0)==1))
teste2 = 0;
}
break;
}
selecao = ~ler_botoes();
}
codigo = read_program_eeprom(p2);
indice= codigo & 0b11111111;
num_funcao= codigo >> 8;
p2++;
lcd_gotoxy(1,1);
printf(lcd_putc,"Executando ");
59
printf("Executando ");
switch (num_funcao)
{
case 0b000000 : LD(indice);
printf(" LD %u", indice);
break;
case 0b000001 : LD_NOT(indice);
printf(" LD_NOT %u", indice);
break;
case 0b000010 : AND(indice);
printf(" AND %u", indice);
break;
case 0b000011 : AND_NOT(indice);
printf(" AND_NOT %u", indice);
break;
case 0b000100 : AND_B();
printf(" AND_B %u", indice);
break;
case 0b000101 : OR();
printf(" OR %u", indice);
break;
case 0b000110 : OUT(indice);
printf(" OUT %u", indice);
break;
case 0b000111 : OUT_NOT(indice);
printf(" OUT_NOT %u", indice);
break;
case 0b001000 : DISPLAY(indice);
break;
case 0b111111 : printf ("END OF FILE!");
p2 = 0x1c00;
atualizar_saida();
break;
default : lcd_gotoxy(1,2);
printf ("funcao nao implementada");
60
delay_ms(100);
}
61
REFERÊNCIAS BIBLIOGRÁFICAS