Você está na página 1de 98

Murilo José de Carvalho

Controle Digital de Temperatura e Pressão em


Chuveiros Elétricos

Brasil
2014
Murilo José de Carvalho

Controle Digital de Temperatura e Pressão em


Chuveiros Elétricos

Monografia apresentada para obtenção do Tí-


tulo de Tecnólogo em Eletrônica Industrial pelo
Instituto Federal de Educação, Ciência e Tecno-
logia de São Paulo

Instituto Federal de São Paulo - IFSP


Tecnologia em Eletrônica Industrial

Orientador: Prof. Me. Sérgio Ricardo Pacheco


Coorientador: Prof. Me. Adilson de Souza Cândido

Brasil
2014
C331c Carvalho, Murilo José de
Controle digital de temperatura e pressão em chuveiros
elétricos / Murilo José de Carvalho. -- Bragança Paulista :
IFSP-BRA, 2014.
97f.

Monografia (Tecnólogo)– Instituto Federal de Educação,


Ciência e Tecnologia de São Paulo, Campus Bragança
Paulista, 2014.

1. Microcontrolador. 2. Chuveiros elétricos. 3. Controle


de temperatura. 4.Controle de pressão. 5. Controlador PID.
I. Título.

CDD 629.8
Murilo José de Carvalho

Controle Digital de Temperatura e Pressão em


Chuveiros Elétricos

Monografia apresentada para obtenção do Tí-


tulo de Tecnólogo em Eletrônica Industrial pelo
Instituto Federal de Educação, Ciência e Tecno-
logia de São Paulo

Trabalho aprovado. Brasil, 14 de novembro de 2014.

Prof. Me. Sérgio Ricardo Pacheco


Orientador

Prof. Me. Adilson de Souza Cândido


Coorientador

Prof. Dr. Luiz Fernando Tibaldi Kurahassi


Convidado 1

Prof. Me. Alexandre Tomazati Oliveira


Convidado 2

Brasil
2014
Este trabalho é dedicado à minha família,
que sempre apoiou meus estudos.
Agradecimentos

Em primeiro lugar a Deus pela realização deste trabalho.

Ao meu orientador, Prof. Me. Sérgio Ricardo Pacheco pela imensa ajuda, paciência e
empenho dispensados na montagem do projeto e na confecção da monografia.

Ao meu coorientador, Prof. Me. Adilson de Souza Cândido pelo apoio na criação do
algorítimo de controle PID.

Ao Prof. Dr. Luiz Fernando Tibaldi Kurahassi pela enorme ajuda no desenvolvimento
do circuito do potência.

Ao Prof. Me. Alexandre Tomazati Oliveira pelas solução de dúvidas na programação e


no funcionamento no microcontrolador.

Ao Prof. Cristiano de Oliveira e ao Prof. Frederico de Oliveira Simões pelo auxílio na


utilização da plataforma LATEX.

A todo pessoal da assistência técnica “Eletrônica América” pelo apoio fornecido.

Ao colega de curso Igor Anderson Carvalho de Lima pela doação de alguns componen-
tes eletrônicos utilizados na montagem do projeto.

A todos os colegas, amigos e familiares que tenham contribuído com apoio moral ou
material para a conclusão deste projeto.
“Ando devagar
Porque já tive pressa
E levo esse sorriso
Porque já chorei demais
Hoje me sinto mais forte
Mais feliz, quem sabe
Só levo a certeza
De que muito pouco sei
Ou nada sei
(Tocando em Frente, Almir Sater / Renato Teixeira)
Resumo
O principal objetivo deste trabalho está relacionado com o desenvolvimento de um circuito eletrônico
para o controle digital da pressão da água de entrada e da temperatura em chuveiros elétricos conven-
cionais. Com este propósito, foi utilizado um controlador Proporcional-Integral-Derivativo (controlador
PID) para regular a temperatura da água e um controlador em malha aberta para o ajuste da pressão. Os
resultados demonstraram a viabilidade da solução proposta.

Palavras-chaves: Microcontrolador. Chuveiros elétricos. Controle da Temperatura. Controle da Pressão.


Controlador PID.
Abstract
The main objective of this work is related to the development of an electronic circuit for digital con-
trol of the incoming water pressure and temperature in conventional electric showers. To this end, a
Proportional-Integral-Derivative controller (PID controller) was used to regulate the water temperature,
and an open-loop controller was used to adjust the pressure. The results proved the effectiveness of the
proposed solution.

Key-words: Microcontroller. Electric Shower. Temperature Control. Pressure Control. PID Controller.
Lista de ilustrações

Figura 1 – Diagrama de funcionamento simplificado . . . . . . . . . . . . . . . . . . . 18


Figura 2 – Diagrama de blocos do sistema de controle da temperatura. . . . . . . . . . 19
Figura 3 – Diagrama de blocos relacionado ao sistema de controle da pressão de entrada
da água. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Figura 4 – Exemplo de formas de onda de PWM (MUNIZ, 2009) . . . . . . . . . . . . 22
Figura 5 – Exemplo de controle de potência por ângulo de fase (MARTINS et al., 2010) 23
Figura 6 – Pinagem do PIC18F4550 (INC, 2006) . . . . . . . . . . . . . . . . . . . . 26
Figura 7 – Analogia com o processo de interrupção do PIC (MIYADAIRA, 2009) . . . 28
Figura 8 – Simbologia do TRIAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Figura 9 – Simbologia do fotoacoplador com fototransistor . . . . . . . . . . . . . . . 33
Figura 10 – Simbologia do fotoacoplador com fototriac . . . . . . . . . . . . . . . . . . 33
Figura 11 – Diagrama elétrico do circuito detector de passagem por zero . . . . . . . . . 35
Figura 12 – Representação do circuito de teste para a detecção da passagem por zero . . 35
Figura 13 – Medições do circuito detector de passagem por zero no osciloscópio . . . . 36
Figura 14 – Diagrama elétrico do circuito de interface com o usuário . . . . . . . . . . . 36
Figura 15 – Menu principal do LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Figura 16 – Menu de configuração de temperatura . . . . . . . . . . . . . . . . . . . . 38
Figura 17 – Menu de configuração de pressão . . . . . . . . . . . . . . . . . . . . . . . 39
Figura 18 – Menu de seleção de favoritos . . . . . . . . . . . . . . . . . . . . . . . . . 39
Figura 19 – Menu de gravação de favoritos . . . . . . . . . . . . . . . . . . . . . . . . 40
Figura 20 – Menu de ajuste do ganho Kp . . . . . . . . . . . . . . . . . . . . . . . . . 40
Figura 21 – Menu de ajuste do ganho Ki . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Figura 22 – Menu de ajuste do ganho Kd . . . . . . . . . . . . . . . . . . . . . . . . . 41
Figura 23 – Menu de ajuste do período do controlador na execução da rotina de controle
PID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Figura 24 – Kit de desenvolvimento (RADIO, 2013) . . . . . . . . . . . . . . . . . . . 42
Figura 25 – Circuito de leitura de temperatura . . . . . . . . . . . . . . . . . . . . . . . 46
Figura 26 – Gráfico da curva de resposta do NTC do protótipo . . . . . . . . . . . . . . 48
Figura 27 – Termômetro de resistência com bainha isoladora (MACIEL, 2012) . . . . . 55
Figura 28 – Circuito de potência montado . . . . . . . . . . . . . . . . . . . . . . . . . 56
Figura 29 – Teste do circuito de potência no osciloscópio . . . . . . . . . . . . . . . . . 57
Figura 30 – Kit didático da EXSTO○ R
XM118 (TECNOLOGIA, 2011) . . . . . . . . . . 58
Figura 31 – Circuito lógico montado em protoboard . . . . . . . . . . . . . . . . . . . 59
Figura 32 – Primeiro teste do circuito de potência . . . . . . . . . . . . . . . . . . . . . 60
Figura 33 – Teste do circuito de potência após correção na programação do PIC . . . . . 61
Figura 34 – Teste do controle do pressurizador com ventilador . . . . . . . . . . . . . . 61
Figura 35 – Teste do controle de temperatura com lâmpada . . . . . . . . . . . . . . . . 62
Figura 36 – Teste do controle de temperatura com chuveiro . . . . . . . . . . . . . . . . 63
Figura 37 – Circuito de disparo para TRIACs em ambientes extremamente ruidosos (FAIR-
CHILD, 2004) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Figura 38 – Curva de resposta do controle de temperatura . . . . . . . . . . . . . . . . 67
Figura 39 – Esquema elétrico completo do circuito lógico . . . . . . . . . . . . . . . . 89
Figura 40 – Esquema elétrico completo do circuito de potência . . . . . . . . . . . . . . 91
Figura 41 – Esquema elétrico completo do circuito detector de passagem por zero . . . . 93
Figura 42 – Esquema elétrico kit de desenvolvimento (RADIO, 2013) . . . . . . . . . . 96
Lista de tabelas

Tabela 1 – Pinagem do LCD de 16X2 (AGTECHNOLOGIES, 2013) . . . . . . . . . . 31


Tabela 2 – Curva de resposta do NTC do protótipo . . . . . . . . . . . . . . . . . . . . 48
Lista de abreviaturas e siglas

PID Proporcional, Integral e Derivativo

PIC Programmable Interface Controller

NTC Negative Temperature Coefficient ou termistor de coeficiente negativo

A/D Analógico/Digital

TRIAC Triode Alternating Current

LCD Liquid Crystal Display

PWM Pulse Width Modulation

DC Direct Current

SCR Silicon Controlled Rectifier

𝜇C Microcontrolador

MCU Microcontrolador

CPU Central Processing Unit

I/O Input/Output

LED Light Emitting Diode

CI Circuito Integrado

USB Universal Serial Bus

RISC Reduced Instruction Set Computer

PLL Phase Lock Loop

EEPROM Electrically Erasable Programmable Read Only Memory

CCP Capture/Compare/PWM

ECCP Enhanced Capture/Compare/PWM

SPI Serial Peripheral Interface

𝐼 2C Inter-Integrated Circuit
USART Universal Synchronous Asynchronous Receiver Transmitter

HLVD High/Low-Voltage Detect

WDT Watchdog Timer

ANSI American National Standards Institute

PC Personal Computer

PTC Positive Temperature Coefficient

ASCII American Standard Code for Information Interchange

RAM Random Access Memory

AWG American Wire Gauge

Byte Binary Term

Bit Binary Digit


Lista de símbolos

𝛼 Ângulo de disparo do TRIAC


o
Símbolo de grau

𝜔 Ângulo de disparo do tiristor em radianos

𝜋 Letra grega Pi minúsculo


∑︀
Símbolo de somatória

± Símbolo de mais ou menos

V Unidade de tensão elétrica

A Unidade de corrente elétrica

W Unidade de potência elétrica

Ω Unidade de resistência elétrica

Hz Unidade de frequência

Kp Ganho proporcional

Ki Ganho Integral

Kd Ganho derivativo
Sumário

1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2 Fundamentação Teórica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.1 Sistemas de Controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.1.1 Sistemas de Controle em Malha Fechada e Malha Aberta . . . . . . . . 20
2.1.2 Controlador PID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.1.3 Ganho Proporcional (Kp) . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.4 Ganho Integral (Ki) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.5 Ganho Derivativo (Kd) . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2 Pulse Width Modulation (PWM) . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3 Controle de Potência por Ângulo de Fase . . . . . . . . . . . . . . . . . . . . . 22
2.4 Filtros Eletrônicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.4.1 Circuito Snubber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.5 Principais Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5.1 Microcontroladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5.1.1 A Escolha do Microcontrolador para o Projeto . . . . . . . . 25
2.5.1.2 PIC18F4550 . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.1.3 Pinagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.1.4 Principais Características Elétricas do PIC18F4550 . . . . . . 26
2.5.1.5 Principais Recursos do Microcontrolador Utilizado no Projeto 27
2.5.1.6 Linguagem de Programação e Compilador . . . . . . . . . . 29
2.5.1.7 Kit de Desenvolvimento . . . . . . . . . . . . . . . . . . . . 29
2.5.2 Sensor de Temperatura . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.2.1 Termistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.5.3 Display de Cristal Líquido . . . . . . . . . . . . . . . . . . . . . . . . 30
2.5.3.1 Display de Cristal Líquido de 16X2 . . . . . . . . . . . . . . 31
2.5.4 TRIACS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.5 Fotoacopladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5.5.1 Fotoacoplador com Fototransistor . . . . . . . . . . . . . . . 33
2.5.5.2 Fotoacoplador com Fototriac . . . . . . . . . . . . . . . . . . 33

3 Metodologia de Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.1 Circuito Detector de Passagem por Zero (Zero-Crossing) . . . . . . . . . . . . 34
3.2 Interface com o Usuário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.1 Botões de Ajuste das Configurações . . . . . . . . . . . . . . . . . . . 37
3.2.2 Display de Cristal Líquido . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2.3 Menus do LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3 Microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.3.1 Leitura dos Sinais de Sincronização do Circuito de Zero-Crossing . . . 42
3.3.2 Temporização do PWM do Circuito de Potência . . . . . . . . . . . . . 43
3.3.3 Rotina de Monitoramento . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.3.4 Rotina de Ajuste de Temperatura . . . . . . . . . . . . . . . . . . . . . 45
3.3.5 Rotina de Ajuste de Pressão . . . . . . . . . . . . . . . . . . . . . . . 45
3.3.6 Rotina de Seleção de Favoritos . . . . . . . . . . . . . . . . . . . . . . 45
3.3.7 Rotina de Gravação de Favoritos . . . . . . . . . . . . . . . . . . . . . 45
3.3.8 Leitura do Sensor de Temperatura . . . . . . . . . . . . . . . . . . . . 45
3.3.9 Cálculo da Potência Instantânea . . . . . . . . . . . . . . . . . . . . . 49
3.3.10 Cálculo do Tempo de Banho . . . . . . . . . . . . . . . . . . . . . . . 52
3.3.11 Cálculo do Consumo Elétrico . . . . . . . . . . . . . . . . . . . . . . . 52
3.3.12 Rotina de Ajuste do PID . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.13 Rotina de Controle PID . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.4 Sensor de Temperatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.5 Circuito de Potência . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.5.1 Teste do Circuito de Potência . . . . . . . . . . . . . . . . . . . . . . . 57

4 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.1 Estrutura Básica do Software . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.2 Montagem do Circuito Lógico em Protoboard . . . . . . . . . . . . . . . . . . 59
4.3 Teste do Controle de Potência por Ângulo de Fase . . . . . . . . . . . . . . . . 59
4.4 Teste do Controle de Pressão . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.5 Teste do Controle de Temperatura em Malha Fechada com Lâmpada . . . . . . 62
4.6 Teste Final com Chuveiro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

5 Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.1 Aperfeiçoamento do Circuito de Potência . . . . . . . . . . . . . . . . . . . . 64
5.2 Substituição do Sensor de Temperatura . . . . . . . . . . . . . . . . . . . . . . 65
5.3 Aprimoramento da Programação do Microcontrolador . . . . . . . . . . . . . . 65
5.4 Melhoria na Dissipação de Calor dos TRIACS . . . . . . . . . . . . . . . . . . 65
5.5 Conectividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

6 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Apêndices 71

APÊNDICE A Código Fonte do Microcontrolador . . . . . . . . . . . . . . . 72

APÊNDICE B Esquema Elétrico do Circuito Lógico . . . . . . . . . . . . . . 88

APÊNDICE C Esquema Elétrico do Circuito de Potência . . . . . . . . . . . 90

APÊNDICE D Esquema Elétrico do Circuito Zero-Crossing . . . . . . . . . 92

Anexos 94

ANEXO A Esquema Elétrico do Kit de Desenvolvimento PROTO’n PIC18F4550○


R
95
17

1 Introdução

Os chuveiros elétricos são basicamente aquecedores de água de passagem, cujos ele-


mentos aquecedores geralmente são resistências elétricas constituídas de um fio metálico enro-
lado, fabricadas de ferro-cromo-alumínio ou níquel-cromo. Na maioria dos chuveiros elétricos
existentes atualmente, o controle de aquecimento é limitado a poucas temperaturas, sendo as
mesmas selecionadas através de mudanças em derivações na resistência, forçando manipula-
ções na vazão de água para um ajuste mais fino (MUNIZ, 2009).

Devido a estas limitações, o controle eletrônico de potência em aquecedores elétricos de


passagem está se tornando uma ótima alternativa, já que, com sua utilização é possível controlar
a temperatura da água de forma mais precisa sem alteração na vazão (JÚNIOR, 2006).

Em alguns modelos de chuveiros, também existe um pressurizador interno, responsá-


vel pela amplificação da pressão de entrada d’água. Porém ainda não existe controle eletrônico
dedicado a este tipo de bomba em chuveiros, exigindo alteração manual na vazão de entrada
d’água, para um ajuste mais fino da pressão.

Este projeto tem como objetivo desenvolver um sistema microcontrolado, de baixo


custo, para controle da potência elétrica entregue ao elemento aquecedor e pressurizador do
chuveiro, sendo que o controle de temperatura e pressão devem ser independentes entre si.
Neste projeto, o controle de pressão será realizado em malha aberta e o controle de temperatura
em malha fechada, através de um algoritmo PID, e de um sensor de temperatura d’água, para
que o controlador possa efetuar possíveis correções em distúrbios no sistema de aquecimento.
18

2 Fundamentação Teórica

Este capítulo tem como objetivo abordar sinteticamente os principais componentes do


sistema de controle, além de apresentar alguns conceitos básicos de recursos utilizados no pro-
jeto, para uma melhor compreensão do funcionamento do mesmo.

O diagrama de funcionamento simplificado deste projeto pode ser visto na Figura 1.


Neste projeto o controlador é composto exclusivamente por um microcontrolador PIC18F4550,
que recebe as informações do usuário através de 3 botões e configura o set point de pressão e
temperatura. O sensor de temperatura é um termistor de coeficiente negativo (NTC), que mo-
difica a tensão disponibilizada no terminal A/D do microcontrolador proporcionalmente com
a temperatura da água. O circuito de potência é basicamente constituído por TRIACs e opto
acopladores, cuja função é controlar a potência elétrica do aquecedor e do pressurizador. As
informações são exibidas ao usuário através de um display de cristal líquido (LCD). Outro ele-
mento importante do projeto é o circuito detector de passagem por zero, sua função é sincronizar
os comandos do PIC com a frequência da rede elétrica.

Figura 1 – Diagrama de funcionamento simplificado

Os diagramas de blocos relacionados ao controle da temperatura e da pressão da água


estão representados, respectivamente, nas Figuras 2 e 3, sendo que o controle de temperatura
Capítulo 2. Fundamentação Teórica 19

é realizado em malha fechada, possibilitando possíveis correções caso existam distúrbios no


sistema. Porém o controle de pressão é efetuado em malha aberta, desta forma, a potência
entregue ao pressurizador é calculada pelo microcontrolador através do set point definido pelo
usuário, sendo esta potência mantida fixa até um novo valor de set point ser definido.

Figura 2 – Diagrama de blocos do sistema de controle da temperatura.

Figura 3 – Diagrama de blocos relacionado ao sistema de controle da pressão de entrada da


água.
Capítulo 2. Fundamentação Teórica 20

2.1 Sistemas de Controle

Segundo (NISE, 2002):

Um sistema de controle consiste em subsistemas e processos (ou plantas) reu-


nidos com o propósito de controlar as saídas dos processos. Por exemplo, uma
caldeira produz calor como resultado do fluxo de combustível. Neste processo,
subsistemas chamados válvulas de combustível e atuadores de válvulas de
combustível são usados para regular a temperatura de uma sala controlando
a saída de calor de uma caldeira, outros subsistemas, como os termostatos, que
se comportam como sensores, medem a temperatura da sala. Na sua forma
mais simples, um sistema de controle fornece uma saída ou uma resposta para
uma dada entrada ou estímulo (NISE, 2002, p. 2).

2.1.1 Sistemas de Controle em Malha Fechada e Malha Aberta

Nos sistemas de controle em malha fechada, existe uma comparação entre a saída e a
entrada de referência, utilizando a diferença como meio de controle, sendo esta diferença de-
nominada erro atuante. No controle em malha fechada, o erro atuante realimenta o controlador
com o intuito de acertar a saída do sistema ao valor desejado (OGATA, 2010).

Segundo Ogata (2010), os sistemas de controle em malha aberta são aqueles em que o
sinal de saída não exerce nenhuma ação de controle no sistema, ou seja, o sinal de saída não é
medido nem realimentado para comparação com a entrada.
No controle em malha fechada, a resposta do sistema é relativamente insensível a dis-
túrbios externos e variações internas nos parâmetros do sistema, possibilitando a utilização de
componentes mais imprecisos e baratos do que os utilizados em sistemas de malha aberta.
Contudo, os sistemas em malha aberta são mais simples de serem construídos, pelo fato da es-
tabilidade do sistema ser um problema menos significativo. Desta maneira, para sistemas nos
quais as entradas são conhecidas com antecipação e que são isentos de distúrbios, é conveniente
o uso do controle em malha aberta. Sistemas de controle em malha fechada são mais vantajosos
somente nos casos em que houver distúrbios e/ou alterações não previsíveis nos componentes
do sistema (OGATA, 2010).

2.1.2 Controlador PID

O controlador Proporcional-Integral-Derivativo (PID) é o algorítimo de controle mais


utilizado no ambiente industrial. Esta popularidade é resultado da robustez e simplicidade de
implementação em inúmeras aplicações (INSTRUMENTS, 2011). Este tipo de controlador é
constituído por 3 coeficientes (proporcional, integral e derivativo), os quais são ajustados de
Capítulo 2. Fundamentação Teórica 21

forma a atender aos requisitos impostos.

Existem diversas equações que podem ser aplicadas no controlador do tipo PID, porém
a Equação (2.1) é a mais comum e que melhor descreve o funcionamento básico do mesmo
(DORF, 2001).

∫︁
d𝑒(𝑡)
𝑢(𝑡) = 𝐾𝑝 · 𝑒(𝑡) + 𝐾𝑖 · 𝑒(𝑡) d𝑡 + 𝐾𝑑 · (2.1)
d𝑡
onde u(t) é o sinal de controle a ser aplicado na planta, e(t) é o sinal de erro, Kp, Ki e Kd são
respectivamente os ganhos proporcional, integral e derivativo, os quais serão apresentados nas
subseções a seguir.

2.1.3 Ganho Proporcional (Kp)

Segundo Instruments (2011), o ganho proporcional é obtido apenas pela diferença entre
o set point e a variável do processo. Este ganho determina a taxa de resposta do controlador. Em
geral quando se aumenta o ganho proporcional, irá aumentar velocidade de resposta no sistema
de controle. Porém se Kp for muito alto, o sistema poderá apresentar oscilações, podendo até
ficar instável.

2.1.4 Ganho Integral (Ki)

Este ganho é resultado da soma do erro ao longo do tempo, sendo que sua principal
função é corrigir os erros de regime, ou seja, pequenos desvios entre set point e variável do
processo, que o controle proporcional não consegue eliminar. Altos ganhos da parcela integral
também podem levar o sistema à instabilidade (INSTRUMENTS, 2011).

2.1.5 Ganho Derivativo (Kd)

O ganho derivativo é proporcional a velocidade da variação do erro ao longo do tempo.


Este ganho tem como objetivo eliminar os transitórios do sistema, ou seja, eliminar as oscilações
da variável de processo em torno do set point. Geralmente são utilizados baixos valores no
ganho derivativo, pois o mesmo é muito sensível a ruídos na planta de controle, o que também
pode levar o sistema à instabilidade (INSTRUMENTS, 2011).
Capítulo 2. Fundamentação Teórica 22

2.2 Pulse Width Modulation (PWM)

PWM (Modulação por Largura de Pulso) é um sinal digital com frequência fixa, mas
com largura de pulso variável (MUNIZ, 2009).

Miyadaira (2009) afirma que o PWM consiste em controlar o tempo em que o sinal
permanecerá em nível alto (duty cycle), em um período de tempo predefinido, conforme a Figura
4.

Figura 4 – Exemplo de formas de onda de PWM (MUNIZ, 2009)

Segundo Muniz (2009), embora o PWM seja um sinal digital, existe um nível DC (ou
valor médio) associado a ele, de modo que pode variar o seu nível DC variando assim a largura
do seu ciclo ativo. Este valor médio é expresso pela equação, a seguir.
∫︁ 𝑇
𝑉𝐷𝐶 = 𝑉 (𝑡) d𝑡 (2.2)
0

Onde, V𝐷𝐶 é a tensão média, T é o período da onda e V(t) a função da tensão no tempo.

2.3 Controle de Potência por Ângulo de Fase

No controle de potência por ângulo de fase, os tiristores são acionados em momentos


predeterminados, de modo que a carga recebe uma parcela igual ou menor que um semi-ciclo da
rede elétrica. Desta forma, quando se controla o ângulo de disparo dos tiristores, torna-se pos-
sível variar a tensão eficaz entregue a carga, consequentemente controlando a potência elétrica.
Capítulo 2. Fundamentação Teórica 23

Analogamente, os tiristores funcionam como chaves, que são fechadas através de comandos
advindos de outros dispositivos, ou seja, os tiristores não permitem a passagem de corrente sem
que exista um sinal de acionamento no terminal de controle, geralmente conhecido como gate
nos tiristores mais comuns. Os tiristores mais utilizados são o SCR e o TRIAC, sendo que o
SCR é similar a um diodo, onde é permitida a passagem de corrente em apenas um sentido,
sendo que o TRIAC permite a passagem de corrente em ambos os sentidos, atuando assim tanto
no semi-ciclo positivo como no semi-ciclo negativo (MARTINS et al., 2010).

Na Figura 5 pode ser visto um exemplo de controle de potência por ângulo de fase,
comparando-se um disparo de 90o com um disparo de 144o .

Figura 5 – Exemplo de controle de potência por ângulo de fase (MARTINS et al., 2010)

2.4 Filtros Eletrônicos

Boylestad (1997) afirma que:

Qualquer combinação de elementos passivos (R, L e C) e/ou ativos (transis-


tores e amplificadores operacionais) projetada para selecionar ou rejeitar uma
faixa de frequências é denominada filtro. Nos sistemas de comunicação, os
filtros são usados para deixar passar as frequências que contém as informa-
ções desejadas e rejeitar as frequências restantes. Nos sistemas de som, os
filtros podem ser usados para reforçar ou atenuar certas regiões do espectro de
áudio (realçando os sons graves, por exemplo). Os filtros também são usados
para eliminar frequências indesejáveis, denominadas ruído, que são produzidas
por alguns componentes eletrônicos ou captadas do ambiente (BOYLESTAD,
1997, p. 595).

2.4.1 Circuito Snubber

Este tipo de circuito, geralmente é constituído de um filtro RC (resistor - capacitor)


em paralelo com um tiristor. A principal função do snubber é reduzir os ruídos gerados pela
Capítulo 2. Fundamentação Teórica 24

frequência de comutação do tiristor, que caso não sejam atenuados de maneira correta, podem
vir a gerar disparos acidentais do mesmo (BRASIL, 2010).

2.5 Principais Componentes

2.5.1 Microcontroladores

Os microcontroladores (𝜇C ou MCU) são dispositivos eletrônicos utilizados no controle


de processos lógicos, compostos por uma unidade central de processamento (CPU), memória de
dados e de programa, e uma série de periféricos embutidos no próprio chip, como conversor ana-
lógico/digital (A/D), timers, módulo de Pulse Width Modulation (PWM), portas de input/output
(I/O), módulos de comparação, entre outros. Atualmente os microcontroladores estão presentes
no controle da maioria dos equipamentos eletrônicos, como celulares, impressoras, televidores,
entre outros (MIYADAIRA, 2009; MUNIZ, 2009).

Segundo Souza (2003), dizemos que os microcontroladores são "dotados de uma inteli-
gência programável", pois toda lógica de controle de periféricos (acionamento de LEDs, leitura
de sensores, escrita em LCDs, entre outros) é estruturada na forma de programa e gravada den-
tro do componente. A programação pode ser desenvolvida na linguagem C, Pascal, Assembly,
etc.

Uma das principais vantagens do microcontrolador é a redução considerável do tama-


nho e do custo dos circuitos, já que somente um 𝜇C executa a mesma função que vários outros
circuitos integrados (CIs). Outra vantagem importante é a facilidade de alteração da lógica
de funcionamento do circuito, pois toda a lógica de funcionamento é criada e modificada em
ambiente computacional. Também podem ser citadas como vantagens, maior facilidade no de-
senvolvimento do layout da placa de circuito impresso e do diagrama elétrico do circuito.
Capítulo 2. Fundamentação Teórica 25

2.5.1.1 A Escolha do Microcontrolador para o Projeto

Há diversos modelos de microcontroladores, com diversos tipos de tamanhos, pinagens,


capacidades de memória, opções de periféricos, preços, entre outros. Alguns importantes fabri-
cantes de microcontroladores são: Microchip○R
, Freescale○
R
, Zilog○
R
e ATMEL○ R
.

Neste projeto foi escolhido o PIC18F4550 da Microchip○ R


, devido ao seu custo acessí-
vel, seu vasto número de periféricos como conversores A/D, Timers, Módulos de comunicação
serial e Universal Serial Bus (USB), dentre outros, além de literatura específica sobre o mesmo
e existência de kits de desenvolvimento de baixo custo com o microcontrolador já integrado.

2.5.1.2 PIC18F4550

Miyadaira (2009) afirma que:

O PIC18F4550 é construído com base na arquitetura Harvard com instruções


do tipo RISC (Computador com Conjunto Reduzido de Instruções). É um dis-
positivo de 8 bits dotado de 32 Kbytes de memória de programa e 2048 bytes
de memória RAM. Esse dispositivo pode ser alimentado com tensões entre 4V
e 5.5V, além de operar em frequência de até 48MHz (12 MIPS - milhões de
instruções por segundo). Ele pode ser alimentado diretamente por um oscilador
de 48MHz ou por um cristal associado a um bloco PLL. Além disso, possui um
oscilador interno de 8MHz, que pode ser derivado em 8MHz, 4MHz, 2MHz,
1MHz, 500kHz, 250kHz, 125kHz, e 31kHz.
Esse modelo possui 40 pinos, dos quais 35 podem ser configurados como I/O,
e diversos periféricos como memória EEPROM de 256 bytes, um módulo de
CCP e ECCP, um módulo de SPI e 𝐼 2 C, treze conversores A/D de 10 bits de
resolução com tempo de aquisição programável, dois comparadores analógi-
cos, uma comunicação USART, um timer de 8 bits (TIMER2) e três de 16 bits
(TIMER0, TIMER1, TIMER3), um módulo de detecção de baixa tensão (HLVD),
além de um módulo USB 2.0 capaz de operar no modo low-speed (1.5Mbps)
ou full-speed(12Mbps) (MIYADAIRA, 2009, p. 137).
Capítulo 2. Fundamentação Teórica 26

2.5.1.3 Pinagem

O PIC18F4550 possui 40 terminais, sendo que cada terminal pode ser configurado
para mais de uma função. Os únicos terminais que possuem apenas uma função são: 11(Vdd),
32(Vdd), 12(Vss), 31(Vss), 18(Vusb). O restante dos terminais pode ser configurado para vá-
rias aplicações distintas, como barramentos de I/O, conversores A/D, módulos de comunicação
serial e USB, entre outros, sendo cada uma destas aplicações configuradas via programação do
PIC. A seguir a pinagem do PIC18F4550:

Figura 6 – Pinagem do PIC18F4550 (INC, 2006)

2.5.1.4 Principais Características Elétricas do PIC18F4550

Segundo Miyadaira (2009) as principais características elétricas do microcontrolador


utilizado no projeto são:

∙ Temperatura de trabalho: -40o C a +85o C.

∙ Tensão de funcionamento: 4 V a 5,5 V.

∙ Corrente máxima fornecida por qualquer terminal de I/O: 25 mA.

∙ Corrente máxima de entrada em todas as portas de I/O: 200 mA.

∙ Corrente máxima fornecida por todas as portas de I/O: 200 mA.


Capítulo 2. Fundamentação Teórica 27

2.5.1.5 Principais Recursos do Microcontrolador Utilizado no Projeto

∙ Portas de I/O: São terminais que podem ser configurados como entradas ou como saídas,
podendo ler ou enviar sinais lógicos.

∙ Timers: são contadores que podem ser acessados diretamente na memória do microcon-
trolador (MUNIZ, 2009).
No PIC18F4550 existem 4 TIMERS independentes entre si, porém somente o TIMER 0
foi utilizado neste projeto (INC, 2006).
O TIMER 0 é um contador que pode ser configurado para funcionar com 8 bits (0-255) ou
16 bits (0-65535), sendo o incremento da contagem realizado através do ciclo de máquina
ou através de um evento externo pelo terminal T0CKI. Quando o incremento do TIMER
0 é realizado pelo ciclo de máquina, pode ser utilizado um prescale, que nada mais é do
que um divisor de frequência, que determina o número de ciclos de máquina necessário
para incrementar os bits do contador. O prescale pode ser configurado com valores que
sejam potências de 2, em um intervalo de 1 até 256 (MIYADAIRA, 2009; MUNIZ, 2009;
INC, 2006).
O registrador de contagem do TIMER 0, pode ser tanto lido como escrito, isto permite que
a contagem seja iniciada em um valor pré-definido, aumentando assim a precisão quando
o TIMER é utilizado como temporizador (MIYADAIRA, 2009; INC, 2006).
O TIMER 0 também pode ser utilizado como um evento de interrupção de alta ou baixa
prioridade, que é acionada através do overflow na contagem (INC, 2006).

∙ Conversores A/D: segundo Miyadaira (2009) um conversor analógico digital converte


uma grandeza analógica (temperatura, luminosidade, umidade, etc) em um valor digital
(representação binária) proporcional a ela.
O PIC18F4550 possui um conversor analógico para digital com 13 terminais de leitura
distintos entre si (AN0 a AN12), podendo ser habilitados ou não para esta função. Sua
resolução é de 10 bits com tensão de referência ajustável (MIYADAIRA, 2009).
Os bits obtidos na leitura do conversor ficam armazenados em dois registradores, o ADRESH
e o ADRESL. Estes bits podem ser agrupados de duas maneiras, sendo justificados a es-
querda ou justificados a direita. Quando são justificados a esquerda, 8 bits ficam no re-
gistrador ADRESH e dois bits no ADRESL, porém quando são justificados a direita, o
processo é exatamente o oposto, sendo dois bits guardados no ADRESH e oito bits no
ADRESL.

∙ Electrically-Erasable Programmable Read-Only Memory (EEPROM): é uma memória


não volátil, onde os dados permanecem armazenados mesmo com o sistema sem alimen-
tação (SOUZA, 2003).
A memória EEPROM do microcontrolador utilizado no projeto, possui capacidade de ar-
Capítulo 2. Fundamentação Teórica 28

mazenamento de 256 Bytes (INC, 2006).

∙ Interrupções:

As interrupções desempenham um papel importante em sistema micro-


controlados, pois permitem suspender a qualquer momento a execução
de uma linha de código e começar a executar uma rotina designada ao
tratamento de uma determinada interrupção. Após finalizar a rotina, o
processador retorna ao ponto do programa em que estava antes de a in-
terrupção ser gerada. Caracterizam-se pela alta velocidade de execução,
uma vez que as interrupções são tratadas em hardware.
As fontes de interrupção podem ser eventos externos como a mudança
de estado de um terminal de entrada, como também ser decorrentes de
eventos internos, como, por exemplo, conversão A/D, estouro de TI-
MER, estouro do WDT, etc. O microcontrolador PIC18F4550 dispõe de
muitas fontes de interrupção, sendo possível definir o nível de priori-
dade no atendimento de cada uma, selecionando-a como nível de priori-
dade alto (high priority level) ou nível de prioridade baixo (low priority
level). Uma vez habilitada, se o dispositivo estiver atendendo uma in-
terrupção de baixa prioridade, e em determinado momento ocorrer uma
interrupção de alta prioridade, o controlador é desviado para o endereço
dessa interrupção, e após trata-la, volta a executar a rotina antecedente
(MIYADAIRA, 2009, p. 195).

Na Figura 7 pode ser observada uma ilustração do processo de interrupção:

Figura 7 – Analogia com o processo de interrupção do PIC (MIYADAIRA, 2009)

Para este projeto foram utilizadas duas fontes de interrupção. A primeira trata-se da
interrupção de alta prioridade de mudança de estado no RB0 (INT0) do PIC, para leitura dos
sinais enviados pelo circuito de sincronização com a rede elétrica. A segunda compreende uma
interrupção de baixa prioridade, para o estouro da contagem do TIMER 0, que é diretamente
responsável pelo sinal de PWM que controla o circuito de potência.
Capítulo 2. Fundamentação Teórica 29

2.5.1.6 Linguagem de Programação e Compilador

Como já citado anteriormente os microcontroladores podem ser programados em di-


versas linguagens, entre as mais comuns estão C, Pascal, Assembly, Basic. Para este projeto
foi escolhido o compilador C18, pois o mesmo utiliza o padrão ANSI C, que é amplamente
utilizado na programação em linguagem C. Outro fator importante na escolha do compilador
foi a obra de Miyadaira (2009), que aborda exatamente o mesmo microcontrolador do projeto,
utilizando o compilador C18. Este compilador também possui uma versão Lite, fato que ajudou
na escolha, devido ao baixo orçamento do projeto.

2.5.1.7 Kit de Desenvolvimento

Para agilizar o projeto do circuito foi utilizado a placa de Desenvolvimento PROTO’n


PIC18F4550○ R
, pois o PIC deste KIT possui BootLoader USB, possibilitando a gravação do
programa diretamente pela comunicação USB, tornando desnecessária a utilização de um gra-
vador externo. Outra vantagem é a possibilidade de alimentar o kit diretamente pela porta USB
do computador. Estes dois fatores possibilitam que a alimentação do microcontrolador e a gra-
vação dos programas sejam realizadas por um único cabo e por uma única porta USB do com-
putador, facilitando a montagem do circuito, já que não existe mais a necessidade de extrair o
PIC toda vez em que é realizada uma alteração no programa.

As principais características do kit de desenvolvimento interessantes para este projeto,


segundo Radio (2013) são:

∙ Não precisa de Gravador: já possui carregamento do programa por BootLoader USB.

∙ Ligado diretamente na USB do PC ou notebook.

∙ Alimentação diretamente pela USB ou 7,5 / 24Vdc externo.

∙ Fornecidos 2 tipos de conectores: para uso com protoboard ou barra para ligações com
fios.

No anexo A é mostrado o diagrama elétrico do kit de desenvolvimento.

2.5.2 Sensor de Temperatura

Sensores de temperatura são basicamente elementos capazes de converter grandezas de


temperatura em sinais elétricos proporcionais. Atualmente existem diversos modelos de senso-
res como termistores, diodos, termopares, entre outros (MUNIZ, 2009).
Capítulo 2. Fundamentação Teórica 30

2.5.2.1 Termistor

Os termistores são sensores que variam sua resistência elétrica em função da variação
da temperatura. A variação da resistência ocorre de forma lenta e não-linear. Em sua maioria
são fabricados a partir de misturas cerâmicas de óxidos semicondutores, como titânio de bário,
magnésio, níquel, cobalto, titânio, ferro e cobre. Em alguns modelos, o sensor possui um bainha
preenchida com um mineral dielétrico, para isolação da resistência medidora do ambiente de
trabalho (MACIEL, 2012).

A resistência elétrica e a curva de resposta deste tipo de sensor variam para cada mo-
delo. Porém os sensores podem ser basicamente agrupados em dois grandes grupos, sendo eles
os PTCs que variam sua resistência de forma proporcional a varição da temperatura e, os NTCs
que variam a resistência de forma inversamente proporcional.

2.5.3 Display de Cristal Líquido

Os displays de cristal líquido são ótimos quando se deseja exibir uma grande quantidade
de informações oriundas do microcontrolador, pois são relativamente fáceis de trabalhar, além
de apresentarem baixo custo de aquisição. Existem dois tipo de displays de LCD: os de carac-
teres e os gráficos. Nos displays gráficos podem ser exibidas quaisquer tipos de informações,
inclusive imagens e vídeos, porém seu custo é mais elevado e sua programação mais complexa.
Já os displays de caracteres podem exibir os símbolos contidos no código ASCII, além de pos-
suírem um memória RAM, que permite a criação de alguns caracteres especiais. Neste tipo de
display, cada caractere ocupa uma posição na tela, que é definida através do número da coluna
e do número da linha (PEREIRA, 2003; BARBACENA; FLEURY, 1996).

Segundo Barbacena e Fleury (1996) os displays de cristal líquido possuem um micro-


controlador específico, já embutido em seu circuito, cuja função é receber os Bytes de dados e
comando, através de um protocolo de comunicação padronizado e gerar os caracteres na tela
de LCD. Na maioria dos modelos também exitem LEDs de backlight, para iluminação da tela,
facilitando assim a visualização das informações com pouca iluminação ambiente. Também é
possível ajustar o contraste da tela de LCD, por meio da variação da tensão no terminal de ajuste
pré-determinado.
Capítulo 2. Fundamentação Teórica 31

2.5.3.1 Display de Cristal Líquido de 16X2

O display de cristal líquido de 16X2 é um dos modelos mais utilizados em equipamen-


tos eletrônicos. Ele possui 2 linhas com 16 colunas cada, podendo assim exibir 32 caracteres
simultaneamente. Na Tabela 1 esta descrita a função de cada um dos 16 terminais deste modelo
de LCD.

Tabela 1 – Pinagem do LCD de 16X2 (AGTECHNOLOGIES, 2013)

Terminal Símbolo Função


1 VSS Gnd
2 VDD Vcc (+ 5V)
3 V0 Tensão para ajuste do contraste
4 RS Seleção de registro (1-Dado, 0-Instrução)
5 RW Seleção de leitura/escrita (1-Leitura, 0-Escrita)
6 E Sinal de enable (1-Habilita, 0-Desabilita)
7 DB0 (LSB)
8 DB1
9 DB2
10 DB3
11 DB4 Barramento de Dados
12 DB5
13 DB6
14 DB7 (MSB)
15 LED A Anodo do LED backlight
16 LED k Catodo do LED backlight

Nos displays de 16X2, os dados e as instruções, que por exemplo, poderiam ser um
caractere da tabela ASCII e a posição de escrita do caractere, respectivamente, são enviados
pelo mesmo barramento, sendo que o controlador do display distingue as informações através
do terminal RS. O display pode tanto receber como enviar dados, este tipo de ação é definida
pelo terminal RW. Para que o microcontrolador do display possa executar uma tarefa, como
por exemplo, leitura de dados ou leitura de instruções, é necessário um pulso no terminal E
(enable), sendo o tempo deste pulso variável entre os fabricantes de displays.

2.5.4 TRIACS
Segundo Maciel (2010):

O TRIAC, ou Triode for Alternating Current, é um componente eletrônico se-


micondutor amplamente utilizado para realizar o controle da passagem de cor-
rente em circuitos de corrente alternada devido à sua capacidade de condução
Capítulo 2. Fundamentação Teórica 32

nos dois sentidos, positivo e negativo. Isto significa que, independentemente da


polarização percebida em seus terminais MT1 ou MT2, ele pode ser disparado
com um pulso de tensão positiva ou negativa. Metaforicamente, internamente
ele é composto por dois dispositivos SCR (Silicon Controled Rectifier – Retifi-
cador Controlado de Silício) ligados em antiparalelo, ou seja, um ao contrário
do outro, com suas polaridades invertidas.
O TRIAC possui em sua estrutura interna três terminais: MT1, MT2 e Gate. O
primeiro é chamado de Terminal Principal 1, o segundo é chamado de Terminal
Principal 2 e o terceiro chamado de Gatilho (Gate) do TRIAC. Para conduzir
a corrente em qualquer sentido, deve ser aplicado um sinal elétrico no gate do
TRIAC até que seja alcançado o valor de corrente de retenção, que é o menor
valor instantâneo de corrente entre o ânodo e o cátodo para que o disposi-
tivo entre em modo de condução. Após este disparo, a corrente que circula no
TRIAC deverá ser sempre maior do que a corrente mínima necessária para que
a condução não cesse, chamada de corrente de manutenção. Caso a corrente
circulante seja menor que este valor, o TRIAC pára de conduzir. Estes valores
de corrente são informados nas especificações do dispositivo (MACIEL, 2010,
p. 20).

Na Figura 8, pode ser vista a simbologia do TRIAC.

Figura 8 – Simbologia do TRIAC

2.5.5 Fotoacopladores

Um fotoacoplador, nada mais é do que um CI, que possui em seu interior um LED
e algum outro componente que seja fotossensível, como um fototransistor, por exemplo. Sua
principal função é transmitir impulsos elétricos entre dois circuitos sem contato elétrico, por
meio da emissão de luz. Ao se aplicar uma tensão no LED, o mesmo se acende e polariza o
fototransistor. Desta forma o fototransistor conduz corrente pelo segundo circuito, que está iso-
lado eletricamente do primeiro (MACIEL, 2010).
Capítulo 2. Fundamentação Teórica 33

2.5.5.1 Fotoacoplador com Fototransistor

Neste tipo de fotoacoplador, o elemento sensível a luminosidade é um fototransistor.


Geralmente é utilizado em circuito onde somente se usa corrente contínua, já que o fototransis-
tor pode conduzir corrente em apenas um sentido. A simbologia deste componente é mostrada
na Figura 9.

Figura 9 – Simbologia do fotoacoplador com fototransistor

2.5.5.2 Fotoacoplador com Fototriac

Este tipo de fotoacoplador é mais utilizado quando, parte do circuito utiliza corrente
alternada, pois o fototriac pode conduzir em qualquer sentido. Os fototriacs são muito empre-
gados quando deseja-se acionar um TRIAC de um circuito de potência através de um comando
de um circuito digital. Na Figura 10 está a simbologia de um fotoacoplador com fototriac.

Figura 10 – Simbologia do fotoacoplador com fototriac


34

3 Metodologia de Projeto

Este capítulo tem como objetivo mostrar os principais passos para o desenvolvimento
do protótipo. Para uma melhor abordagem, a descrição da montagem será dividida em 5 partes,
sendo elas:

∙ Circuito detector de passagem por zero: responsável pela sincronização do PIC com a
frequência da rede elétrica.

∙ Interface com o usuário: responsável por informar os parâmetros ao usuário através do


display de cristal líquido, além de receber configurações através de três botões.

∙ Microcontrolador: responsável pela leitura dos sensores, interface com o usuário e leitura
do circuito de sincronização com a rede elétrica.

∙ Sensor de temperatura: sua função é medir a temperatura da água e gerar um valor de


tensão proporcional a esta medição.

∙ Circuito de potência: recebe os comandos do microcontrolador e controla a potência elé-


trica do aquecedor e do pressurizador.

3.1 Circuito Detector de Passagem por Zero (Zero-Crossing)

Como será detalhado a seguir, o controle de potência é diretamente influenciado pela in-
versão de fase da senoide da rede elétrica, portanto, para um correto funcionamento do circuito
é necessário que seja feita uma sincronização entre os comandos enviados pelo microcontrola-
dor ao circuito de potência e a frequência da rede elétrica.

O diagrama elétrico do circuito detector de passagem por zero pode ser visto na Figura
11. Este diagrama foi baseado no circuito de Fambrini (1999). Seu funcionamento baseia-se
no acionamento de um fotoacoplador pela tensão da rede alternada. No período de tempo em
que a tensão instantânea da rede elétrica for maior que a tensão mínima de acionamento do
fotoacoplador (aproximadamente 1V), o fotoacoplador envia OV (nível lógico 0) para o micro-
controlador e quando a tensão da rede é menor que 1V, o PIC passa a receber aproximadamente
5V (nível lógico 1).
Capítulo 3. Metodologia de Projeto 35

Figura 11 – Diagrama elétrico do circuito detector de passagem por zero

A Figura 12 representa a montagem do circuito de teste em protoboard para a detecção


do instante da passagem por zero. Já a Figura 13 expõe os dados obtidos através de um oscilos-
cópio digital, onde o sinal vermelho representa uma amostragem do sinal da rede elétrica e o
sinal azul representa os pulsos de sincronização a serem transmitidos ao microcontrolador.

Figura 12 – Representação do circuito de teste para a detecção da passagem por zero


Capítulo 3. Metodologia de Projeto 36

Figura 13 – Medições do circuito detector de passagem por zero no osciloscópio

3.2 Interface com o Usuário

A interface com o usuário é um item de extrema importância para este projeto, pois é
através dela que ocorre a entrada e a saída de informações do microcontrolador. Esta interface
é basicamente constituída por um display de cristal líquido e por um conjunto de três push-
buttons. Na Figura 14 pode ser observado o diagrama elétrico do circuito.

Figura 14 – Diagrama elétrico do circuito de interface com o usuário


Capítulo 3. Metodologia de Projeto 37

3.2.1 Botões de Ajuste das Configurações

Para ajustes dos set points pelo usuário existem três botões conectados ao microcontro-
lador, sendo a função de cada um explicado, a seguir:

∙ Botão de seleção entre as funções (select): Seu objetivo é alternar entre as funções
de ajuste do 𝜇C a cada toque no botão, também possui uma função especial caso seja
mantido pressionado por mais de 5 segundos, que será explicada mais adiante. Este botão
está ligado ao PORTB1 do PIC.

∙ Botão de incremento (+): Sua função é incrementar variáveis específicas do microcon-


trolador, nas rotinas de ajustes. Sua ligação é no terminal do PORTB2.

∙ Botão de decremento (-): Sua função é exatamente oposta ao do botão de incremento,


porém sua ligação foi feita no PORTB3.

3.2.2 Display de Cristal Líquido

O display de cristal líquido tem como principal função indicar ao usuário informações
como temperatura d’água, potência elétrica instantânea, consumo elétrico e tempo de banho,
além de interagir com o usuário quando os botões de configuração são acionados, mostrando
instantaneamente quais configurações estão sendo modificadas.

Para este projeto foi utilizado um display com 16 colunas e 2 linhas (16X2). Sua co-
municação com o microcontrolador utiliza 10 portas de I/O do PIC, sendo as oito portas do
PORTD utilizadas para a transmissão de dados, a porta RA4 e RA5 utilizadas para o controle
do terminal RS e enable do LCD, respectivamente. Foi utilizado um resistor de 5K6 para o
ajuste do contraste no display.
Capítulo 3. Metodologia de Projeto 38

3.2.3 Menus do LCD

A seguir serão explicados todos os menus presentes na programação do PIC, que são
exibidos pelo display de cristal líquido:

∙ Menu principal (Figura 15): Exibe informações de temperatura da água, tempo de ba-
nho, potência elétrica instantânea e consumo elétrico. Todos os outros menus retornam
automaticamente ao menu principal, após um determinado tempo.

Figura 15 – Menu principal do LCD

∙ Menu de configuração de temperatura (Figura 16): Neste menu o usuário pode confi-
gurar o set point de temperatura, através dos botões de incremento e decremento.

Figura 16 – Menu de configuração de temperatura


Capítulo 3. Metodologia de Projeto 39

∙ Menu de configuração de pressão (Figura 17): Sua função é receber o set point de
pressão, configurado também, através dos botões de incremento e decremento.

Figura 17 – Menu de configuração de pressão

∙ Menu de seleção de favoritos (Figura 18): Sua função é carregar parâmetros de tempe-
ratura e pressão pré-gravados na memória EEPROM pelo usuário. Neste menu o usuário
pode escolher entre 10 configurações favoritas através dos botões de incremento e de-
cremento. Para efetuar o carregamento das configurações é necessário que o botão select
seja pressionado por mais de 5 segundos, até que a mensagem "CARREGANDO..."seja
exibida no display.

Figura 18 – Menu de seleção de favoritos

∙ Menu de gravação de favoritos (Figura 19): Este é um menu especial, que é acessado
pressionando o botão select na tela inicial por mais de 5 segundos. Neste menu é possível
gravar uma configuração de banho específica, em uma das 10 posições de favoritos, na
memória EEPROM do PIC. A posição de gravação é selecionada através dos botões de
Capítulo 3. Metodologia de Projeto 40

incremento e decremento, e a gravação é efetuada pressionado-se o botão select até que a


mensagem "GRAVANDO..."seja visualizada no display.

Figura 19 – Menu de gravação de favoritos

∙ Menu de configuração do algorítimo PID (Figuras 20, 21, 22, 23): Este também é um
menu especial, que é acessado pressionando o botão de incremento e decremento simul-
taneamente, na tela inicial por mais de 5 segundos. Este tipo de configuração é realizado
apenas na calibragem do controlador PID. Neste menu é possível configurar todos os ga-
nhos do controlador PID, além do tempo entre os acionamentos da sub-rotina de controle.
Para selecionar qual ganho do controlador PID será ajustado deve-se pressionar o botão
select. Também é possível gravar as configurações dos ganhos na EEPROM, pressionando
o botão de select por mais de 5 segundos no menu de ajuste do PID.

Figura 20 – Menu de ajuste do ganho Kp


Capítulo 3. Metodologia de Projeto 41

Figura 21 – Menu de ajuste do ganho Ki

Figura 22 – Menu de ajuste do ganho Kd

Figura 23 – Menu de ajuste do período do controlador na execução da rotina de controle PID


Capítulo 3. Metodologia de Projeto 42

3.3 Microcontrolador

O microcontrolador é um elemento essencial neste projeto, pois o mesmo é responsável


pelo processamento de todos os dados utilizados no controle, leitura de sensores, controle de
toda a interface com o usuário e acionamento do circuito de potência.

Para construção do protótipo foi escolhido o PIC18F4550, que já vem embarcado no kit
de desenvolvimento PROTO’n PIC18F4550○ R
, conforme a Figura 24. Neste kit o PIC utiliza-se
de um cristal de 20MHz, para geração do sinal de clock, porém devido a utilização de comu-
nicação USB, internamente no 𝜇C a frequência passou a ser de 48MHz. Foram utilizados 14
terminais de I/O como saídas digitais, 4 terminais como entradas digitais e mais um terminal
como entrada analógica. Também foi utilizada uma interrupção de alta prioridade por mudança
de nível lógico na porta INT0 e, uma interrupção de baixa prioridade para estouro da conta-
gem do TIMER0. A memória EEPROM foi amplamente utilizada, para armazenamento dos set
points favoritos, além dos ajustes dos ganhos do controlador PID.

Figura 24 – Kit de desenvolvimento (RADIO, 2013)

3.3.1 Leitura dos Sinais de Sincronização do Circuito de Zero-Crossing

Na lógica interna do microcontrolador, foi utilizada uma interrupção de alta prioridade,


para mudanças de níveis lógicos na entrada PORTB0, assim será possível efetuar uma leitura
Capítulo 3. Metodologia de Projeto 43

do sinal de sincronização em tempo real. A seguir as principais linhas de instruções utilizadas


na configuração e na rotina de tratamento da interrupção.

∙ Configuração da interrupção do PORTB0: Estas instruções tem a função de habilitar


as interrupções e a prioridade de execução das mesmas. A prioridade na execução das
interrupções é muito útil para este projeto, já que, foram utilizadas mais de uma fonte
de interrupção do microcontrolador. Assim, será possível utilizar a leitura dos sinais de
sincronização em uma interrupção de alta prioridade e as demais fontes de interrupções
como baixa prioridade.

INTCONbits.INT0IE = 1; //Habilita interrupçao de PORTB0


INTCON2bits.INTEDG0 = 1; //Habilta interrupção na borda de subida
RCONbits.IPEN = 1; //Habilita prioridade de interrupções
INTCONbits.GIEH = 1; //Habilita as interrupções de alta prioridade
INTCONbits.GIEL = 1; //Habilita as interrupções de baixa prioridade

∙ Rotina de tratamento da interrupção: Esta rotina tem função de reiniciar a contagem da


variável de temporização, que controla o PWM do circuito de potência do pressurizador
e da resistência, além de desligar o sinal de acionamento dos TRIACS após toda inversão
de fase da rede elétrica.

void YourHighPriorityISRCode(){
periodo = 0;
resistencia = 0;
turbo = 0;
INTCONbits.INT0IF = 0; //Limpa flag de interrupção
}

3.3.2 Temporização do PWM do Circuito de Potência

Como o PWM que controla o circuito de potência é gerado via software, devido a neces-
sidade de sincronizar o sinal de PWM com os pulsos gerados pelo circuito de zero-Crossing, é
necessário dedicar um TIMER exclusivamente para esta temporização. Foi escolhido o TIMER0
para esta função, sendo o controle do PWM efetuado na rotina de tratamento de interrupção,
através do incremento de uma variável de temporização. A interrupção ocorre no estouro da
contagem do TIMER0. Esta interrupção foi configurada como baixa prioridade, para privilegiar
a leitura dos sinais de sincronização enviados pelo circuito de zero-crossing.

∙ Configuração do TIMER 0: Estas instruções tem a função de habilitar o TIMER 0, con-


figurar a contagem, além de habilitar a interrupção. O escalonador foi desabilitado e o
TIMER foi limitado em apenas 8 bits, para forçar que a interrupção ocorra em menor
tempo, aumentando assim a frequência do sinal de PWM.
Capítulo 3. Metodologia de Projeto 44

INTCONbits.TMR0IE = 1; //Habilita interrupção de estouro do Timer 0


INTCON2bits.TMR0IP = 0; //Configura a interrupção de TMR0 como low Priority
T0CONbits.T08BIT = 1 ; //8 bits
T0CONbits.T0CS = 0; //Incremento do timer 0 se da pelo ciclo de máquina
T0CONbits.PSA = 1; //Escalonador desabiltado
T0CONbits.TMR0ON = 1; //Habilita o timer 0

∙ Rotina de tratamento de interrupção: Esta rotina tem a função de incrementar a va-


riável de temporização, além de controlar o nível lógico do sinal de PWM. Nesta rotina
também é feita a temporização do relógio que indica o tempo de banho.

void YourLowPriorityISRCode(){
if(periodo<t_off){
resistencia = 0; //Desliga resistencia
}
else{
resistencia = 1; //Liga resistencia
}

if(periodo<t_off_2){
turbo = 0; //Desliga turbo
}
else{
turbo = 1; //Liga turbo
}
periodo++; //Controla a temporização do PWM
relogio++; //Controla a contagem do tempo do relógio

TMR0L = 0; /*Pelo fato de zerar a contagem do TIMER0, devem ser


considerados nos calculos do período do PWM e da
contagem do relogio, os 3us gastos na execução das
instruções da rotina de tratamento da interrupção */

INTCONbits.TMR0IF = 0; //Limpa flag de interrupção


}

3.3.3 Rotina de Monitoramento

Esta é a principal função do projeto, sendo responsável pela exibição simultânea no


LCD do tempo de banho, da potência instantânea, da temperatura d’água e do consumo elé-
trico. Nesta rotina, também são acionadas as sub-rotinas de controle PID, cálculo da potência
instantânea, cálculo do consumo e medição de temperatura. Todas as sub-rotinas essenciais
para o funcionamento do circuito são chamadas dentro da rotina de monitoramento. Existem
algumas rotinas, que são independentes da rotina principal, sendo que estas rotinas somente
são acionadas por comandos do usuário, para configurações de funcionamento ou ajustes de set
point. Quando acionadas, estas rotinas independentes forçam uma pausa na execução da rotina
de monitoramento, contudo o microcontrolador retorna automaticamente para a rotina principal
após um determinado tempo de inatividade do usuário.
Capítulo 3. Metodologia de Projeto 45

3.3.4 Rotina de Ajuste de Temperatura

Esta rotina realiza o ajuste do set point de temperatura, através dos botões de incre-
mento e decremento. A rotina de ajuste de temperatura é a primeira rotina da programação,
portanto é acessada pressionando-se o botão select, por aproximadamente 1 segundo na rotina
de monitoramento.

3.3.5 Rotina de Ajuste de Pressão

Esta é a segunda rotina na programação do PIC, onde o usuário define o set point de
pressão. Nesta rotina é calculado o duty do circuito de potência do pressurizador, pois como o
controle de pressão é realizado em malha aberta, o duty é diretamente proporcional ao valor do
set point inserido pelo usuário, através dos botões de ajuste.

3.3.6 Rotina de Seleção de Favoritos

Nesta função são carregados os set points de temperatura e pressão, que já foram pre-
viamente gravados na memória EEPROM pelo usuário. Esta função é a terceira na ordem de
acesso, ou seja, é acessada pressionando-se o select na função de ajuste de pressão. São dispo-
níveis ao usuário 10 favoritos , sendo que os set points de temperatura ocupam os endereços de
0 até 9 da EEPROM, e os set points de pressão ocupam os endereços de 10 até 19. O usuário
alterna entre as opções de favoritos através dos botões de incremento e decremento e, carrega o
favorito desejado pressionando o botão select por mais de 5 segundos.

3.3.7 Rotina de Gravação de Favoritos

Sua função é gravar os set points de temperatura e pressão na EEPROM, quando o


usuário desejar. Esta é uma rotina especial e é acessada pressionando o botão select na tela de
monitoramento por mais de 5 segundos. Para o usuário escolher a posição de gravação, são
utilizados os botões de incremento e decremento, além disso, para efetuar a gravação também
é necessário pressionar o select por no mínimo 5 segundos. Os valores dos set points que serão
gravados são os valores que foram previamente configurados nas rotinas de ajuste de tempera-
tura e pressão.

3.3.8 Leitura do Sensor de Temperatura

Como a tensão no terminal de leitura do sensor de temperatura é proveniente de um


divisor de tensão e a curva de resposta do sensor não é linear, foi necessário a realização de
Capítulo 3. Metodologia de Projeto 46

várias transformações no valor fornecido pelo conversor A/D do PIC, até que fosse possível
obter o valor de temperatura d’água em graus Celsius. As principais instruções utilizadas na
leitura e no tratamento dos dados são listadas logo abaixo:

∙ Configuração do conversor A/D: Estes comandos tem como função configurar os pa-
râmetros de leitura de acordo com o projeto do circuito e com as especificações de
datasheet. Neste projeto somente foi habilitada a porta AN0 do conversor, pois a única
leitura analógica é a de temperatura. Os bits do registradores de leitura foram justificados
a esquerda, pois desta forma torna-se possível descartar os dois bits menos significativos
(LSB) da leitura, para evitar que ruídos no sensor de temperatura interfiram no processo
de controle.

ADCON1 = 0b001110; //Habilta AN0


ADCON2 = 0b00000110; //Justificado a esquerda /\ TAD = 0 /\ FOSC/64
ADCON0 = 0b00000001; //Habilta o conversor AD e entrada AN0

∙ Cálculo do divisor de tensão: Como já citado anteriormente, a leitura do sensor de tem-


peratura é feita em um divisor de tensão exibido na Figura 25, por este motivo é preciso
efetuar os devidos cálculos para que seja possível encontrar a resistência proporcional a
temperatura medida pelo sensor. Primeiramente são efetuadas 10 leituras consecutivas do
sensor e é calculada a média das mesmas, para atenuar ruídos na medição. Após o cál-
culo da média das medições é obtida a resistência em Ohm do sensor pela Equação (3.4).
Considerando Vpic como sendo a tensão medida no terminal do conversor A/D do 𝜇C,
Vcc a tensão de alimentação, R5 o resistor do divisor de tensão e RT1 como a resistência
do sensor.

Figura 25 – Circuito de leitura de temperatura


Capítulo 3. Metodologia de Projeto 47

Primeiro calculamos a tensão lida pelo conversor A/D do PIC:


𝑉 𝑐𝑐 · 𝑅5
𝑉 𝑝𝑖𝑐 = (3.1)
𝑅𝑇 1 + 𝑅5
Isolando RT1, temos:
𝑉 𝑐𝑐 · 𝑅5
𝑅𝑇 1 = ( ) − 𝑅5 (3.2)
𝑉 𝑝𝑖𝑐
Considerando Vcc = 5V e R5 = 10KΩ:
(︃ )︃
5 · 10000
𝑅𝑇 1 = − 10000 (3.3)
𝑉 𝑝𝑖𝑐
(︃ )︃
50000
𝑅𝑇 1 = − 10000 (3.4)
𝑉 𝑝𝑖𝑐

O resistor R8 e o capacitor C5 compõem um filtro, cuja função também é eliminar ruídos


presentes no sinal do sensor de temperatura, que prejudicam o controle PID e causam
variações excessivas no valor da temperatura da água exibida no LCD.

∙ Cálculo da temperatura: Existem diversas maneiras de interpretar a medição de um


NTC na lógica de programação do microcontrolador, sendo que a mais comum, utiliza
equações com coeficientes definidos pelo próprio fabricante do sensor. Porém o NTC uti-
lizado na montagem do protótipo foi adquirido de máquinas em desuso, não sendo assim
possível encontrar o fabricante do mesmo, exigindo com que fosse encontrada a curva de
resposta do sensor manualmente. Esta curva foi obtida, inserindo-se o NTC do protótipo
e um termopar tipo k em um mesmo ambiente, com temperatura controlada e, compa-
rando as medições de temperatura do termopar com a resistência elétrica equivalente do
NTC. Os dados obtidos no experimento podem ser observados na Tabela 2 e no gráfico
da Figura 26.
Capítulo 3. Metodologia de Projeto 48

Tabela 2 – Curva de resposta do NTC do protótipo

Resistência (Ω) Temperatura (o C)


3000 44
3340 40
3970 37
5220 36
5490 35
5650 34
5980 33
6330 32
6530 31
6840 30
7170 29
7840 28

Figura 26 – Gráfico da curva de resposta do NTC do protótipo

Após o levantamento da curva de resposta, foi obtida uma equação aproximada por uma
linha de tendências, para o comportamento do sensor em função da temperatura. Esta
equação é exibida, a seguir:

𝑇 𝑒𝑚𝑝 = −15 ln(𝑅𝑇 1) + 163, 01 (3.5)

∙ Implementação no microcontrolador: É exibida logo abaixo, a implementação da Equa-


ção 3.4 e da Equação 3.5, no microcontrolador:

void mede_temp(void){
char m=0;
float res_ntc=0; //Resistencia do ntc
float aux_linear=0, aux_linear1=0; //Auxilia no calculo da temperatura

//Media das medições do ntc


Capítulo 3. Metodologia de Projeto 49

for(m=0; m<10; m++){


le_adc();
res_ntc = res_ntc + AD_MSB;
}
res_ntc = res_ntc/10;

//Calculo da resistencia do ntc


res_ntc= (res_ntc*5)/1023; //Tranforma o valor lido para tensão
res_ntc = (50000/res_ntc) - 10000; //Calcula o divisor de tensão

//Calculo da temperatura (curva experimental) <--> y = -15*ln(x) + 163,01


aux_linear = log(res_ntc); //ln(x)
aux_linear1 = 163.01 - (15*aux_linear); //163,01 - (15*ln(x))
//Transforma o valor float em unsigned long int para ser exibido pelo LCD
sensor_temp = aux_linear1;
}

Nesta rotina, todos os cálculos foram realizados utilizando variáveis do tipo float, para
obter maior precisão nos resultados, porém o resultado final foi truncado e armazenado
numa variável do tipo long int, para possibilitar a exibição do valor da temperatura no
display de cristal líquido, pois a rotina de escrita de numerais no display utiliza um al-
goritmo não compatível com variáveis do tipo float, para a decomposição dos números
maiores que 9 em dígitos individuais, que serão enviados ao LCD.

3.3.9 Cálculo da Potência Instantânea

No LCD é exibida a potência elétrica instantânea entregue ao aquecedor pelo circuito


de potência, sendo esta potência obtida apenas por cálculos matemáticos. O cálculo é realizado
utilizando-se a tensão eficaz obtida através do ângulo de disparo dos TRIACS e a resistência
elétrica estimada para o aquecedor do chuveiro. O cálculo e a implementação do mesmo no PIC
são demostrados a seguir:

∙ Calculo da potencia: Considere para o cálculo.


V = 127 V (tensão eficaz da rede elétrica)
P = 5500 W (potência nominal do chuveiro)
T = 𝜋 rad (o período de um semi-ciclo da rede elétrica)
A = (tensão de pico da rede elétrica)
R = (resistência elétrica do aquecedor do chuveiro)
t𝑥 = (ângulo de disparo dos TRIACS em radianos)
V𝑒𝑓 = (tensão eficaz no aquecedor do chuveiro)
P𝑎𝑞 = (potência fornecida ao aquecedor do chuveiro em função da tensão eficaz)
Capítulo 3. Metodologia de Projeto 50

A tensão eficaz é expressa pela seguinte equação:


√︃
1 ∫︁ 𝜋
𝑉𝑒𝑓 = [𝐴 · 𝑠𝑒𝑛(𝜔𝑡)]2 d𝜔𝑡 (3.6)
𝑇 𝑡𝑥

√︃
𝐴2 ∫︁ 𝜋
𝑉𝑒𝑓 = [𝑠𝑒𝑛(𝜔𝑡)]2 d𝜔𝑡 (3.7)
𝑇 𝑡𝑥

Resolvendo a integral, temos:


⎯ [︃ (︃ )︃]︃
⎸ 2
⎸𝐴 𝐴2 𝑠𝑒𝑛(2𝑡𝑥 )
𝑉𝑒𝑓 = ⎷ − 𝑡𝑥 − (3.8)
2 2𝜋 2

Calculando a resistência elétrica do aquecedor do chuveiro:

𝑉2
𝑅= (3.9)
𝑃

1272
𝑅= (3.10)
5500

𝑅 = 2, 932545455 Ω (3.11)

Como:
𝑉𝑒𝑓2
𝑃𝑎𝑞 = (3.12)
𝑅

{︂√︂ [︁ (︁ )︁]︁}︂2
𝐴2 𝐴2 𝑠𝑒𝑛(2𝑡𝑥 )
2
− 2𝜋
𝑡𝑥 − 2
𝑃𝑎𝑞 = (3.13)
𝑅

[︁ (︁ )︁]︁
𝐴2 𝐴2 𝑠𝑒𝑛(2𝑡𝑥 )
2
− 2𝜋
𝑡𝑥 − 2
𝑃𝑎𝑞 = (3.14)
𝑅


Considerando 𝐴 = 127 · 2, temos que:
√ 2
[︃ √ 2 ]︃
(127· 2) (127· 2) (︁ 𝑠𝑒𝑛(2𝑡𝑥 )
)︁
2
− 2𝜋
𝑡𝑥 − 2
𝑃𝑎𝑞 = (3.15)
2, 932545455
Capítulo 3. Metodologia de Projeto 51

Simplificando: [︁ (︁ )︁]︁
𝑠𝑒𝑛(2𝑡𝑥 )
16129 − 5134 𝑡𝑥 − 2
𝑃𝑎𝑞 = (3.16)
2, 932545455

[︁ (︁ )︁]︁
𝑠𝑒𝑛(2𝑡𝑥 )
5134 𝑡𝑥 − 2
𝑃𝑎𝑞 = 5500 − (3.17)
2, 932545455

∙ Cálculo do ângulo de disparo mínimo dos TRIACS: No programação do 𝜇C é impres-


cindível conhecer o ângulo de disparo mínimo dos TRIACS, para o cálculo da potên-
cia. Para obter o ângulo mínimo, primeiramente deve-se encontrar o tempo gasto entre
cada evento de interrupção do TIMER0. Este tempo é obtido levando em consideração
a frequência de clock, o escalonador, número de bits do contador e o preset do TIMER.
Neste projeto foi utilizado um clock de 48 MHz, o escalonador foi desativado, o contador
foi configurado para 8 bits e o preset foi configurado como 0. Também deve ser conside-
rado nos cálculos o tempo gasto na execução das instruções da rotina de tratamento de
interrupção, sendo para este projeto aproximadamente 3𝜇s. O cálculo do tempo é exibido,
a seguir:

4
[︂ (︂ )︂]︂
𝑇 = 256 · + 3 · 10−6 (3.18)
48 · 106

Então, considerando que 𝜋 rad é igual a aproximadamente (1/120) s, podemos encontrar


o ângulo mínimo de disparo pela razão entre as grandezas, da seguinte maneira:

𝜋·𝑇
𝐴𝑚𝑖𝑛 = (3.19)
(1/120)

{︁[︁ (︁ )︁]︁ }︁
𝜋· 256 · 4
48·106
+ 3 · 10−6
𝐴𝑚𝑖𝑛 = (3.20)
(1/120)

𝐴𝑚𝑖𝑛 = 0, 0091734505 𝑟𝑎𝑑 (3.21)


Capítulo 3. Metodologia de Projeto 52

∙ Implementação no PIC: A seguir a rotina utilizada para o cálculo da potência.

void calc_pot(void){
x = 0.0091734505*t_off; //0.0091...é o angulo de disparo minimo
x = 5134*(x-(0.5*sin(2*x)));
x = x/2.932545455; //2.93...é o valor estimado da resistencia em Ohm
PW = 5500 - x;
}

3.3.10 Cálculo do Tempo de Banho

A temporização do banho foi obtida através do incremento da variável relogio na rotina


de tratamento da interrupção de estouro do TIMER0. Para o cálculo do tempo de banho foi
estimado o número de interrupções necessárias para obter-se o tempo de um segundo, ou seja,
de maneira genérica é o valor que a variável relogio está após um segundo de contagem. Desta
forma, ao medir os segundos, consequentemente torna-se possível medir os minutos e as horas.

Para encontrar o valor da variável relogio após um segundo de contagem, primeiramente


deve-se conhecer o tempo gasto entre cada evento de interrupção do TIMER0, como ocorre no
cálculo da potência instantânea, já que tanto a temporização do PWM do circuito de potência,
como a temporização do relógio utilizam-se do mesmo timer. Após obter o tempo gasto entre
cada interrupção, basta encontrar o número de interrupções para o período de um segundo.

A rotina utilizada no cálculo do tempo é exibida a seguir.

void calc_relogio(void){
segundo_total = (relogio/40137); /*40137 é o valor estimado
da variável relógio para um segundo de contagem*/

hora = segundo_total/3600;
minuto = (segundo_total%3600)/60;
segundo = (segundo_total%3600)%60;
}

3.3.11 Cálculo do Consumo Elétrico

O consumo elétrico do banho também é obtido exclusivamente através de cálculos,


utilizando-se de uma amostragem da potência elétrica instantânea a cada um minuto de banho.
A rotina utilizada no cálculo é extremamente simples, sendo composta por um comando que
efetua a amostragem da potência instantânea e pelo cálculo da média das amostragens.

void calc_consumo (void){


calc_pot(); //Amostra a potencia instantanea
consumo = consumo + (PW/60); /*A pot. inst. é dividida por 60,
pois a amostragem é feita a cada 1 minuto*/
Capítulo 3. Metodologia de Projeto 53

3.3.12 Rotina de Ajuste do PID

A rotina de ajuste do PID possibilita a calibração dos ganhos do controlador em tempo


real, sem ter a necessidade de alterar o código do 𝜇C, sendo muito útil durante a fase de desen-
volvimento, já que o método de calibragem empregado no projeto foi o de "tentativa e erro".
Esta função também possibilitaria em escala comercial, que fosse feita uma assistência remota
do produto, em casos onde o mesmo fosse aplicado em ambientes muito diferentes do utilizado
no desenvolvimento, como por exemplo, lugares com temperaturas extremamente baixas.

Esta também é uma rotina especial, pois para ser acessada é necessário manter os botões
de incremento e decremento pressionados simultaneamente, por mais de 5 segundos, na tela de
monitoramento. Dentro da função de calibragem o botão select seleciona qual ganho será alte-
rado, e os botões de incremento e decremento alteram os valores.

Após alguma alteração nos valores dos ganhos, é possível salvar os mesmos na memória
EEPROM, pressionando-se o botão select na rotina de calibragem por no mínimo 5 segundos,
para que não seja necessário calibrar o controlador toda vez que o PIC for energizado. Os ga-
nhos salvos na EEPROM são automaticamente carregados toda vez que o microcontrolador é
iniciado. Os ganhos ocupam os endereços 20 até 23 da EEPROM.

3.3.13 Rotina de Controle PID

Para o controle de temperatura da água foi escolhido um controlador PID, que é a es-
tratégia de controle mais recomendada para este tipo de sistema. A Equação 3.22 mostra a
implementação do controlador PID no ambiente digital, onde Kp é o ganho proporcional, Ki o
ganho integral, Kd o ganho derivativo e E(T) é o erro entre set point e a temperatura medida
pelo sensor.

𝑇
∑︁
𝑢(𝑡) = 𝐾𝑝 · 𝐸(𝑇 ) + 𝐾𝑖 · 𝐸(𝑡) + 𝐾𝑑 · [𝐸(𝑇 ) − 𝐸(𝑇 − 1)] (3.22)
𝑡=𝑇 −𝐴

Para ser implementado no microcontrolador, primeiramente foi calculado o erro entre o


set point e a temperatura medida pelo sensor. Após o cálculo deste erro, o mesmo foi arquivado
em uma posição predefinida de um vetor de 100 posições.
Capítulo 3. Metodologia de Projeto 54

A contribuição integral é aproximada neste trabalho como sendo a somatória dos valo-
res dos erros contidos em todas as 100 posições do vetor. Já o ganho derivativo é obtido pela
subtração do valor do erro atual pelo erro do instante anterior.

A seguir é apresentado o algoritmo relacionado com o controlador PID para a regulação


da temperatura. Esta rotina é responsável por calcular o erro, selecionar a posição de gravação
do erro no vetor, calcular o ganhos do controlador e definir qual será o duty aplicado ao aque-
cedor da planta de controle.

void controle(void){
unsigned char pos_erro=0; //Posicao de gravacao do erro

erro = temp - sensor_temp; //Calc. do erro


memo_erro[e] = erro; //Grava o erro no vetor
integral_erro = 0;
for(pos_erro=0; pos_erro<100; pos_erro++){ //Calcula int. do erro
integral_erro = integral_erro + memo_erro[pos_erro];
}
if(e>0){ //Calcula a derivada do erro
derivada_erro = memo_erro[e] - memo_erro[e-1];
}
else{
derivada_erro = memo_erro[e] - memo_erro[99];
}

/*********** Algoritmo PID ***********/


u = ((float)kp/400) * erro;
u = u + (((float)ki/40000) * integral_erro);
u = u + (((float)kd/400) * derivada_erro);

if(u>1){ //Impede que o ganho seja maior que 1


u = 1;
}
if(u<0){ //Impede que o ganho seja menor que 0
u = 0;
}
t_off = 343 - (float)(343*u); //Calcula o duty

e++; //Controla a posicao de gravação do erro no vetor


if(e>=100){
e = 0;
}
}

3.4 Sensor de Temperatura

O sensor de temperatura é o elemento responsável pelo feedback da temperatura d’água,


sendo assim imprescindível para o controle do aquecimento em malha fechada. Neste projeto
Capítulo 3. Metodologia de Projeto 55

foi utilizado um sensor de temperatura do tipo NTC de 10KΩ. Como o sensor de temperatura
fica situado bem próximo ao aquecedor do chuveiro, que por sua vez é alimentado por tensões
consideravelmente maiores que os 5V utilizados pela alimentação do PIC, fez-se necessário a
utilização de um NTC com bainha isoladora, conforme Figura 27, para evitar possíveis danos
ao circuito lógico causados por sobre-tensões.

Figura 27 – Termômetro de resistência com bainha isoladora (MACIEL, 2012)

3.5 Circuito de Potência

Este circuito recebe sinais lógicos do 𝜇C e executa o controle de potência do aquecedor


e do pressurizador, através do controle do ângulo de disparo dos tiristores. Basicamente o cir-
cuito é composto por fotoacopladores para isolar todo o circuito de potência do circuito lógico,
TRIACS que efetuam o controle da potência, e capacitores e indutores que funcionam como
filtros passivos.

O circuito de potência é totalmente dependente do circuito lógico para poder efetuar o


disparo dos TRIACS, além do circuito detector de passagem por zero, que efetua a sincroni-
zação do circuito de potência com a frequência da rede elétrica. Esta sincronização é extrema-
mente importante para que o PIC consiga disparar os TRIACS no momento certo e consequen-
temente efetuar o controle de potência com precisão, além do fato que após cada inversão de
fase da senoide da tensão da rede, os TRIACS param de conduzir, devido as suas propriedades
intrínsecas naturais, fazendo-se necessário que o microcontrolador efetue um novo disparo de
acionamento para os tiristores voltarem a conduzir.

O diagrama elétrico completo e o circuito de potência montado podem ser analisados


no Apêndice C e na Figura 28, respectivamente. É importante informar que o circuito de Zero-
Crossing foi montado na mesma placa do circuito de potência, para facilitar a montagem do
projeto.
Capítulo 3. Metodologia de Projeto 56

Figura 28 – Circuito de potência montado

O circuito de potência é formado por dois circuitos, sendo eles:

∙ Circuito do pressurizador: Este circuito é o mais simples, pelo fato de trabalhar com
correntes baixas em relação a capacidade máxima do TRIAC usado. O circuito é com-
posto basicamente por um TRIAC e um fotoacoplador, que recebe os sinais de aciona-
mento do terminal RC1 do PIC.

∙ Circuito do aquecedor: Este circuito é mais complexo, devido as altas correntes que o
mesmo deve suportar. Neste circuito foram utilizados 6 TRIACS em paralelo, pois como
cada tiristor utilizado suporta até 8A, a utilização de um conjunto com 6 componentes
possibilita trabalhar com até 48A. Também devido às altas correntes de trabalho, foram
necessárias a inclusão de filtros, para evitar o disparo acidental dos tiristores. Foram uti-
lizados um filtro snubber no fotoacoplador, além de um filtro formado por dois indutores
e dois capacitores no conjunto de TRIACS. Este circuito recebe os sinais de acionamento
do terminal RC2 do microcontrolador.
Capítulo 3. Metodologia de Projeto 57

3.5.1 Teste do Circuito de Potência

Para validar a eficiência do circuito de potência, foram realizados testes em laboratório,


utilizando-se um osciloscópio digital, para comparar a tensão fornecida à carga com os sinais
de acionamento enviados pelo microcontrolador. O teste pode ser analisado na Figura 29.

Figura 29 – Teste do circuito de potência no osciloscópio


58

4 Resultados

O protótipo foi desenvolvido e montado em diversas etapas, sendo que ao final de cada
etapa eram efetuados testes no funcionamento, antes de ser dado continuidade ao projeto. Neste
capítulo serão mostrados os principais resultados dos testes realizados no projeto, do começo
até o último teste com o protótipo finalizado. Também serão mostrados os principais problemas
encontrados durante o desenvolvimento e suas respectivas soluções.

4.1 Estrutura Básica do Software

Nesta fase do projeto foi criada a estrutura básica da programação para o início do de-
senvolvimento do projeto. Foram criadas rotina de configuração de set points, rotina de exibição
da temperatura da água, além de definição da pinagem a ser utilizada no PIC e botões para con-
figuração de parâmetros. Esta primeira etapa do desenvolvimento foi realizada utilizando o Kit
didático XM118 da EXSTO○ R
mostrado na Figura 30, com o microcontrolador e periféricos já
embutidos.

Figura 30 – Kit didático da EXSTO○


R
XM118 (TECNOLOGIA, 2011)

Durante esta fase não foram encontrados grandes problemas, já que não havia necessi-
dade de se preocupar com o hardware do circuito do projeto, pois os periféricos do kit didático
já eram suficientes para o início do projeto.
Capítulo 4. Resultados 59

4.2 Montagem do Circuito Lógico em Protoboard

A montagem do circuito lógico em protoboard marcou o início da construção do hard-


ware do projeto. Nesta etapa foram montados um buzzer para sinalização, o circuito de leitura
do sensor de temperatura e a interface com o usuário que inclui os push-buttons e o display de
cristal líquido. Na Figura 31 é exibido o circuito montado. Também nesta etapa, já foi imple-
mentado o Kit de desenvolvimento PROTO’n PIC18F4550○ R
.

Figura 31 – Circuito lógico montado em protoboard

O único problema encontrado durante esta montagem foi a utilização do LCD, pois
houve dificuldades para a execução da escrita no mesmo. A solução encontrada foi o aumento
nos delays dos pulsos de enable que o PIC envia ao display, pois a rotina de escrita utilizada
anteriormente à montagem, era projetada para trabalhar em um clock de 20MHz, contudo o
PROTO’n PIC18F4550○ R
utiliza-se de 48MHz. Também foi preciso ajustar o contraste do dis-
play, através da inclusão de um resistor de 5K6 no terminal de ajuste.

4.3 Teste do Controle de Potência por Ângulo de Fase

O primeiro teste foi realizado utilizando-se o circuito de potência presente em kits di-
dáticos da própria instituição de ensino, e uma lâmpada como carga. Estes testes não foram
satisfatórios, pois o controle de potência se mostrou instável e pouco preciso. As causas do pro-
blema foram erros na programação do PIC, onde a lógica de funcionamento estava invertida,
Capítulo 4. Resultados 60

fazendo com que os tiristores iniciassem conduzindo após a inversão de fase da rede elétrica
e fossem desligados em momentos pré-determinados, sendo que o correto é iniciar os tiristo-
res desligados após a inversão de fase da rede, ligando os mesmos também em um momento
pré-determinado, e aguardando que sejam desligados naturalmente pela passagem por zero da
senóide da rede elétrica.

Na fotografia da Figura 32 é mostrado o primeiro teste do circuito de potência em labo-


ratório.

Figura 32 – Primeiro teste do circuito de potência

Posteriormente foram corrigidas as falhas na programação do 𝜇C e foi confeccionado


um protótipo do circuito de potência em protoboard, já utilizando o circuito desenvolvido para
o projeto. Com as melhorias implementadas, os testes utilizando lâmpadas incandescentes pas-
saram a ser bastante satisfatórios, e com isso, o circuito de potência foi montado em uma placa
de circuito universal, para que o mesmo fosse capaz de suportar correntes bem mais altas. A
seguir, a Figura 33 mostra os testes após a correção das falhas na programação e com o circuito
de potência montado na placa de circuito universal.
Capítulo 4. Resultados 61

Figura 33 – Teste do circuito de potência após correção na programação do PIC

4.4 Teste do Controle de Pressão

Como neste projeto o controle de pressão é efetuado em malha aberta através da mani-
pulação da rotação do motor da bomba do pressurizador e não existe sensor de pressão, sendo o
próprio usuário responsável por configurar o nível de pressão d’água desejado, foram realizadas
simulações utilizando-se um ventilador de mesa, que possui um motor do tipo universal, seme-
lhante ao motor do pressurizador, para a demonstração da viabilidade do controle de pressão. A
seguir, na Figura 34, o teste do controle de pressão através da simulação com um ventilador.

Figura 34 – Teste do controle do pressurizador com ventilador

Neste teste foi verificada a viabilidade do controle de pressão, pois foi possível controlar
Capítulo 4. Resultados 62

a velocidade de rotação das pás do ventilador com precisão. Não foram encontradas dificuldades
nesta etapa do projeto.

4.5 Teste do Controle de Temperatura em Malha Fechada


com Lâmpada

Para efetuar os primeiros testes do controle PID, leitura dinâmica da temperatura e con-
trole de potência, foi desenvolvido um teste para o controle de temperatura, onde o aquecedor
era simulado por uma lâmpada incandescente e a circulação de água pelo movimento do ar
gerado por um ventilador, conforme a Figura 35.

Figura 35 – Teste do controle de temperatura com lâmpada

Com esse teste foi possível efetuar ajustes e pré-calibrar o ganhos da rotina de controle
PID, além de eliminar ruídos presentes na leitura de temperatura antes da montagem definitiva
do protótipo, onde alterações no circuito ou na programação do microcontrolador seriam muito
mais complexas de serem efetuadas.

4.6 Teste Final com Chuveiro

Para validação do protótipo foi utilizado um chuveiro de 127V com 5500W de potência
nominal. Com a inclusão do chuveiro nos testes, foi possível verificar a qualidade e a eficácia
da medição da temperatura da água pelo sensor, o funcionamento do circuito de potência para
altas correntes e controle de temperatura da água em malha fechada. Na Figura 36 pode ser
visto o teste com o chuveiro montado.
Capítulo 4. Resultados 63

Figura 36 – Teste do controle de temperatura com chuveiro

Houve dois empecilhos durante esta fase. O primeiro empecilho foi o superaquecimento
do circuito de potência, quando era utilizado o aquecedor do chuveiro na saída de carga. Como
não havia nenhum tipo de dissipador de calor no circuito, foi empregado o uso de ventilação
forçada diretamente sobre os componentes, para que fosse possível a realização dos testes.

Em segundo lugar, o circuito de potência apresentou anomalias quando foram exigidos


grandes valores de corrente do mesmo. Verificou-se que devido à frequência de chaveamento
dos TRIACS, as altas correntes consumidas pelo chuveiro estavam gerando ruídos na alimen-
tação elétrica, causando o disparo acidental dos tiristores. Este problema foi solucionado com
a inclusão de filtros no circuito de potência do aquecedor. Foram utilizados um filtro snubber
no fotoacoplador, e mais um filtro nos TRIACS, formado por dois capacitores de 560nF e dois
indutores enrolados manualmente, sendo o número de voltas encontrado empiricamente até su-
primir o ruído dos tiristores. Foram utilizadas 35 espiras de um fio esmaltado de 16AWG, em
um núcleo toroidal de ferrite de 23mm de diâmetro externo, 14mm de diâmetro interno e 8mm
de largura, para cada indutor.
64

5 Trabalhos Futuros

Neste capítulo são apresentadas algumas sugestões de melhorias, que foram analisadas
após o término dos testes e poderiam ser implementadas no projeto.

5.1 Aperfeiçoamento do Circuito de Potência

Como o circuito de potência utilizado no protótipo apresentou problemas de disparos


acidentais dos TRIACs causados por ruídos no sistema, fazendo necessária a utilização de um
filtro com duas toróides de grande porte, seria interessante a implementação de outras opções
de circuitos de potência mais eficazes e com menores dimensões, como por exemplo o circuito
da Figura 37, que é específico para ambientes extremamente ruidosos.

Figura 37 – Circuito de disparo para TRIACs em ambientes extremamente ruidosos (FAIR-


CHILD, 2004)
Capítulo 5. Trabalhos Futuros 65

5.2 Substituição do Sensor de Temperatura

Durante os testes tanto com lâmpada como com o chuveiro, ficou evidente que a resposta
à varição de temperatura no sensor utilizado no protótipo é muito lenta, prejudicando assim o
controle de temperatura em malha fechada. Seria necessário uma nova pesquisa para encontrar
o sensor ideal para o projeto, que deveria possuir resposta praticamente instantânea a variação
da temperatura, um range de no mínimo 0 a 100 o C, e principalmente possuir isolação elétrica
entre o elemento sensor e o ambiente de medição.

5.3 Aprimoramento da Programação do Microcontrolador

Devido as muitas rotinas e cálculo executados pelo PIC, a memória do mesmo pratica-
mente foi esgotada, impedindo que possam ser implementadas mais funções na programação,
para trabalhos futuros. Trabalhar no limite da memória também impediu que fosse criado um
vetor de 256 posições para o cálculo do controle PID, sendo que o máximo possível para o
projeto atual foi um vetor de 100 posições, desta forma prejudicando a qualidade do controle.

Seria necessário analisar a programação para tentar eliminar redundâncias, variáveis


com tamanhos excessivos e rotinas desnecessárias. Também seria possível usar uma EEPROM
externa e a própria memória flash, com o cuidado de não sobrescrever o código.

5.4 Melhoria na Dissipação de Calor dos TRIACS

Quando eram exigidas altas correntes no circuito de potência, o mesmo aquecia excessi-
vamente, sendo necessário implementar um dissipador de calor de proporções inaplicáveis para
este tipo de projeto. Porém existe a possibilidade de substituir o conjunto dos seis TRIACS por
apenas um TRIAC de maior capacidade de corrente e inserir este TRIAC no interior do próprio
chuveiro, fazendo com que a água funcione como dissipador de calor. Esta alteração seria de
grande eficiência, já que á água dissiparia o calor com mais rapidez do que qualquer outro tipo
de dissipador, além de gerar economia de energia, pois o calor dissipado pelo TRIAC serviria
para preaquecer a água.

5.5 Conectividade

Permitir que o microcontrolador se comunique e interaja com outros tipos de equi-


pamentos, como computadores, tablets, smartphones, entre outros, afim de que seja possível
Capítulo 5. Trabalhos Futuros 66

controlar o chuveiro remotamente de forma mais dinâmica, possibilitando utilização do equi-


pamento em “casas inteligentes” e automatizadas, além de possibilitar a criação de gráficos e
estatísticas sobre os banhos de uma residência, gerando assim economia de água e energia.
67

6 Conclusão

Ao final dos testes foi possível verificar a viabilidade do projeto, pois o controle PID
de temperatura mostrou-se eficaz, conseguindo estabilizar a temperatura no set point desejado,
com um erro de ±1 o C em aproximadamente 30 segundos, conforme pode ser observado no
gráfico da Figura 38 .

Figura 38 – Curva de resposta do controle de temperatura

Os testes do controle de pressão, utilizando-se um ventilador para a simulação também


foram bastante satisfatórios, pois foi possível controlar a velocidade de rotação do motor sem
nenhuma dificuldade.

Outro fator importante, que também viabiliza o projeto é o baixo custo de produção,
principalmente se for considerada uma montagem em escala industrial, realizada por equipa-
mentos automatizados.

Este projeto gera um item de conforto adicional nos chuveiros, pois possibilita a repro-
dução de uma determinada condição de banho quantas vezes forem desejadas, além de livrar o
usuário da tarefa de controlar a temperatura e a vazão d’água.
68

Referências

AGTECHNOLOGIES. AGM-1602W-203. [S.l.], 2013. Disponível em: <http://www.agte.com-


.br/wp-content/uploads/2011/05/AGM-1602W-203.pdf>. Acesso em: 25/05/2013. Citado 2
vezes nas páginas 10 e 31.

ALMEIDA, A. de. Dispositivos Semicondutores: Tiristores - controle de potência em cc e ca.


[S.l.: s.n.]. Nenhuma citação no texto.

BARBACENA, I. L.; FLEURY, C. A. Display LCD. , 1996. Disponível em:


<ftp://ftp.dca.fee.unicamp.br/pub/docs/ea079/complementos/Lcd.pdf>. Acesso em:
20/04/2014. Citado na página 30.

BOYLESTAD, R. L. Introdução à Análise de Circuitos. 8. ed. Rio de Janeiro: Prentice-Hall do


Brasil, 1997. Citado na página 23.

BOYLESTAD, R. L.; NASHELSKY, L. DISPOSITIVOS ELETRÔNICOS E TEORIA DE


CIRCUITOS. 6. ed. Rio de Janeiro: LTC - Livros Técnicos e Científicos Editora S.A., 1998.
Nenhuma citação no texto.

BRASIL, T. A. do. Implementação e construção de uma bancada para testes térmicos para
dispositivos semicondutores de potência. , 2010. Disponível em: <http://www.monografias-
.poli.ufrj.br/monografias/monopoli10000501.pdf>. Acesso em: 11/06/2014. Citado na página
24.

COELHO, G. M. C.; BRISSON, E. R. CONTROLE DE TEMPERATURA DE UM CHUVEIRO


COM AQUECIMENTO SOLAR E ELÉTRICO. , 2011. Disponível em: <http://143.107.106.66-
/sites/pmr.poli.usp.br.euniversidade.com.br/files/Artigo final Gustavo Evandro.pdf>. Acesso
em: 01/09/2012. Nenhuma citação no texto.

DORF, R. H. B. R. C. Sistemas de Controle Modernos. 8. ed. Rio de 8aneiro: LTC - Livros


Técnicos e Científicos Editora S.A., 2001. Citado na página 21.

FAIRCHILD. KA78XX/KA78XXA: 3-terminal 1a positive voltage regulator. [S.l.], 2001.


Disponível em: <http://pdf.datasheetcatalog.net/datasheets/228/390068 DS.pdf>. Acesso em:
16/09/2013. Nenhuma citação no texto.

FAIRCHILD. 6-PIN DIP RANDOM-PHASE: Optoisolators triac driver output. [S.l.], 2002.
Disponível em: <http://pdf.datasheetcatalog.com/datasheet/fairchild/MOC3021-M.pdf>.
Acesso em: 16/09/2013. Nenhuma citação no texto.

FAIRCHILD. BC337/338: Switching and amplifier applications. [S.l.], 2002. Disponível em:
<http://pdf.datasheetcatalog.com/datasheet/fairchild/BC337.pdf>. Acesso em: 31/03/2014.
Nenhuma citação no texto.

FAIRCHILD. GENERAL PURPOSE 6-PIN: Phototransistor optocouplers. [S.l.], 2002.


Disponível em: <http://www.datasheetcatalog.org/datasheet/fairchild/4N25.pdf>. Acesso em:
03/05/2013. Nenhuma citação no texto.
Referências 69

FAIRCHILD. 6-PIN DIP RANDOM-PHASE: Optoisolators triac drivers (600 volt peak).
[S.l.], 2004. Disponível em: <http://www.farnell.com/datasheets/301912.pdf>. Acesso em:
22/09/2014. Citado 2 vezes nas páginas 9 e 64.

FAMBRINI, F. Uso de Microcontroladores para Acionamento de Tiristores. 1999. Disponível


em: <http://www.newtoncbraga.com.br/index.php/artigos/54-dicas/5393-col088.html>.
Acesso em: 19/05/2013. Citado na página 34.

INC, M. T. PIC18F2455/2550/4455/4550 Data Sheet: 28/40/44-pin, high-performance,


enhanced flash, usb microcontrollers with nanowatt technology. [S.l.], 2006. Disponível em:
<http://ww1.microchip.com/downloads/en/devicedoc/39632c.pdf>. Acesso em: 05/10/2012.
Citado 4 vezes nas páginas 8, 26, 27 e 28.

INSTRUMENTS, N. Explicando a Teoria PID. 2011. Disponível em: <http://www.ni-


.com/white-paper/3782/pt/>. Acesso em: 07/06/2014. Citado 2 vezes nas páginas 20
e 21.

JÚNIOR, C. J. de O. Controle eletrônico de potência em aquecedores elétricos de passagem


por semi ciclos otimizados. , 2006. Disponível em: <http://www.teses.usp.br/teses/disponiveis-
/3/3143/tde-08122006-150201/pt-br.php>. Citado na página 17.

MACIEL, F. de M. CIRCUITO PARA REGULAGEM DE POTÊNCIA UTILIZANDO TIRISTOR


TRIAC E MICROCONTROLADOR 8051. , 2010. Disponível em: <http://repositorio.uniceub-
.br/bitstream/123456789/1006/1/20317542.pdf>. Acesso em: 15/05/2013. Citado 2 vezes nas
páginas 31 e 32.

MACIEL, M. Utilizando um Sensor de Temperatura - Termistor NTC 10k no PIC. 2012.


Disponível em: <http://www.marcelomaciel.com/2013/03/sensor-ntc-no-pic.html>. Acesso
em: 01/02/2014. Citado 3 vezes nas páginas 8, 30 e 55.

MARTINS, S. B. et al. CONSTRUÇÃO DE UM PROTÓTIPO PARA O CONTROLE DE


TEMPERATURA. , 2010. Disponível em: <http://connepi.ifal.edu.br/ocs/index.php/connepi-
/CONNEPI2010/paper/viewFile/1270/798>. Acesso em: 19/05/2013. Citado 2 vezes nas
páginas 8 e 23.

MIYADAIRA, A. N. Microcontroladores PIC18: aprenda e programe em linguagem C. 1. ed.


São Paulo: Érica, 2009. Citado 8 vezes nas páginas 8, 22, 24, 25, 26, 27, 28 e 29.

MOTOROLA. 6-PIN DIP Random-Phase: Optoisolators triac driver output. [S.l.], 1995.
Disponível em: <http://www.datasheetcatalog.org/datasheet/motorola/MOC3021.pdf>.
Acesso em: 08/05/2013. Nenhuma citação no texto.

MUNIZ, L. B. Sistema de Controle Digital da Temperatura da Água do Chuveiro Elétrico. ,


2009. Disponível em: <http://aldeia3.computacao.net/greenstone/collect/trabalho/index/assoc-
/HASH01cd.dir/doc.pdf>. Acesso em: 02/09/2012. Citado 6 vezes nas páginas 8, 17, 22, 24,
27 e 29.

NISE, N. S. Engenharia de Sistemas de Controle. 3. ed. Rio de Janeiro: LTC - Livros Técnicos
e Científicos Editora S.A., 2002. Citado na página 20.

OGATA, K. Engenharia de Controle Moderno. 5. ed. São Paulo: Pearson Prentice Hall, 2010.
Citado na página 20.
Referências 70

PEREIRA, F. Microcontroladores PIC: Programação em C. 2. ed. São Paulo: Érica, 2003.


Citado na página 30.

RADIO, S. Quick Start Guide: PROTO’n PIC 18F4550 Dev. Board. [S.l.], 2013. Disponível
em: <http://smartradio.com.br/pic/PROTOn/Manual%20PROTOn.pdf>. Acesso em:
20/09/2013. Citado 5 vezes nas páginas 8, 9, 29, 42 e 96.

SANTOS, R. G. Dimmer Microcontrolado com PIC. 2013. Disponível em: <http:-


//labdegaragem.com/forum/topics/dimmer-microcontrolado-com-pic>. Acesso em:
21/01/2014. Nenhuma citação no texto.

SCHMITT, D. et al. Análise de especificação de chuveiro elétrico. , 2007. Disponível em:


<http://143.54.70.55/pss/medterm/20071/G12 ensaio chuveiro eletrico.pdf>. Acesso em:
01/09/2012. Nenhuma citação no texto.

SEMICONDUCTORS, P. Triacs: Bt138 series. [S.l.], 1997. Disponível em: <http://www-


.datasheetcatalog.org/datasheet/philips/BT138-500F.pdf>. Acesso em: 03/05/2013. Nenhuma
citação no texto.

SEMICONDUTOR, N. LM35: Precision centigrade temperature sensors. [S.l.], 2000. Disponí-


vel em: <http://www.datasheetcatalog.org/datasheet2/f/0cku8y3ysqfxcj7j6gur7xljur3y.pdf>.
Acesso em: 08/03/2013. Nenhuma citação no texto.

SEMICONDUTOR, N. LM2907/LM2917: Frequency to voltage converter. [S.l.], 2008.


Disponível em: <http://octopart.com/datasheet/lm2907n-8%2Fnopb-national+semiconductor-
144250-546391>. Acesso em: 15/05/2013. Nenhuma citação no texto.

SIEMENS. Phase Control IC: Tca 785. [S.l.], 1994. Disponível em: <http://www-
.datasheetcatalog.org/datasheet/infineon/1-tca785.pdf>. Acesso em: 08/03/2013. Nenhuma
citação no texto.

SOUZA, D. J. de. Desbravando o PIC: ampliado e atualizado para o PIC 16F628A. 6. ed. São
Paulo: Érica, 2003. Citado 2 vezes nas páginas 24 e 27.

TECNOLOGIA, E. XM118 - Banco de Ensaios em Microcontroladores PIC18F. [S.l.], 2011.


Disponível em: <http://www.exsto.com.br/produto-microcontroladores-e-microprocessadores-
xm118-banco-de-ensaios-em-microcontroladores-pic18f>. Acesso em: 01/06/2014. Citado 2
vezes nas páginas 8 e 58.
Apêndices
72

APÊNDICE A

Código Fonte do Microcontrolador


#include <p18F4550.h>
#include <delays.h>
#include <math.h>

void YourHighPriorityISRCode();
void YourLowPriorityISRCode();
void Board_Init (void);

// para usar gravação bootloader por usb hid


#define PROGRAMMABLE_WITH_USB_HID_BOOTLOADER

#if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)
#define REMAPPED_RESET_VECTOR_ADDRESS 0x1000
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x1008
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x1018

#if defined
(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)||defined
(PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER)

extern void _startup (void); //See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void)
{
_asm goto _startup _endasm
}
#endif
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR (void)
{
_asm goto YourHighPriorityISRCode _endasm
}
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void Remapped_Low_ISR (void)
{
_asm goto YourLowPriorityISRCode _endasm
}

#if defined
(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)||defined
(PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER)

#pragma code HIGH_INTERRUPT_VECTOR = 0x08


void High_ISR (void)
{
_asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
}
#pragma code LOW_INTERRUPT_VECTOR = 0x18
void Low_ISR (void)
{
_asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
}
#endif

#endif

#pragma code

//------------ C O N F I G U R A T I O N B I T S ---------------------------
#pragma config PLLDIV = 5 // (20 MHz crystal on PICDEM FS USB board)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config BORV = 3
#pragma config VREGEN = ON //USB Voltage Regulator
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config XINST = OFF // Extended Instruction Set
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CPB = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRTB = OFF // Boot Block Write Protection
#pragma config WRTC = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTRB = OFF

//DEFINIÇÕES DE TIPOS INTERNAS


#define display PORTD //Saída de dados para o LCD

#define enable PORTAbits.RA5 /*Sinal de enable para o LCD.


Ativo na borda de subida*/

#define RS PORTAbits.RA4 /*Sinal de envio de dados (RS=1)


ou comando (RS=0) para o LCD*/

#define resistencia PORTCbits.RC2 /*Controla o aquecimento


da resistencia do chuveiro*/

#define turbo PORTCbits.RC1 /*Controla a velocidade


da bomba*/

//DECLARAÇÃO DAS VARIÁVEIS GLOBAIS


unsigned char s_temp[5] = {0}, pot[5] = {0}, cons[9] = {0};
unsigned char relogio_banho[8] = {0}, t[5] = {0};
unsigned char p[5] = {0}, pid[3] = {0};
unsigned char sel=0, e=0, sel_pid=0;
unsigned long int AD_MSB, AD_LSB, sensor_temp=0, temp=0;
unsigned long int temp_fav=0, PW=0, pressao=0, pressao_fav=0, consumo=0;
unsigned int t_off=343, periodo=0, t_off_2=343;
unsigned float x=0;
unsigned char fav=0, favorito[1]={0};
unsigned int conta=0, retorna=0;
unsigned long relogio=0, segundo_total=0;
unsigned char segundo=0, minuto=0, hora=0, minuto_ant=0;
float u=0;
char erro=0, derivada_erro=0, memo_erro[100]={0};
int integral_erro=0;
unsigned char kp=0, ki=0, kd=0;
unsigned char atraso_controle=0, conta_controle=0, pid_lcd=0;

//PROTÓTIPO DAS FUNÇÕES


void escreve_rom_lcd(const rom char *string, char tamanho, char linha, char coluna);
void escreve_ram_lcd(const char *string, char tamanho, char linha, char coluna);
void escreve_lcd(char caractere);
unsigned int le_adc(void);
void monitoramento(void);
void set_temp(void);
void set_pressao (void);
void controle(void);
void write_eeprom(void);
void read_eeprom(unsigned char adress);
void seleciona_favorito(void);
void grava_favorito(void);
void bip(unsigned char n_vezes, unsigned int atraso_adicional);
void inicializacao(void);
void lcd_temp(void);
void lcd_pot (void);
void lcd_relogio(void);
void lcd_consumo(void);
void calc_pot(void);
void calc_relogio(void);
void calc_consumo(void);
void mede_temp(void);
void ajuste_pid(void);
void grava_pid(void);
void leitura_pid(void);

//ROTINA DE TRATAMENTO DE INTERRUPÇÃO DE ALTA PRIORIDADE


#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode(){
periodo = 0;
resistencia = 0;
turbo = 0;
INTCONbits.INT0IF = 0; //Limpa flag de interrupção

#if defined(USB_INTERRUPT) //Utilizado pelo BootLoader


USBDeviceTasks(); //Utilizado pelo BootLoader
#endif //Utilizado pelo BootLoader
}

//ROTINA DE TRATAMENTO DE INTERRUPÇÃO DE BAIXA PRIORIDADE


#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode(){
if(periodo<t_off){
resistencia = 0; //Desliga resistencia
}
else{
resistencia = 1; //Liga resistencia
}

if(periodo<t_off_2){
turbo = 0; //Desliga turbo
}
else{
turbo = 1; //Liga turbo
}
periodo++; //Controla a temporização do PWM
relogio++; //Controla a contagem do tempo do relógio

TMR0L = 0; /*Pelo fato de zerar a contagem do TIMER0, devem ser


considerados nos calculos do período do PWM e da
contagem do relogio, os 3us gastos na execução das
instruções da rotina de tratamento da interrupção*/

INTCONbits.TMR0IF = 0; //Limpa flag de interrupção


}

//FUNÇÃO PRINCIPAL
void main(){
TRISA = 0b001111;
PORTA = 0;
TRISD = 0;
PORTD = 0;
TRISE = 0;
PORTE = 0;
TRISC = 0;
PORTC = 0;
TRISB = 255;
INTCON2bits.RBPU = 1; //Desabilta o pull up do PORTB

//Liga o circuito detector de passagem por zero (zero-crossing)


PORTCbits.RC6 = 1;

//Configuração do Timer 0
T0CONbits.T08BIT = 1 ; //8 bits
T0CONbits.T0CS = 0; //Incremento do timer 0 se da pelo ciclo de máquina
T0CONbits.PSA = 1; //Escalonador desabiltado
T0CONbits.TMR0ON = 1; //Habilita o timer 0

//Inicializa LCD
RS = 0;
escreve_lcd(0x38); //8 Vias de dados e duas linhas de 16 caracteres
escreve_lcd(0x06); //Cursor se desloca automaticamente para a direita
escreve_lcd(0x0C); //Ativa o display e inicia o cursor no canto superior esquerdo
Delay10KTCYx(10);

//Configuração do ADC
ADCON1 = 0b001110; //Habilta AN0
ADCON2 = 0b00000110; //Justificado a esquerda /\ TAD = 0 /\ FOSC/64
ADCON0 = 0b00000001; //Habilta o conversor AD e entrada AN0

//Configuração das interrupções


INTCONbits.INT0IE = 1; //Habilita interrupçao de PORTB0
INTCON2bits.INTEDG0 = 1; //Habilta interrupção na borda de subida do PORTB0
INTCONbits.TMR0IE = 1; //Habilita interrupção de estouro do Timer 0
INTCON2bits.TMR0IP = 0; //Configura a interrupção de TMR0 como low Priority
RCONbits.IPEN = 1; //Habilita prioridade de interrupções
INTCONbits.GIEH = 1; //Habilita as interrupções de alta prioridade
INTCONbits.GIEL = 1; //Habilita as interrupções de baixa prioridade

//Configuração da EEPROM
EECON1bits.WREN = 1; //Configura EECON1 para escrita na EEPROM

//Inicialização
inicializacao(); //Exibe a versao do firmware
leitura_pid(); /*Carrega os ganhos (kp, ki, kd e atraso)
do controlador PID gravados na EEPROM*/

//Loop infinito
while(1){
switch(sel){
case(0): monitoramento();
break;
case(1): set_temp();
break;
case(2): set_pressao();
break;
case(3): seleciona_favorito();
break;
default: sel=0;
break;
}
}
}

//-------------------------------------------------------------------------------
////FUNÇÃO PRINCIPAL DE LEITURA E CONTROLE DA TEMPERATURA
void monitoramento(void){
escreve_rom_lcd(" ", 16, 0, 0); //Limpa a linha 1 do LCD
escreve_rom_lcd(" ", 16, 1, 0); //Limpa a linha 2 do LCD
while(PORTBbits.RB1==0){}; //Aguarda soltar o botão

while(sel==0){
mede_temp(); //Medição e calculo da temperatura
if(conta_controle>atraso_controle){ //Atraso para chamar a rotina PID
controle();
conta_controle = 0;
}
conta_controle++;
calc_relogio(); //Efetua o calculo do tempo de banho
if(minuto != minuto_ant){ //Verifica a transições dos minutos
calc_consumo(); //Calcula o consumo do banho
minuto_ant = minuto;
}
lcd_temp(); //Exibe a temperatura no LCD
lcd_pot(); //Exibe a pot. inst. no LCD
lcd_relogio(); //Exibe o tempo de banho no LCD
lcd_consumo(); //Exibe o consumo no LCD

if(PORTBbits.RB2==0 && PORTBbits.RB3==0){ //Conta o tempo de botao acionado


conta=0;
while((PORTBbits.RB2==0 && PORTBbits.RB3==0) && (conta<250)){
conta++;
Delay10KTCYx(12); //Atraso de 1 ms
}
if(conta>=100){ //Verfica se atingiu o tempo minimo
bip(1, 200);
bip(1, 200);
bip(1, 200);
ajuste_pid(); //Ajusta os ganhos do PID
}
}

if(PORTBbits.RB1==0){ //Conta o tempo de botao pressionado


conta=0;
while((PORTBbits.RB1==0) && (conta<250)){
conta++;
Delay10KTCYx(12); //Atraso de 1 ms
}
if(conta>=250){ //Verifica se atingiu o tempo minimo
bip(1, 200);
bip(1, 200);
bip(1, 200);
grava_favorito(); //Grava os set-points na EEPROM
}
else{ //Aciona a rotina de ajuste de temp
sel++;
bip(2, 120);
return;
}
}
}
}

//-------------------------------------------------------------------------------
////FUNÇÃO DE AJUSTE DA TEMPERATURA PELO USUÁRIO ATRAVÉS DO TECLADO
void set_temp(void){
escreve_rom_lcd("AJUSTE TEMP ", 16, 0, 0);
escreve_rom_lcd(" ", 16, 1, 0); //Limpa a linha 2 do LCD
while(PORTBbits.RB1==0){}; //Aguarda soltar o botao
retorna = 0; //Variavel de controle do retorno automatico
while(sel==1){
if(retorna == 30){ //Retorna auto. para a MONITORAMENTO
sel = 0;
return; //Retorna para a funçao MONITORAMENTO
}
retorna++;
if(PORTBbits.RB2==0 && temp<100){ //Incrementa a temp
temp++;
retorna = 0;
bip(1, 20);
}
if(PORTBbits.RB3==0 && temp>0){ //Decrementa a temp
temp--;
retorna = 0;
bip(1, 20);
}
t[0] = temp/100 + 0x30; //Centena
t[1] = (temp%100)/10 + 0x30; //Dezena
t[2] = temp %10 + 0x30; //Unidade
t[3] = 0xDF; //º
t[4] = 0x43; //C
escreve_ram_lcd(t, 5, 1, 0);

if(PORTBbits.RB1==0){ //Aciona rotina de ajuste de pressao


sel++;
bip(2, 120);
return;
}
}
}

//-------------------------------------------------------------------------------
////FUNÇÃO DE AJUSTE DA PRESSAO PELO USUÁRIO ATRAVÉS DO TECLADO
void set_pressao (void){
escreve_rom_lcd("AJUSTE PRESSAO ", 16, 0, 0);
escreve_rom_lcd(" ", 16, 1, 0); //Limpa a linha 2 do LCD
while(PORTBbits.RB1==0){}; //Aguarda soltar o botão
retorna = 0; //Variavel de controle do retorno automatico
while(sel==2){
if(retorna == 30){ //Retorna auto. para a MONITORAMENTO
sel = 0;
return; //Retorna para a funçao MONITORAMENTO
}
retorna++;
if(PORTBbits.RB2==0 && pressao<100){ //Incrementa pressao
pressao++;
retorna = 0;
bip(1, 20);
}
if(PORTBbits.RB3==0 && pressao>0){ //Decrementa pressao
pressao--;
retorna = 0;
bip(1, 20);
}
t_off_2 = 343 - ((pressao*343)/100); //Calcula o duty
if(t_off_2>300){ //Limita a potencia minima entregue a pressurizador
t_off_2 = 343;
}
p[0] = pressao/100 + 0x30; //Centena
p[1] = (pressao%100)/10 + 0x30; //Dezena
p[2] = pressao%10 + 0x30; //Unidade
p[3] = 0x9C; //Espaço
p[4] = 0X25; //Simbolo de %
escreve_ram_lcd(p, 5, 1, 0);
if(PORTBbits.RB1==0){ //Aciona a rotina de leitura de fav.
sel++;
bip(2, 120);
return;
}
}
}

//--------------------------------------------------------------------------------
////ALGORITMO DE CONTROLE PID DE TEMPERATURA EM MALHA FECHADA
void controle(void){
unsigned char pos_erro=0; //Posicao de gravacao do erro
erro = temp - sensor_temp; //Calc. do erro
memo_erro[e] = erro; //Grava o erro no vetor
integral_erro = 0;
for(pos_erro=0; pos_erro<100; pos_erro++){ //Calcula int. do erro
integral_erro = integral_erro + memo_erro[pos_erro];
}
if(e>0){ //Calcula a derivada do erro
derivada_erro = memo_erro[e] - memo_erro[e-1];
}
else{
derivada_erro = memo_erro[e] - memo_erro[99];
}

/*********** Algoritmo PID ***********/


u = ((float)kp/400) * erro;
u = u + (((float)ki/40000) * integral_erro);
u = u + (((float)kd/400) * derivada_erro);

if(u>1){ //Impede que o ganho seja maior que 1


u = 1;
}
if(u<0){ //Impede que o ganho seja menor que 0
u = 0;
}
t_off = 343 - (float)(343*u); //Calcula o duty

e++; //Controla a posicao de gravação do erro no vetor


if(e>=100){
e = 0;
}
}

//-------------------------------------------------------------------------------
////FUNÇÃO DE SELEÇÃO DOS FAVORITOS PRÉ-GRAVADOS PELO USUÁRIO
void seleciona_favorito(void){
retorna = 0; //Variavel de controle do retorno automatico
escreve_rom_lcd("SELECIONA FAV ", 16, 0, 0);
escreve_rom_lcd("(T= ) (P= )", 16, 1, 0);
while(PORTBbits.RB1==0){}; //Aguarda soltar o botão
while(sel==3){
if(retorna == 50){ //Retorna auto. para a MONITORAMENTO
sel = 0;
return; //Retorna para a funçao MONITORAMENTO
}
retorna++;

if(PORTBbits.RB2==0 && fav<9){ //Incrementa o fav


fav++;
bip(1, 20);
retorna = 0;
}
if(PORTBbits.RB3==0 && fav>0){ //Decrementa o fav
fav--;
bip(1, 20);
retorna = 0;
}
favorito[0] = fav + 0x30; //Transforma em vetor para exibir no lCD
escreve_ram_lcd(favorito, 1, 0, 14);
read_eeprom(fav); //Leitura do fav gravado na EEPROM
t[0] = temp_fav/100 + 0x30; //Centena da temp
t[1] = (temp_fav%100)/10 + 0x30; //Dezena da temp
t[2] = temp_fav %10 + 0x30; //Unidade da temp
p[0] = pressao_fav/100 + 0x30; //Centena da pressao
p[1] = (pressao_fav%100)/10 + 0x30; //Dezena da pressao
p[2] = pressao_fav%10 + 0x30; //Unidade da pressao
escreve_ram_lcd(t, 3, 1, 3);
escreve_ram_lcd(p, 3, 1, 11);
if(PORTBbits.RB1==0){ //Conta o tempo de botão acionado
conta = 0;
while((PORTBbits.RB1==0) && (conta<250)){
conta++;
Delay10KTCYx(12); //Atraso de 1 ms
}
if(conta>=250){ //Verifica se atingiu o tempo minimo
escreve_rom_lcd("CARREGANDO... ", 16, 0, 0);
temp = temp_fav; //Carrega o set-point de temperatura
pressao = pressao_fav; //Carrega o set-point de pressao
t_off_2 = 343 - ((pressao*343)/100); //Calcula o duty da pressao
if(t_off_2>300){
t_off_2 = 343;
}

bip(1, 200);
bip(1, 200);
bip(1, 1000);

else{ //Volta para a rotina de monitoramento


bip(2, 120);
}
sel=0;
return;
}
}
}

//-------------------------------------------------------------------------------
////FUNÇÃO DE GRAVAÇÃO DOS FAVORITOS NA EEPROM
void grava_favorito(void){
retorna = 0; //Variavel de controle do retorno automatico
escreve_rom_lcd("GRAVAR NO FAV ", 16, 0, 0);
escreve_rom_lcd("(T= ) (P= )", 16, 1, 0);
while(PORTBbits.RB1==0){}; //Aguarda soltar o botao
while(1){
if(retorna == 30){ //Retorna auto. para a MONITORAMENTO
escreve_rom_lcd(" ", 16, 0, 0); //Limpa a linha 1 do LCD
escreve_rom_lcd(" ", 16, 1, 0); //Limpa a linha 2 do LCD
sel = 0;
return; //Retorna para a funçao MONITORAMENTO
}
retorna++;

if(PORTBbits.RB2==0 && fav<9){ //Incrementa o fav


fav++;
bip(1, 20);
retorna = 0;
}
if(PORTBbits.RB3==0 && fav>0){ //Decrementa o fav
fav--;
bip(1, 20);
retorna = 0;
}
favorito[0] = fav + 0x30; //Transforma em vetor para exibir no LCD
escreve_ram_lcd(favorito, 1, 0, 14);
read_eeprom(fav); //Le o valor que já está gravado na EEPROM
t[0] = temp_fav/100 + 0x30; //Centena da temp
t[1] = (temp_fav%100)/10 + 0x30; //Dezena da temp
t[2] = temp_fav %10 + 0x30; //Unidade da temp
p[0] = pressao_fav/100 + 0x30; //Centena da pressao
p[1] = (pressao_fav%100)/10 + 0x30; //Dezena da pressao
p[2] = pressao_fav%10 + 0x30; //Unidade da pressao
escreve_ram_lcd(t, 3, 1, 3);
escreve_ram_lcd(p, 3, 1, 11);
if(PORTBbits.RB1==0){ //Grava o novo valor somente de RB1 for pressionado
write_eeprom(); //Grava o novo valor
read_eeprom(fav); //Le o novo valor e escreve no LCD
t[0] = temp_fav/100 + 0x30; //Centena da temp
t[1] = (temp_fav%100)/10 + 0x30; //Dezena da temp
t[2] = temp_fav %10 + 0x30; //Unidade da temp
p[0] = pressao_fav/100 + 0x30; //Centena da pressao
p[1] = (pressao_fav%100)/10 + 0x30; //Dezena da pressao
p[2] = pressao_fav%10 + 0x30; //Unidade da pressao
escreve_ram_lcd(t, 3, 1, 3);
escreve_ram_lcd(p, 3, 1, 11);
bip(2, 1200);
escreve_rom_lcd(" ", 16, 0, 0); //Limpa a linha 1 do LCD
escreve_rom_lcd(" ", 16, 1, 0); //Limpa a linha 2 do LCD
return; //Retorna para a função MONITORAMENTO
}
}
}

//-------------------------------------------------------------------------------
////FUNÇÃO DE AJUSTE DO PID
void ajuste_pid(void){
retorna = 0; //Variavel de controle do retorno automatico
escreve_rom_lcd(" ", 16, 0, 0); //Limpa a linha 1 do LCD
escreve_rom_lcd(" ", 16, 1, 0); //Limpa a linha 2 do LCD
while(PORTBbits.RB2==0 || PORTBbits.RB3==0){}; //Aguarda soltar o botão

while(1){
if(retorna == 30){ //Retorna auto. para a MONITORAMENTO
escreve_rom_lcd(" ", 16, 0, 0); //Limpa a linha 1 do LCD
escreve_rom_lcd(" ", 16, 1, 0); //Limpa a linha 2 do LCD
sel = 0;
return; //Retorna para a funçao MONITORAMENTO
}
retorna++;

if(PORTBbits.RB1==0){
retorna = 0;
conta=0;
while((PORTBbits.RB1==0) && (conta<250)){ //Conta o tempo de botao acionado
conta++;
Delay10KTCYx(12); //Atraso de 1 ms
}
if(conta>=100){ //Verfica se atingiu o tempo minimo
grava_pid(); //Grava os ganhos na EEPROM
bip(5, 1000);
escreve_rom_lcd(" ", 16, 0, 0); //Limpa a linha 1 do LCD
escreve_rom_lcd(" ", 16, 1, 0); //Limpa a linha 2 do LCD
return;
}
else{
if(sel_pid<3){ //Seleciona qual ganho sera ajustado
}
}
else{
sel_pid = 0;
}
bip(2, 120);
}
}
if(sel_pid == 0){ //Ajusta o ganho KP
escreve_rom_lcd("KP ", 16, 0, 0);
pid_lcd = kp;
}
if(sel_pid == 1){ //Ajusta o ganho KI
escreve_rom_lcd("KI ", 16, 0, 0);
pid_lcd = ki;
}
if(sel_pid == 2){ //Ajusta o ganho KD
escreve_rom_lcd("KD ", 16, 0, 0);
pid_lcd = kd;
}
if(sel_pid == 3){ //Ajusta o atraso no controle PID
escreve_rom_lcd("Periodo Control.", 16, 0, 0);
pid_lcd = atraso_controle;
}

if(sel_pid==0 && PORTBbits.RB2==0){ //Incrementa KP


kp++;
retorna = 0;
}
if(sel_pid==0 && PORTBbits.RB3==0){ //Decrementa KP
kp--;
retorna = 0;
}
if(sel_pid==1 && PORTBbits.RB2==0){ //Incrementa KI
ki++;
retorna = 0;
}
if(sel_pid==1 && PORTBbits.RB3==0){ //Decrementa KI
ki--;
retorna = 0;
}
if(sel_pid==2 && PORTBbits.RB2==0){ //Incrementa KD
kd++;
retorna = 0;
}
if(sel_pid==2 && PORTBbits.RB3==0){ //Decrementa KD
kd--;
retorna = 0;
}
if(sel_pid==3 && PORTBbits.RB2==0){ //Incrementa atraso
atraso_controle++;;
retorna = 0;
}
if(sel_pid==3 && PORTBbits.RB3==0){ //Decrementa atraso
atraso_controle--;
retorna = 0;
}
pid[0] = pid_lcd/100 + 0x30; //Centena
pid[1] = (pid_lcd%100)/10 + 0x30; //Dezena
pid[2] = pid_lcd %10 + 0x30; //Unidade
escreve_ram_lcd(pid, 3, 1, 0);

}
}

//-------------------------------------------------------------------------------
////MEDICAO DA TEMPERATURA
void mede_temp(void){
char m=0;
float res_ntc=0; //Resistencia do ntc
float aux_linear=0, aux_linear1=0; //Auxilia no calculo da temperatura

//Media das medições do ntc


for(m=0; m<10; m++){
le_adc();
res_ntc = res_ntc + AD_MSB;
}
res_ntc = res_ntc/10;

//Calculo da resistencia do ntc


res_ntc= (res_ntc*5)/1023; //Tranforma o valor lido para tensão
res_ntc = (50000/res_ntc) - 10000; //Calcula o divisor de tensão

//Calculo da temperatura (curva experimental) <--> y = -15*ln(x) + 163,01


aux_linear = log(res_ntc); //ln(x)
aux_linear1 = 163.01 - (15*aux_linear); //163,01 - (15*ln(x))
//Transforma o valor float em unsigned long int para ser exibido pelo LCD
sensor_temp = aux_linear1;
}

//-------------------------------------------------------------------------------
////ACIONAMENTO DO BIP
void bip(unsigned char n_vezes, unsigned int atraso_adicional){
unsigned int b=0;

for(b=0; b<n_vezes; b++){


PORTCbits.RC7 = 1;
Delay10KTCYx(50);
PORTCbits.RC7 = 0;
Delay10KTCYx(50);
}

for(b=0; b<atraso_adicional; b++){


Delay10KTCYx(1); //Atraso de 0.833
}
}

//-------------------------------------------------------------------------------
////EXIBE A VERSAO DO FIRMWARE AO INICIAIR O SISTEMA
void inicializacao(void){
escreve_rom_lcd(" ", 16, 0, 0);
escreve_rom_lcd(" ", 16, 1, 0);
escreve_rom_lcd("CHUVEIRO DIGITAL", 16, 0, 0);
escreve_rom_lcd("REV. 24 ", 16, 1, 0);
bip(5, 1000);
escreve_rom_lcd(" ", 16, 0, 0);
escreve_rom_lcd(" ", 16, 1, 0);
}

//------------------------------------------------------------------------------
////EXIBE NO LCD A TEMPERATURA DA ÁGUA
void lcd_temp(void){
s_temp[0] = (sensor_temp/100) + 0x30; //Centena
s_temp[1] = (sensor_temp%100)/10 + 0x30; //Dezena
s_temp[2] = sensor_temp%10 + 0x30; //Unidade
s_temp[3] = 0xDF; //º
s_temp[4] = 0x43; //C
escreve_ram_lcd(s_temp, 5, 1, 0);
}

//-------------------------------------------------------------------------------
////EXIBE NO LCD A POTENCIA INSTANTANEA CONSUMIDA PELA RESISTENCIA
void lcd_pot(void){
calc_pot(); //Calcula a potencia instantanea
pot[0] = PW/1000 + 0x30; //Milhar
pot[1] = (PW%1000)/100 + 0x30; //Centena
pot[2] = (PW%100)/10 + 0x30; //Dezena
pot[3] = (PW%10) + 0x30; //Unidade
pot[4] = 0x57; //W
escreve_ram_lcd(pot, 5, 0, 11);
}

//------------------------------------------------------------------------------
////CALCULO DA POTENCIA CONSUMIDA PELA RESISTENCIA
void calc_pot(void){
x = 0.0091734505*t_off; //0.0091...é o angulo de disparo minimo
x = 5134*(x-(0.5*sin(2*x)));
x = x/2.932545455; //2.93...é o valor estimado da resistencia em Ohm
PW = 5500 - x;
}

//--------------------------------------------------------------------------------
/////EXIBE O TEMPO DE BANHO
void lcd_relogio(void){
relogio_banho[0] = hora/10 + 0X30;
relogio_banho[1] = hora%10 + 0X30;
relogio_banho[2] = 0X3A; //:
relogio_banho[3] = minuto/10 + 0X30;
relogio_banho[4] = minuto%10 + 0X30;
relogio_banho[5] = 0X3A; //:
relogio_banho[6] = segundo/10 + 0X30;
relogio_banho[7] = segundo%10 + 0X30;
escreve_ram_lcd(relogio_banho, 8, 0, 0);
}

//-------------------------------------------------------------------------------
////CALCULO DO TEMPO DE BANHO
void calc_relogio(void){
segundo_total = (relogio/40137); /*40137 é o valor estimado
da variável relógio para um segundo de contagem*/

hora = segundo_total/3600;
minuto = (segundo_total%3600)/60;
segundo = (segundo_total%3600)%60;
}

//-------------------------------------------------------------------------------
////CALCULA O CONSUMO
void calc_consumo (void){
calc_pot(); //Amostra a potencia instantanea
consumo = consumo + (PW/60); /*A pot. inst. é dividida por 60,
pois a amostragem é feita a cada 1 minuto*/
}

//-------------------------------------------------------------------------------
////EXIBE O CONSUMO NO LCD
void lcd_consumo(void){
cons[0] = (consumo/10000) + 0x30;
cons[1] = (consumo%10000)/1000 + 0x30;
cons[2] = 0x2E; // ponto
cons[3] = (consumo%1000)/100 + 0x30;
cons[4] = (consumo%100)/10 + 0x30;
cons[5] = 0x6B; // k
cons[6] = 0x57; // W
cons[7] = 0x2F; // /
cons[8] = 0x68; // h
escreve_ram_lcd(cons, 9, 1, 7);
}

//-------------------------------------------------------------------------------
////ESCRITA DE NUMEROS NO LCD
void escreve_ram_lcd(const char *string, char tamanho, char linha, char coluna){
char i;
coluna = coluna & 0x0F; //Preserva apenas o 4 bits de LSB
if (linha == 0){
coluna = coluna +0x80; //linha 0
}
else{
coluna = coluna+0xC0; //linha 1
}
RS = 0; //Habilita o LCD para comandos
display = coluna; //Informa a posicao de escrita
enable = 1;
Delay10KTCYx(10);
enable = 0;
RS = 1; //Habilita o LCD para dados
for(i=0; i<tamanho; i++){ //Envia os caracteres
escreve_lcd (string[i]);
}
}

//------------------------------------------------------------------------------
////ESCRITA DE PALAVRAS NO LCD
void escreve_rom_lcd(const rom char *string, char tamanho, char linha, char coluna){
char i;
coluna = coluna & 0x0F; //Preserva apenas o 4 bits de LSB
if (linha == 0){
coluna = coluna +0x80; //linha 0
}
else{
coluna = coluna+0xC0; //linha 1
}
RS = 0; //Habilita o LCD para comandos
display = coluna; //Informa a posicao de escrita
enable = 1;
Delay10KTCYx(10);
enable = 0;
RS = 1; //Habilita o LCD para dados
for(i=0; i<tamanho; i++){ //Envia os caracteres
escreve_lcd (string[i]);
}
}

//-------------------------------------------------------------------------------
////ESCRITA DOS CARACTERES NO LCD
void escreve_lcd(char caractere){
display = caractere;
enable = 1;
Delay10KTCYx(10);
enable = 0;
}

//-------------------------------------------------------------------------------
//LEITURA DO ADC

unsigned int le_adc(void){


unsigned int ADC;

ADCON0bits.GO_NOT_DONE = 1; //Da partida na conversão


while(ADCON0bits.GO_NOT_DONE !=0); /*Espera a conversão terminar para
continuar a execução do programa*/

AD_MSB = ADRESH ; //Lê os oito MSBs


AD_MSB = AD_MSB*4; //Desloca duas casas para esquerda
AD_LSB = ADRESL; //Lê os dois LSBs
AD_LSB = (AD_LSB&0B11000000)/64; //Desloca 6 casas para a direita
ADC = AD_MSB + AD_LSB; /*Transforma os
oito bits de ADRESH e os dois bits de ADRESl em um unico número de 10 bits*/

return (ADC);
}

//-------------------------------------------------------------------------------
////ESCRITA DE FAVORITOS NA EEPROM
void write_eeprom(void){
escreve_rom_lcd("GRAVANDO... ", 16, 0, 0);
EEADR = fav; //Configura o endereço de escrita
EEDATA = temp;
INTCONbits.GIEH = 0; //Desabilita as interrupções de alta prioridade
INTCONbits.GIEL = 0; //Desabilita as interrupções de baixa prioridade
EECON2 = 0X55; //Senha de escrita na EEPROM
EECON2 = 0XAA;
EECON1bits.WR = 1; //Inicia a escrita na EEPROM
while(EECON1bits.WR){}; //Aguarda o término da última escrita
EEADR = EEADR+10; //Incrementa o endereço da EEPROM
EEDATA = pressao;
EECON2 = 0X55; //Senha de escrita na EEPROM
EECON2 = 0XAA;
EECON1bits.WR = 1; //Inicia a escrita na EEPROM
while(EECON1bits.WR){}; //Aguarda o término da última escrita
INTCONbits.GIEH = 1; //Habilita as interrupções de alta prioridade
INTCONbits.GIEL = 1; //Habilita as interrupções de baixa prioridade
PIR2bits.EEIF = 0; //Limpa o flag de interrupção da EEPROM
}

//-------------------------------------------------------------------------------
////lEITURA DE FAVORITOS NA EEPROM
void read_eeprom(unsigned char adress){
EEADR = adress; //Endereço de leitura da EEPROM
EECON1bits.RD = 1; //Leitura dos dados
temp_fav = EEDATA;
EEADR = adress+10; //Endereço de leitura da EEPROM
EECON1bits.RD = 1; //Leitura dos dados
pressao_fav = EEDATA;
}

//-------------------------------------------------------------------------------
////GRAVACAO DO PID NA EEPROM
void grava_pid(void){
escreve_rom_lcd("GRAVANDO... ", 16, 0, 0);
EEADR = 20; //Configura o endereço de escrita
EEDATA = kp;
INTCONbits.GIEH = 0; //Desabilita as interrupções de alta prioridade
INTCONbits.GIEL = 0; //Desabilita as interrupções de baixa prioridade
EECON2 = 0X55; //Senha de escrita na EEPROM
EECON2 = 0XAA;
EECON1bits.WR = 1; //Inicia a escrita na EEPROM
while(EECON1bits.WR){}; //Aguarda o término da última escrita
EEADR = 21; //Configura o endereço de escrita
EEDATA = ki;
EECON2 = 0X55; //Senha de escrita na EEPROM
EECON2 = 0XAA;
EECON1bits.WR = 1; //Inicia a escrita na EEPROM
while(EECON1bits.WR){}; //Aguarda o término da última escrita
EEADR = 22; //Configura o endereço de escrita
EEDATA = kd;
EECON2 = 0X55; //Senha de escrita na EEPROM
EECON2 = 0XAA;
EECON1bits.WR = 1; //Inicia a escrita na EEPROM
while(EECON1bits.WR){}; //Aguarda o término da última escrita
EEADR = 23; //Configura o endereço de escrita
EEDATA = atraso_controle;
EECON2 = 0X55; //Senha de escrita na EEPROM
EECON2 = 0XAA;
EECON1bits.WR = 1; //Inicia a escrita na EEPROM
while(EECON1bits.WR){}; //Aguarda o término da última escrita
INTCONbits.GIEH = 1; //Habilita as interrupções de alta prioridade
INTCONbits.GIEL = 1; //Habilita as interrupções de baixa prioridade
PIR2bits.EEIF = 0; //Limpa o flag de interrupção da EEPROM
}

//-------------------------------------------------------------------------------
////LEITURA DO PID PRE-CONFIGURADO
void leitura_pid(void){
EEADR = 20; //Endereço de leitura da EEPROM
EECON1bits.RD = 1; //Leitura da EEPROM
kp = EEDATA;
EEADR = 21; //Endereço de leitura da EEPROM
EECON1bits.RD = 1; //Leitura da EEPROM
ki = EEDATA;
EEADR = 22; //Endereço de leitura da EEPROM
EECON1bits.RD = 1; //Leitura da EEPROM
kd = EEDATA;
EEADR = 23; //Endereço de leitura da EEPROM
EECON1bits.RD = 1; //Leitura da EEPROM
atraso_controle = EEDATA;
}
88

APÊNDICE B

Esquema Elétrico do Circuito Lógico


APÊNDICE B. Esquema Elétrico do Circuito Lógico 89

Figura 39 – Esquema elétrico completo do circuito lógico


90

APÊNDICE C

Esquema Elétrico do Circuito de Potência


APÊNDICE C. Esquema Elétrico do Circuito de Potência 91

Figura 40 – Esquema elétrico completo do circuito de potência


92

APÊNDICE D

Esquema Elétrico do Circuito


Zero-Crossing
APÊNDICE D. Esquema Elétrico do Circuito Zero-Crossing 93

Figura 41 – Esquema elétrico completo do circuito detector de passagem por zero


Anexos
95

ANEXO A

Esquema Elétrico do Kit de


Desenvolvimento PROTO’n PIC18F4550○
R
ANEXO A. Esquema Elétrico do Kit de Desenvolvimento PROTO’n PIC18F4550○
R
96

Figura 42 – Esquema elétrico kit de desenvolvimento (RADIO, 2013)

Você também pode gostar