Anda di halaman 1dari 118

UNIVERSIDADE FEEVALE

MARCOS JOS MOSSMANN

DESENVOLVIMENTO DE PROTTIPO PARA VERIFICAO DE


CARACTERSTICAS E VALIDAO DE MOTORES ELTRICOS
DC

Novo Hamburgo, dezembro de 2013.


MARCOS JOS MOSSMANN

DESENVOLVIMENTO DE PROTTIPO PARA VERIFICAO DE


CARACTERSTICAS E VALIDAO DE MOTORES ELTRICOS
DC

Universidade Feevale
Instituto de Cincias Exatas e Tecnolgicas - ICET
Bacharelado em Engenharia Eletrnica
Trabalho de Concluso de Curso

Professor Orientador: Delfim Luiz Torok

Novo Hamburgo, dezembro de 2013.


FOLHA DE APROVAO
Dedico este Trabalho aos meus pais, Jos e Miriam, a minha

esposa Tatiana e tambm meu amigo Ireno Reis.


AGRADECIMENTO

Agradeo inicialmente aos meus pais, que sempre me incentivaram a estudar e a buscar

novos conhecimentos. Por todo apoio que sempre me deram, no medindo esforos para me

ajudar, mesmo nos momentos mais difceis. Vocs so meu porto seguro, meu exemplo de vida.

Agradeo tambm a minha esposa, Tatiana que sempre me apoia e entende a

necessidade de dedicar tempo aos estudos. Pela pacincia de ter que abrir mo de alguns

passeios e at mais tempo juntos para auxiliar nessa conquista. No posso deixar de agradecer

tambm a Feevale, que me trouxe novos amigos e me apresentou minha esposa.

Tambm no posso deixar de agradecer em especial ao Ireno Reis e sua esposa, Maria

Reis. Seu apoio foi fundamental para esta conquista. Muito mais do que do que nossa relao

profissional vocs so grandes amigos.

Obrigado tambm a todos os professores que ensinaram no apenas o contedo do

curso, mas tambm a buscar conhecimentos. Agradeo em especial ao meu orientador deste

trabalho, o professor Delfim Luis Torok.


5

Agradeo aos meus colegas de curso, que ao longo desta jornada contriburam para

minha formao, muitas vezes, apenas com momentos de descontrao e alegria, que so to

importantes para um indivduo, e tambm nas ocasies em que os desafiadores trabalhos nos

uniram para aprender em conjunto. Agradeo em especial ao Thomas Johann e ao Anderson

Ruwer, que muito mais que colegas se tornaram amigos.

Por fim, agradeo a todos que, de uma forma ou de outra, me ajudaram nesta conquista

to importante.

Obrigado.
RESUMO

O presente Trabalho apresenta o estudo e desenvolvimento de um prottipo para

aquisio de caractersticas de motores eltricos de corrente contnua e utilizao destas

informaes para aprovao ou reprovao dos motores, indicando o motivo da falha.

Apresenta bases tericas sobre motores eltricos de corrente contnua, anlises de vibrao,

displays de cristal lquido, microcontroladores, acelermetros, teclados matriciais, sensores de

corrente e de rotao. Apresenta o ambiente de programao em Linguagem C e o programa

comentado utilizado no prottipo. Explica e exemplifica o funcionamento de cada circuito e

cada rotina de programa, relatando seu funcionamento. Demonstra os testes prticos realizados

para validao do prottipo, com respectivas imagens e grficos. As caractersticas medidas dos

motores so corrente, rotao, tenso e vibrao via acelermetro. A informao de aprovao

ou rejeio realizada via display. A parametrizao das informaes realizada via teclado

matricial.

Palavras-Chave: Microcontrolador; acelermetro; display de cristal lquido; motores

de corrente continua; vibrao.


ABSTRACT

This paper presents the study and development of a prototype for characteristics

acquisition of direct current (DC) electric motors and use this information for approval or

disapproval of the motor, indicating the reason for failure. Presents theoretical foundations on

DC electric motors, vibration analysis, liquid crystal displays, microcontrollers, accelerometers,

matrix keyboards, current sensors and rotation. Presents the programming environment for the

C language program and commented on the prototype used. Explains and demonstrates the

operation of each circuit and each program routine, reporting its functioning. Demonstrates the

practical tests for validation of the prototype, with their images and graphics. The measured

features are current, speed, voltage and vibration with accelerometer. The approval or rejection

information is performed by a display. The parameterization of the information is carried out

by a keyboard matrix.

Keywords: Microcontroller; accelerometer; liquid crystal display; DC motors;

vibration.
LISTA DE FIGURAS

Figura 1.1 Desenho (a) e foto (b) de um motor CC de 2 polos. ............................................ 17


Figura 1.2 Foto de um sistema mecnico de comutao. ...................................................... 18
Figura 1.3 Esquemtico simples do princpio de funcionamento de mquina CC. ............... 19
Figura 1.4 Desenho esquemtico de motor CC. .................................................................... 21
Figura 1.5 Grfico de curvas caractersticas de motores cc. ................................................. 22
Figura 1.6 Grfico dos limites de Vibrao. .......................................................................... 29
Figura 1.7 Imagem com esquemtico de acelermetro piezeltrico. .................................... 31
Figura 1.8 Representao das posies do acelermetro. ..................................................... 32
Figura 1.9 Grfico da curva de tenso gerada pelo acelermetro. ........................................ 33
Figura 1.10 Representao de um acelermetro de 3 eixos. ................................................. 33
Figura 1.11 Representao com exemplos de placas de capacitores. .................................... 34
Figura 1.12 Representao de arranjo de um acelermetro de capacitncia. ........................ 34
Figura 1.13 Bloco diagrama de controle de motor por sensor de corrente. ........................... 35
Figura 1.14 Ilustrao de princpio de funcionamento de sensor ptico difuso. ................... 38
Figura 1.15 Princpio de operao do sensor ptico retro reflexivo. ..................................... 39
Figura 1.16 Clculo de clock e taxa de amostragem para converso A/D. ........................... 46
Figura 1.17 Diagrama de pinos do dsPIC30F4013................................................................ 50
Figura 1.18 Representao de uma clula com o caracter A. ................................................ 51
Figura 1.19 Quadro com representao do endereamento para display 20x04. .................. 53
Figura 1.20 Imagem de teclado 4x4 e esquema de ligao das teclas. .................................. 54
Figura 1.21 Esquemas dos teclados com resistores de pull-up (a) e pull-down (b) e
respectivos sinais de varredura. ................................................................................................ 55
Figura 2.1 Diagrama de blocos do prottipo. ........................................................................ 56
Figura 2.2 Esquemtico do Mdulo de Controle................................................................... 59
Figura 2.3 Foto da montagem do Mdulo de Controle. ........................................................ 60
Figura 2.4 Esquemtico de ligao do acelermetro e rel. .................................................. 61
Figura 2.5 Foto do acelermetro sobre placa de circuito impresso. ...................................... 62
Figura 2.6 Foto do acelermetro fixado ao motor sob teste. ................................................. 62
Figura 2.7 Esquemtico da medio de corrente e tenso. .................................................... 63
Figura 2.8 Imagem de curva de tenso de sada. ................................................................... 64
Figura 2.9 Imagem com esquema de aplicao tpica do sensor de corrente. ....................... 64
Figura 2.10 Foto da placa prottipo de aquisio de tenso e corrente. ................................ 65
Figura 2.11 Esquemtico de circuito do sensor de rotao. .................................................. 66
Figura 2.12 Sensor de rotao fixado carcaa do motor. ..................................................... 67
Figura 2.13 Esquemtico da ligao do Display. .................................................................. 68
Figura 2.14 Esquemtico de ligao do teclado matricial. .................................................... 69
Figura 2.15 Foto da parte interna do prottipo. ..................................................................... 70
9

Figura 2.16 Foto da parte frontal do prottipo. ..................................................................... 70


Figura 2.17 Foto da parte de trs do prottipo. ..................................................................... 71
Figura 2.18 Imagem da tela inicial do MPLAB X da Microchip. ......................................... 72
Figura 2.19 Fluxo bsico do software. .................................................................................. 81
Figura 3.1 Foto com forma de onda do sinal do sensor de rotao. ...................................... 88
Figura 3.2 Foto do acelermetro posicionado. ...................................................................... 88
Figura 3.3 Foto da indicao de zeramento do acelermetro. ............................................... 89
Figura 3.4 Foto da indicao com o acelermetro girado em y. ........................................... 89
Figura 3.5 Apresentao do Display aps final do teste........................................................ 90
LISTA DE TABELAS

Tabela 1.1 Representao das Unidades de Vibrao. .......................................................... 26


Tabela 1.2 Descrio das funes dos pinos do LCD. .......................................................... 52
Tabela 3.1 Comparativo entre Tenses. ................................................................................ 85
Tabela 3.2 Comparativo de Valores de Corrente. ................................................................. 86
Tabela 3.3 Analise dos dados da Tabela 3.2.......................................................................... 86
Tabela 3.4 Resultados de Medio de RPM. ......................................................................... 87
LISTA DE ABREVIATURAS E SIGLAS

ABNT Associao Brasileira de Normas Tcnicas


ADC Conversores Analgicos e Digitais
CC Corrente Contnua
CPU Unidade Central de Processamento
DAC Conversores Digitais e Analgicos
DSP Digital Signal Controller
DSPIC Digital Signal Processor Peripherical Interface Controller
MCU Microcontroller Unit
MHz Mega-hertz
MIPS Milhes de Instrues por Segundo
NBR Norma Brasileira
PWM Modulao por Largura de Pulso
RPM Rotaes por Minuto
SAR Registrador de Aproximao Sucessiva
TCC Trabalho de Concluso de Curso
UART Universal Asynchronous Receiver Transmitter
SUMRIO

INTRODUO ...................................................................................................................... 14

1 MTODOS E COMPONENTES .................................................................................. 16

1.1 Motores Eltricos de Corrente Contnua .................................................................. 16


1.1.1 Aspectos Construtivos ........................................................................................ 17
1.1.2 Princpio de Funcionamento ............................................................................... 19
1.2 Anlise Vibracional .................................................................................................. 23
1.2.1 Anlise Espectral ................................................................................................ 24
1.2.2 Formas de Medir a Vibrao .............................................................................. 25
1.2.3 Normas Assossiadas ........................................................................................... 28
1.3 Sensores .................................................................................................................... 30
1.3.1 Acelermetros ..................................................................................................... 30
1.3.1.1 Acelermetro de Material Piezeltrico .......................................................... 31
1.3.1.2 Acelermetro de Capacitncia ....................................................................... 33
1.3.2 Sensor de Corrente ............................................................................................. 35
1.3.2.1 Sensor por Resistncia de Derivao ............................................................. 36
1.3.2.2 Sensor de Efeito Hall ..................................................................................... 37
1.3.3 Sensores de Rotao ........................................................................................... 37
1.4 Microcontroladores ................................................................................................... 39
1.4.1 Processador Digital de Sinais ............................................................................. 41
1.4.2 Ciclos de Mquinas do Processador Digital de Sinais ....................................... 42
1.4.3 Temporizadores .................................................................................................. 42
1.4.4 Transmissor e Receptor Universal Assncrono .................................................. 43
1.4.5 Conversor Analgico Digital .............................................................................. 44
1.4.6 Modulao por Largura de Pulso ....................................................................... 46
1.4.7 Interrupes ........................................................................................................ 47
1.4.8 Interrupo Externa ............................................................................................ 48
1.4.9 Interrupo de Timer .......................................................................................... 48
1.4.10 Interrupo de Recepo Serial .......................................................................... 49
1.4.11 Interrupo de Converso Analgica Digital ..................................................... 49
1.5 Display de Cristal Liquido........................................................................................ 50
1.5.1 Conexes ............................................................................................................ 51
1.6 Teclados Matriciais................................................................................................... 53
13

2 DESENVOLVIMENTO DO PROTTIPO................................................................. 56

2.1 Hardware Utilizado................................................................................................... 58


2.1.1 Mdulo de Controle ............................................................................................ 58
2.1.2 Montagem do Acelermetro ............................................................................... 60
2.1.3 Montagem do Circuito Sensor de Tenso .......................................................... 63
2.1.4 Montagem do Sensor de Corrente ...................................................................... 64
2.1.5 Montagem do Sensor de Rotao ....................................................................... 65
2.1.6 Montagem do Display ........................................................................................ 67
2.1.7 Montagem do Teclado ........................................................................................ 68
2.1.8 Viso Geral do Prottipo .................................................................................... 69
2.2 Desenvolvimento de Software .................................................................................. 71
2.2.1 Programa de Controle Desenvolvido .................................................................. 73

3 TESTES E AVALIAES ............................................................................................ 85

CONSIDERAES FINAIS ................................................................................................. 91

REFERNCIAS BIBLIOGRFICAS ................................................................................. 94

ANEXO A ................................................................................................................................ 98

APNDICE A ......................................................................................................................... 99
INTRODUO

O uso de motores eltricos tornou-se muito popular com o passar dos anos para as mais

diversas aplicaes, desde industriais, automotivas, domsticas, brinquedos, etc. De acordo

com a necessidade de aplicao, podem ser utilizados motores de corrente alternada ou motores

de corrente contnua.

Este Trabalho de Concluso de Curso (TCC) tem por foco os motores de Corrente

Contnua (CC) de baixa potncia utilizados, principalmente, no mercado automotivo para

aplicaes como ventilao, limpador de para brisa, ar condicionado, movimentaes, etc.

Todos os motores produzidos devem ser verificados aps seu processo de produo,

visando garantir seu correto funcionamento e atendimento as caractersticas a fim de evitar

problemas de campo. A motivao deste trabalho justamente esta etapa de verificao das

caractersticas dos motores aps sua manufatura. O objetivo proposto a criao de um

prottipo para aquisio de caractersticas dos motores como tenso eltrica fornecida pela

fonte, consumo de corrente do motor, rotao e vibrao do motor, com aprovao ou

reprovao automtica, baseado em valores pr-determinados de acordo com o modelo de

motor em anlise.
15

Como objetivos especficos est o estudo de um microcontrolador da Microchip,

estudo de acelermetro, estudo de motores eltricos de corrente contnua, estudo sobre display

de cristal lquido e mtodos de medio de caractersticas como tenso e corrente. Estes estudos

remetem ao desenvolvimento de um prottipo utilizando o hardware estudado e o

desenvolvimento do software para o microcontrolador, em Linguagem C.

O presente Trabalho de Concluso de Curso est estruturado da seguinte forma: o

Captulo 1 apresenta o embasamento terico, chamado de Mtodos e Componentes. O Captulo

2 apresenta o desenvolvimento do prottipo subdividido em hardware utilizado e o

desenvolvimento do software. No Captulo 3 so apresentados os testes e avaliaes realizados

e, ao final, so apresentadas consideraes finais sobre o Trabalho, onde so expostas

possibilidades de melhorias e trabalhos futuros bem como crticas referentes a este Trabalho de

Concluso de Curso.
1 MTODOS E COMPONENTES

Para incio do desenvolvimento do prottipo o primeiro passo o entendimento dos

mtodos e componentes envolvidos. Deste modo, primeiramente realizado um estudo sobre

motores eltricos e vibrao. Aps realizado um breve estudo sobre sensores,

microcontroladores, display de cristal lquido e teclados matriciais.

1.1 Motores Eltricos de Corrente Contnua

Motores eltricos de corrente contnua so tambm denominados como mquina de

corrente contnua e trata-se de um conversor eletromecnico de energia que recebe energia

eltrica na forma de corrente contnua, converte-a em energia mecnica e a disponibiliza em

sua porta motriz ou mecnica. Nesse sentido energtico tem-se a operao como motor. Como

as mquinas eltricas so reversveis, entregando energia mecnica em suas portas mecnicas,

retira-se energia eltrica em suas portas eltricas, sendo essa energia na forma de uma corrente

eltrica unidirecional (SIMONE, 2000).


17

1.1.1 Aspectos Construtivos

O motor de corrente contnua composto de duas estruturas magnticas:

Estator, que pode ser de enrolamento de campo ou m permanente;

Rotor (enrolamento de armadura).

O estator composto de uma estrutura ferromagntica com polos salientes nos quais

so enroladas as bobinas que formam o campo, ou de um m permanente. A Figura 1.1 mostra

o desenho de um motor de corrente contnua de 2 polos com enrolamento de campo e tambm

uma foto (b) de um estator e um rotor completo (SIEMENS, 2006).

Figura 1.1 Desenho (a) e foto (b) de um motor CC de 2 polos.


Fonte SIEMENS, 2006.

O rotor um eletrom constitudo de um ncleo de chapas de ferro com enrolamentos

em sua superfcie que so alimentados por um sistema mecnico de comutao, como pode ser
18

visto na Figura 1.2. Esse sistema formado por um comutador, solidrio ao eixo do rotor, que

possui uma superfcie cilndrica com diversas lminas s quais so conectados os enrolamentos

do rotor; e por escovas fixas, que exercem presso sobre o comutador e que so ligadas aos

terminais de alimentao. O propsito do comutador o de inverter a corrente na fase de rotao

apropriada de forma a que o conjugado desenvolvido seja sempre na mesma direo

(SIEMENS, 2006).

Os enrolamentos do rotor compreendem bobinas de "n" espiras. Os dois lados de cada

enrolamento so inseridos em sulcos com espaamento igual ao da distncia entre dois polos

do estator, de modo que quando os condutores de um lado esto sob o polo norte, os condutores

do outro devem estar sob o polo sul. As bobinas so conectadas em srie atravs das lminas

do comutador, com o fim da ltima conectado ao incio da primeira, de modo que o enrolamento

no tenha um ponto especfico (SIEMENS, 2006).

Figura 1.2 Foto de um sistema mecnico de comutao.


Fonte SIEMENS, 2006.
19

1.1.2 Princpio de Funcionamento

Para um melhor entendimento sobre o princpio de funcionamento de motores eltricos

de corrente contnua, considera-se um estator composto de ms permanentes e um rotor

composto de uma bobina de fio de cobre esmaltado ligada a uma fonte de tenso CC, fazendo

circular uma corrente eltrica. Esta circulao de corrente faz a bobina se comportar como um

im permanente, produzindo campos magnticos Norte (N) e Sul (S). A Figura 1.3 ilustra, de

maneira simplificada, um desenho esquemtico do princpio de funcionamento do motor CC de

dois polos (SIEMENS, 2006).

Figura 1.3 Esquemtico simples do princpio de funcionamento de mquina CC.


Fonte SIEMENS, 2006.

O processo inicia-se na situao ilustrada no ponto (a) da Figura 1.3, onde a bobina

apresenta-se horizontal aos campos magnticos norte e sul dos ims. Como os polos opostos se

atraem, a bobina experimenta um torque que fora a bobina a girar no sentido anti-horrio. A
20

bobina sofre acelerao angular e continua seu giro para a esquerda, como ilustrado no ponto

(b).

Esse torque continua at que o polo da bobina alcance os polos opostos dos ms fixos

(estator). Na situao (c) no h torque algum, uma vez que as foras so nulas (a direo das

foras passa pelo centro de rotao). Nesta situao o rotor est em equilbrio estvel (fora

resultante nula e torque resultante nulo). Esse o instante adequado para inverter o sentido da

corrente na bobina pois os polos de mesmo nome esto muito prximos e a fora de repulso

intensa. Devido inrcia do rotor e como a bobina j apresenta um momento angular "para a

esquerda", ela continua girando no sentido anti-horrio e um novo torque propiciado por foras

de repulso, como em (d), colabora para a manuteno e acelerao do movimento de rotao.

Mesmo aps a bobina ter sido girada em 180o o movimento continua e a bobina chega

na "vertical" completando um giro de 270o, similar ao ponto (c). Neste momento o torque

novamente se anula, a corrente novamente inverte seu sentido, h um novo torque e a bobina

chega novamente situao (a), completando um giro de 360o (SIEMENS, 2006).

Essas atraes e repulses bem coordenadas so responsveis pelo giro do rotor. A

inverso do sentido da corrente (comutao), no momento oportuno, condio indispensvel

para a manuteno dos torques "favorveis", os quais garantem o funcionamento dos motores

(SIEMENS, 2006).

A comutao consiste na mudana de uma lmina do comutador, onde as bobinas so

ligadas em srie. Durante esta comutao a bobina momentaneamente curto-circuitada pelas

escovas, o que ajuda a liberar a energia armazenada, antes de a corrente fluir no sentido oposto.
21

Porm, como essa inverso de corrente no instantnea, uma fora eletromotriz induzida na

espira, o que origina uma corrente de curto-circuito que circula no coletor, nas espiras e nas

escovas (SIEMENS, 2006).

A Figura 1.4 mostra um desenho esquemtico simplificado de um motor CC com

apenas uma bobina, o comutador, as escovas e dois ims externos bobina. Atravs deste

desenho esquemtico possvel visualizar mais facilmente o funcionamento do comutador que

possui duas ranhuras e responsvel pela alterao do sentido da corrente (SIEMENS, 2006).

Figura 1.4 Desenho esquemtico de motor CC.


Fonte SIEMENS, 2006.

Em sua forma mais simples, o comutador apresenta duas laminas de cobre curvas (arco

do cilindro) e fixadas isoladamente no corpo do comutador. Este, por sua vez, fixado no eixo

do rotor; os terminais do enrolamento da bobina so soldados nessas laminas. A corrente

eltrica "chega" por uma das escovas (+), "entra" pela lamina do comutador, "passa" pela bobina

do rotor, "sai" pela outra lamina do comutador e "retorna" fonte pela outra escova (-). Nessa

etapa o rotor realiza sua primeira meia-volta. Nessa meia-volta, as laminas do comutador

trocam seus contatos com as escovas e a corrente inverte seu sentido de percurso na bobina do
22

rotor, e o motor CC continua girando, sempre com o mesmo sentido de rotao (SIEMENS,

2006).

Os motores durante seu funcionamento apresentam caractersticas de corrente e

rotao que variam conforme a carga (torque) aplicada. A medida que o torque aumenta, a

rotao reduz e aumenta a corrente, ambos de forma linear porm em sentidos inversos. Um

motor sem carga apresenta a corrente mnima e a rotao mxima. A Figura 1.5 ilustra um

grfico com as curvas caractersticas de motores de corrente contnua.

Figura 1.5 Grfico de curvas caractersticas de motores cc.


Fonte JOHNSON ELECTRIC, 2013.

Neste grfico observa-se a curva de potncia, uma parbola voltada para baixo, da

mesma forma que ocorre com a curva de eficincia do motor. O ponto de operao nominal do

motor escolhido na regio de mxima eficincia, basicamente traando-se uma linha reta

desde o eixo de torque at cruzar com as demais curvas (velocidade, corrente e potncia).
23

1.2 Anlise Vibracional

As mquinas so elementos mecnicos complexos, articulados. As peas que sofrem

excitao podem oscilar e as oscilaes transmitem-se pelas articulaes aos demais elementos

acoplados. O resultado um complexo de frequncias que caracteriza o sistema. Cada vez que

uma pea altera suas caractersticas mecnicas por desgaste ou trinca, uma componente de

frequncia do sistema ser alterada. Havendo alterao no acoplamento entre as peas, altera o

coeficiente de transmisso do sinal entre as peas e, em consequncia, a forma de frequncia

global do sistema (MARAL e SUSIN, 2005).

Folgas, defeitos ou desalinhamentos de rolamentos ou mancais de mquinas rotativas

refletem-se na alterao de frequncias ou no surgimento de novas frequncias. O

desbalanceamento do rotor transmitido pelo rolamento ou buchas, que so os mancais do

motor (MARAL e SUSIN, 2005).

As foras centrfugas, alternativas e de frico atuantes nos distintos elementos de uma

mquina em operao, do origem a vibraes mecnicas proporcionais, que se manifestam nos

mancais. Devido a este fato, medindo-se vibraes nos mancais pode-se detectar e determinar

os esforos presentes em quaisquer componentes da mquina, determinando-se eventuais

anormalidades de funcionamento. Em geral a medida de vibraes deve ser efetuada nos

mancais, por ser um dos pontos vlidos pelas normas em uso empregadas para avaliar o

funcionamento de mquinas (MARAL e SUSIN, 2005).

A premissa fundamental sobre a qual se baseia a anlise de vibrao como tcnica

aplicada manuteno industrial, que cada componente ou cada tipo de deficincia mecnica

de uma mquina em operao produz uma vibrao de frequncia especfica, que em condies
24

normais de funcionamento alcana uma amplitude mxima determinada. Desta forma,

medindo-se a vibrao possvel analisar e estabelecer sua origem, identificar cada componente

da mquina e o tipo de falha que a est gerando alm de avaliar o estado mecnico do

componente que a produz ou a gravidade da deficincia detectada (MARAL e SUSIN, 2005).

A metodologia bsica recomenda que seja realizada a medio de frequncia para

identificar a origem da vibrao. O conhecimento da frequncia permite identificar o

componente da mquina ou a natureza da falha que produz a vibrao. A medio da amplitude

permite avaliar a vibrao e consequentemente o funcionamento normal ou anormal do sistema.

A medio da amplitude permite avaliar por comparao com valores limites

previamente estabelecidos se a vibrao corresponde a um funcionamento normal ou anormal

e o grau de importncia da falha detectada (MARAL e SUSIN, 2005).

1.2.1 Anlise Espectral

O mtodo de anlise de frequncias, baseado no Teorema de Fourier, estabelece que

qualquer funo peridica possa ser decomposta por uma srie de ondas sinusoidais puras com

frequncias distintas e mltiplas harmnicas da frequncia fundamental. Estas componentes

constituem o espectro de frequncia da vibrao. Ao se utilizar transdutores sensores

(acelermetros) para a aquisio de tal parmetro e posterior anlise, o espectro de vibrao de

um sistema pode ser levantado. Observando-se a amplitude dos picos em determinadas

frequncias e relacionando-se as amplitudes observadas com as da frequncia fundamental do

sistema (rotativo), pode-se chegar a um diagnstico do estado de funcionamento ou

alterabilidade em curso do sistema (MARAL e SUSIN, 2005).


25

1.2.2 Formas de Medir a Vibrao

So inmeras as formas de se medir e apresentar a vibrao oriunda de determinado

ponto de um equipamento submetido vibrao. Assim, existem medidas feitas apresentadas

em acelerao da gravidade (g), metros por segundo ao quadrado (m/s), milmetros por

segundo (mm/s) e milmetros (mm) (MARQUES, 2007).

Nas unidades expressas em decibel (dB) os ndices subscritos indicam a qual valor

base os valores se referem, sendo A a acelerao e V a velocidade. Porm, estas unidades so

as menos utilizadas e somente foram includas a nvel de conhecimento. As respectivas

frmulas com unidades em dB so apresentadas na Equao 1.1 e a Equao 1.2 (MARQUES,

2007).

A
AdB 20 log (1.1)
Aref

V
VdB 20 log (1.2)
Vref

O deslocamento (mm), a velocidade (mm/s) e a acelerao (g ou m/s) so medidas

fsica e matematicamente relacionadas, como funo da frequncia (f), num movimento

circular. A frequncia, neste caso, expressa em Hertz (Hz) ou Rotaes por Minuto (RPM).

Neste caso, f x 60 s = RPM, ou seja, 1 Hz x 60 s = 60 RPM (MARQUES, 2007).


26

Para utilizar grandezas eltricas obtidas e medidas a partir de sensores adequados,

integradores e diferenciadores eletrnicos podem ser usados para transformar o sinal eltrico

analgico para digital (MARQUES, 2007).

A necessidade de fazer as converses entre estas diferentes formas decorre dos

diversos modos de expressar o mesmo fenmeno, neste caso a vibrao, resultante da operao

de uma mquina girante. Na Tabela 1.1 pode ser visto as principais unidades empregadas em

medidas de vibrao (MARQUES, 2007).

Tabela 1.1 Representao das Unidades de Vibrao.

Expresso Unidade
D Deslocamento, valor pico a pico [mm]
V Velocidade, valor RMS [mm/s]
A Acelerao, valor RMS [g]
RPM Rotaes por Minuto

Fonte MARQUES, 2007.

Para converter-se o valor da vibrao em unidades normalizadas utiliza-se as equaes

1.3 a 1.8. Para obter deslocamento (D) em milmetros (mm) utiliza-se a Equao 1.3 que

considera o valor de velocidade (mm/s) e a Equao 1.4 que utiliza o valor da acelerao (g) e

rotao (RPM) do sistema (MARQUES, 2007).

V
D 27 (1.3)
RPM
27

A
D 2,53 106 2 (1.4)
RPM

Para obter-se a velocidade em milmetros por segundo (mm/s) utiliza-se a Equao 1.5

que considera o valor de deslocamento (mm) e a Equao 1.6 que considera o valor da

acelerao (g) e rotao (RPM) (MARQUES, 2007).

V 37 10 3 D RPM (1.5)

A
V 93,6 103 (1.6)
RPM

Para obter-se a acelerao (g) utiliza-se a Equao 1.7 que utiliza o valor do

deslocamento (mm) e a Equao 1.8 que utiliza o valor de velocidade (mm/s) (MARQUES,

2007).

A 0,396 106 D RPM 2 (1.7)


28

A 10,7 106 V RPM (1.8)

1.2.3 Normas Associadas

A Associao Brasileira de Normas Tcnicas (ABNT) normatiza as funes

relacionadas s atividades tcnicas brasileiras. As diretrizes utilizadas para ser possvel executar

estas normatizaes so as chamadas Normas Brasileiras (NBRs). As NBRs contm as

diretrizes necessrias para que determinada atividade tcnica seja executada de forma correta e

segura. Neste prottipo utiliza-se como referncia a NBR 10082 - Vibrao mecnica de

mquinas com velocidades de operao de 600 a 12000 RPM - Bases para especificao e

padres de avaliao (ABNT, 2011).

Esta norma auxilia o projeto de analisadores de vibrao informando os limites

mximos de vibrao para cada aplicao. A Figura 1.6 ilustra um grfico com os limites de

vibrao aceitveis para mquinas eltricas. Utilizado neste prottipo para definio de aes a

serem tomadas.
29

Figura 1.6 Grfico dos limites de Vibrao.


Fonte ABNT, 2011.

O grfico apresenta os limites de vibrao para cada classe de potncia. So divididas

em menores de 15 kW, entre 15 kW e 75 kW, maior que 75 kW e componentes com suportes

flexveis. Para este prottipo considerada apenas a classe abaixo de 15 kW, por tratar-se de

motores de baixa potncia. Cada classe possui quatro classificaes, sendo "Bom",

"Permissvel", "Tolervel" e "No Permissvel".

A classificao "Bom" inclui as mquinas eltricas que apresentam vibrao mxima

de 0,7 mm/s e no necessitam de correo. A classificao "Permissvel" inclui as mquinas

eltricas que apresentam vibrao entre 0,7 a 1,8 mm/s, porm no apresentam riscos de danos,

no necessitando de correo imediata. A classificao "Tolervel" representa mquinas que

apresentam vibrao entre 1,8 a 4,5 mm/s e j representa que uma interveno na mquina deve

ser programada, pois a vibrao j pode causar danos ao equipamento. Essas intervenes

incluem balanceamentos, troca de rolamentos defeituosos e troca de componentes com fadiga

excessiva (ABNT, 2011).


30

A classificao "No Permissvel" inclui as mquinas eltricas que apresentam

vibrao excessiva, acima de 4,5 mm/s e devem ser corrigidas imediatamente, sob pena de

srios danos ao equipamento e riscos s pessoas prximas a este equipamento. Geralmente esta

vibrao pode ser detectada visualmente e representa a existncia de srios desequilbrios nos

elementos girantes do sistema como componentes quebrados, rolamentos defeituosos ou

desbalanceamento excessivo (ABNT, 2011).

Desta forma, esta Norma utilizada para anlise das vibraes de motores eltricos,

pois geralmente estes so a fonte dos movimentos girantes dos equipamentos e tendem a ser

submetidos s vibraes oriundas do sistema mecnico acoplado e, em muitos casos, do

desgaste do prprio componente. Uma anlise de vibrao executada nos motores permite o

diagnstico de praticamente todo o sistema, j que uma das caractersticas da vibrao se

propagar, causando defeitos e fadigas ao longo de sua propagao (ABNT, 2011).

1.3 Sensores

Para realizar a medio das caractersticas desejadas necessrio o uso de sensores.

Para realizar a medio de vibrao utilizam-se acelermetros; para medir a corrente e tenso

utilizado um sensor de corrente e um divisor de tenso, junto a um conversor analgico digital

(dispositivo interno de um microcontrolador) e para medir a rotao utiliza-se um sensor ptico.

1.3.1 Acelermetros
31

Existem vrios tipos de acelermetros. Os dois mais utilizados so o acelermetro de

material piezeltrico e o acelermetro de capacitncia. Ambos so analgicos, isto , fornecem

uma tenso eltrica que proporcional acelerao medida.

1.3.1.1 Acelermetro de Material Piezeltrico

Esse tipo de material quando comprimido, gera uma tenso eltrica. Quanto maior a

compresso, maior a tenso gerada. Desta forma, esta caracterstica passa a ser usada para medir

uma acelerao (SEARA DA CINCIA, 2012).

A Figura 1.7 ilustra, de forma esquemtica, o funcionamento desse tipo de

acelermetro. Uma caixa metlica contm uma massa, tambm metlica, colocada sobre uma

lmina do material piezeltrico. Esta, por sua vez, est fixada ao fundo da caixa. Se a caixa

estiver em repouso, o material piezeltrico suporta o peso da massa e sofre uma compresso

que resulta em uma tenso nos terminais positivo e negativo (SEARA DA CINCIA, 2012).

Figura 1.7 Imagem com esquemtico de acelermetro piezeltrico.


Fonte SEARA DA CINCIA, 2012.

Se a caixa for acelerada para cima, como mostra a Figura 1.7, a compresso do material

piezeltrico aumenta e a tenso de sada se eleva proporcionalmente acelerao. Se a


32

acelerao for para baixo, a compresso do material aliviada e a tenso de sada diminuda.

Desse modo, obtm-se uma tenso nos terminais proporcional acelerao da caixa (SEARA

DA CINCIA, 2012).

Em geral, a tenso na sada de um acelermetro desse tipo na faixa de 500 mV. Porm

essas tenses so suficientes para resultar em medidas confiveis da acelerao. Normalmente,

quando um acelermetro colocado em um aparelho em repouso este indica a acelerao da

gravidade (1 g), visto que a compresso feita pelo peso da massa sobre o material, como

ilustrado representao da Figura 1.8, posio (A). Quando o acelermetro girado em 90o,

posio (B), no h compresso e o acelermetro indica a acelerao da gravidade nula (0 g).

Na posio inversa (C), a massa alivia o material e o acelermetro indica a acelerao da

gravidade inversa (- 1 g).

Figura 1.8 Representao das posies do acelermetro.


Fonte SEARA DA CINCIA, 2012.

A curva da tenso de sada em funo do ngulo que o acelermetro faz com a

horizontal semelhante a indicada no grfico da Figura 1.9, porm com variaes nos valores

de tenso gerados. Nesse exemplo, quando o acelermetro est a 90o com a horizontal (A) da

Figura 1.8, a tenso nos terminais de sada de +500 mV. Na posio inversa (C) da Figura

1.7, ela de -500 mV (SEARA DA CINCIA, 2012).


33

Figura 1.9 Grfico da curva de tenso gerada pelo acelermetro.


Fonte SEARA DA CINCIA, 2012.

Usualmente, so montados trs acelermetros em um bloco nico, cada um apontando

para um eixo ortogonal aos outros. Esse um acelermetro de 3 eixos, representado na Figura

1.10 (SEARA DA CINCIA, 2012).

Figura 1.10 Representao de um acelermetro de 3 eixos.


Fonte SEARA DA CINCIA, 2012.

1.3.1.2 Acelermetro de Capacitncia

Um capacitor simples consiste de duas placas metlicas separadas por uma

determinada distncia. Entre estas placas est o ar ou algum material isolante adequado

(dieltrico). Colocando cargas eltricas de sinais opostos nessas placas surge uma diferena de

potencial eltrico (tenso) entre elas (SEARA DA CINCIA, 2012).


34

Se as cargas nas placas forem mantidas constantes, a tenso nos terminais de sada

varia com a distncia entre as placas. Placas mais prximas resultam em tenses menores nos

terminais, conforme representado na Figura 1.11 (SEARA DA CINCIA, 2012).

Figura 1.11 Representao com exemplos de placas de capacitores.


Fonte SEARA DA CINCIA, 2012.

A imagem da Figura 1.12 representa um arranjo possvel de acelermetro por

capacitncia. Quando o conjunto est em repouso, a mola que segura a placa superior est

distendida e a tenso vale V2. Mas, se o conjunto for acelerado para cima, a mola comprimida

e as placas do capacitor se aproximam uma da outra, resultando em uma tenso menor V1

(SEARA DA CINCIA, 2012).

Figura 1.12 Representao de arranjo de um acelermetro de capacitncia.


Fonte SEARA DA CINCIA, 2012.

Esse tipo de acelermetro equivale ao piezeltrico, mas em alguns casos pode ser mais

conveniente para detectar vibraes rpidas (SEARA DA CINCIA, 2012).


35

1.3.2 Sensor de Corrente

Uma aplicao muito frequnte de sensores magneto-resistivos na indstria o

monitoramento da intensidade da corrente que circula num circuito. Esse monitoramento serve

para realimentar os circuitos de controle de Modulao por Largura de Pulso (PWM) que

determina a velocidade de potncia de motores, acionamento de solenides, e muitos outros

tipos de dispositivos semelhantes. Uma aplicao de sensor de corrente a realimentao de

circuitos de controle de motores, conforme mostra o bloco diagrama da Figura 1.13 (UNIP,

2010).

Figura 1.13 Bloco diagrama de controle de motor por sensor de corrente.


Fonte UNIP, 2010

Para obter-se um sinal proporcional corrente que circula por um condutor existem

diversas tecnologias que so utilizadas nos componentes comerciais. Essas tecnologias incluem

shunts resistivos, dispositivos de efeito Hall, transformadores de corrente, dispositivos

trmicos, entre outros tantos (UNIP, 2010).

Cada tecnologia tem suas vantagens e desvantagens como, por exemplo, a no

existncia de isolamento no caso do shunt ou ainda a queda de tenso no circuito causando

perdas (UNIP, 2010).


36

Os sensores magneto-resistivos, entretanto, oferecem muitas vantagens que analisadas

podem torn-los uma escolha melhor do que os outros tipos como os de resistncia de derivao.

Dentre as vantagens que so destacadas para este tipo de sensor, est o fato de proporcionar

isolamento eltrico total, no causar alteraes na intensidade da corrente do circuito

monitorado e ser rpido o bastante para operar com frequncias at 5 MHz (UNIP, 2010).

1.3.2.1 Sensor por Resistncia de Derivao

O sensor de resistncia de derivao para medio de corrente contnua (Shunt)

empregado para medio de correntes elevadas, sendo calculado de tal maneira que para uma

determinada corrente nominal tem-se uma queda de tenso, que geralmente de 60, 150 ou 300

mV (UNIP, 2010).

Para que se obtenha a indicao de corrente, deve ser conectado ao shunt um indicador

que possua a escala igual a corrente nominal e o campo equivalente a queda de tenso provocada

pelo shunt (UNIP, 2010).

Para que seja assegurada a preciso do shunt, deve-se tomar o cuidado para que no

sejam a ele conectadas linhas de medio com resistncia maior que o valor mencionado nos

dados tcnicos do shunt (UNIP, 2010).


37

1.3.2.2 Sensor de Efeito Hall

So dispositivos transdutores de corrente fabricados usando o princpio efeito Hall de

elementos magnticos, com a capacidade de medir sinais AC e DC com alto isolamento

galvnico. Podem trabalhar com vrios formatos de onda (faixa ampla de frequncia).

O efeito Hall est relacionado ao surgimento de uma diferena de potencial em um

condutor eltrico, transversal ao fluxo de corrente e um campo magntico perpendicular

corrente (WIKIPDIA, 2013).

Como vantagem, os dispositivos de efeito Hall so imunes poeira, sujeira, lama e

gua quando encapsulados propriamente. Como a tenso de Hall , em geral, da ordem de mV,

torna-se necessria a amplificao do sinal. Alm disso, campos magnticos prximos ao

sensor, como por exemplo o campo de outros fios, podem diminuir ou aumentar o campo que

a sonda Hall pretende detectar, tornando os resultados imprecisos (WIKIPDIA, 2013).

1.3.3 Sensores de Rotao

Existem vrios tipos de sensores que podem ser utilizados para realizar a medio de

rotao. Neste Trabalho utiliza-se um sensor ptico reflexivo. Esta opo para evitar o contato

fsico com o eixo do motor em teste.

Os sensores pticos utilizam luz para detectar a presena (ou ausncia) passagem de

objetos. Alguns exemplos de tipos de luz utilizada so o Infravermelho, Laser ou ainda a luz

convencional.
38

O princpio bsico de funcionamento de um sensor ptico consiste na colocao de

emissores e receptores de luz. Para evitar interferncia com a luz ambiente, o sensor utiliza uma

determinada frequncia de luz. Desta forma o sensor s atua se a luz recebida estiver na mesma

faixa de frequncia do sensor (AUTOMAO 2010).

Abaixo so apresentadas trs categorias de sensores pticos: difusos, retro reflexivos,

emissor-receptor.

No sensor ptico difuso o transmissor e o receptor so montados na mesma unidade,

sendo que o acionamento da sada ocorre quando o objeto a ser detectado entra na regio de

sensibilidade e reflete para o receptor o feixe de luz emitido pelo transmissor como mostrado

na Figura 1.14 (AUTOMAO 2010).

Figura 1.14 Ilustrao de princpio de funcionamento de sensor ptico difuso.


Fonte AUTOMAO, 2010.

J no sensor ptico retro reflexivo, assim como o difuso, o transmissor e o receptor so

montados em uma nica unidade. O feixe de luz chega ao receptor aps a incidncia em um

espelho e o acionamento da sada ocorre quando o objeto interrompe o feixe como mostra a

Figura 1.15 (AUTOMAO 2010).


39

Figura 1.15 Princpio de operao do sensor ptico retro reflexivo.


Fonte AUTOMAO, 2010.

Um cuidado a ser tomado com um sistema como este, quanto limpeza dos sensores

e espelhos. A sujeira pode gerar acionamentos indevidos. Caso o ambiente seja muito rico em

poeira ou qualquer outra partcula em suspenso (nvoa de leo, por exemplo), talvez seja mais

indicado utilizar outro tipo de sensor. O alcance desse tipo de sensor pode chegar a algumas

dezenas de metros (AUTOMAO 2010).

Ao contrrio dos dois anteriores o sensor emissor receptor montado em duas

unidades distintas: uma emissora e outra receptora. Cada unidade fica de um lado da trajetria

do objeto alvo e, uma vez que este interrompa o feixe o sensor ativado. Um exemplo de

aplicao so as barreiras utilizadas em elevadores para impedir o fechamento da porta caso

haja algum objeto entre o emissor e o receptor (AUTOMAO 2010).

1.4 Microcontroladores

Um microcontrolador um computador em um chip, contendo um processador,

memria e perifricos de entrada e sada. um microprocessador que pode ser programado

para funes especficas, em contraste com outros microprocessadores de propsito gerais


40

(como utilizados em PCs). Eles so embarcados em outros dispositivos, onde possam controlar

as funes ou aes do produto.

Os microcontroladores se diferenciam dos processadores, pois alm dos componentes

lgicos e aritmticos usuais de um microprocessador de uso geral, o microcontrolador integra

elementos adicionais em sua estrutura interna, como memria de leitura e escrita para

armazenamento de dados, memria somente de leitura para armazenamento de programas,

EEPROM para armazenamento permanente de dados, dispositivos perifricos como

Conversores Analgicos Digitais (ADC), Conversores Digitais Analgicos (DAC) e interfaces

de entrada e sada de dados.

Com frequncias de clock entre 4 mega-hertz (MHz) e 40 MHz, os microcontroladores

operam a uma frequncia mais baixa do que os microprocessadores atuais. No entanto so

adequados para a maioria das aplicaes usuais como, por exemplo, controlar uma mquina de

lavar roupas ou uma esteira de cho de fbrica. O seu consumo em geral relativamente

pequeno, normalmente na casa dos miliwatts (mW) e possuem geralmente capacidade de entrar

em modo de espera (sleep) aguardando por uma interrupo ou evento externo, como o

acionamento de uma tecla, ou um sinal que chega via uma interface de dados. O consumo destes

microcontroladores em modo de espera pode chegar casa dos nanowatts (nW), o que os torna

ideais para aplicaes onde a exigncia de baixo consumo de energia um fator decisivo para

o sucesso do projeto (SOARES, 2011).


41

1.4.1 Processador Digital de Sinais

Desenvolvida pelo Microchip, a famlia de microcontroladores Digital Signal

Processor Peripherical Interface Controller (DSPIC) faz parte de uma linha de componentes

lanados no mercado e que vem sendo muito utilizados pela sua versatilidade e facilidade de

implementao nos mais variados sistemas eletrnicos.

O mdulo Unidade Central de Processamento (CPU) possui uma arquitetura Havard

modificada, com instrues de suporte a Digital Signal Controller (DSC). Por sua vez a CPU

possui um barramento de 24 bits com tamanho do cdigo de operao (opcode) varivel. O

contador de programa possui 23 bits, sendo possvel o endereamento de at 4 Mbit de memria

de programa. Todas as instrues so executadas em um nico ciclo de mquina, exceto as

instrues que alteram o fluxo do programa e a instruo de movimento de uma palavra dupla.

(SOUZA, 2006).

A famlia de processadores DSPIC, possui duas classes de instrues, as do tipo

Microcontroller Unit (MCU), que significa Unidade do Microcontrolador e as instrues de

classe DSP. Ambas implementadas na mesma arquitetura do microcontrolador.

O DSPIC30F possui vrios vetores de interrupo, somando um total de 54 fontes de

interrupes, onde cada uma pode ser configurada em sete nveis de prioridade. No ANEXO A

encontra-se o bloco diagrama do microcontrolador DSPIC30F4013, contendo seus mdulos e

funcionalidades (MICROCHIP, 2010).


42

1.4.2 Ciclos de Mquinas do Processador Digital de Sinais

O DSPIC utiliza quatro pulsos do clock principal para gerar um ciclo de mquina. Para

gerar uma instruo real, o DSPIC utiliza quatro pulsos deste perodo, pois atravs destes

quatro pulsos que o microcontrolador consegue ler e executar a instruo proveniente da

memria de programa. A velocidade de processamento do DSPIC de da frequncia do clock

principal do sistema, sendo que desta forma processa a Milhes de Instrues por Segundo

(MIPS).

1.4.3 Temporizadores

Os "timers" so contadores internos ao DSPIC e que so utilizados como

temporizadores, efetuando uma contagem de tempo para que determinada operao ocorra,

gerando uma interrupo ao final de cada contagem. Os cinco timers do DSPIC30F4013,

"timer1", "timer2", "timer3", "timer4" e "timer5" funcionam em 16 bits, podendo contar de 0 a

65.535, sendo cada um deles composto por 3 registradores, sendo os registradores "TMRX,

PRX e TXCOM", onde X equivale a 1, 2, 3, 4 ou 5 conforme o timer utilizado (MICROCHIP,

2010).

O registrador "TMRX" incrementado a cada ciclo de mquina, que pode ser

configurado para 8, 64 e 256 ciclos, onde constantemente comparado com o valor setado no

registrador "PRX", quando o "TMRX" atinge o valor do "PRX" ocorre o estouro do timer e o

contador resetado iniciando uma nova contagem (SOARES, 2011).

A famlia de microcontroladores DSPIC permite a utilizao em conjunto dois timers

de 16 bits, formando um timer de 32 bits, tornando possvel a contagem de tempos maiores,

concatenando o timer 2 com o timer 3 ou o timer 4 com o timer 5 (MICROCHIP, 2010).


43

1.4.4 Transmissor e Receptor Universal Assncrono

A Universal Asynchronous Receiver Transmitter (UART) um dispositivo de

comunicao muito utilizado entre computadores e perifricos, como tambm entre

microcontroladores, no qual um byte transmitido de forma serial atravs de dois fios, um

"RX" (destinado a receber os dados) e outro "TX" (que envia os dados). A comunicao entre

os dispositivos pode ser full duplex, onde os dados so transmitidos e recebidos ao mesmo

tempo como half duplex, onde a transmisso e a recepo de um dado ocorrem de cada vez.

Utiliza-se um protocolo de comunicao especfico como deteco de erro atravs de paridade,

como tambm o envio de um start bit identificando o incio de transmisso e um stop bit,

sinalizando o final de transmisso.

Os registradores utilizados para configurar o mdulo UART so, "UxMODE",

"UxSTA", "UxRXREG", "UxTXREG" e "UxBRG". A funo dos registradores "UxMODE" e

"UxSTA" configurar o modo de funcionamento da UART, j o registrador "UxBRG" define

o tempo de cada bit na transmisso (baud rate). Os registradores "UxRXREG" e "UxTXREG"

so utilizados para transmitir e receber os dados pela UART. O DSPIC30f4013 apresenta dois

mdulos UART, "1" e "2". Para tanto, o "x" indicado nos registradores deve ser substitudo por

1 ou 2, dependendo da UART utilizada (MICROCHIP, 2004).

Ao efetuar a comunicao serial entre dois perifricos, se faz necessrio que ambos

sejam configurados da mesma forma, no caso, possuam o mesmo baud rate. O modo de

deteco do baud rate pode ser utilizado para detectar o tamanho do bit que est chegando

comunicao serial e com isso configurar automaticamente o baud rate da UART. A mesma

pode ser configurada como ser efetuada a comunicao, com 8 ou 9 bits, com ou sem paridade.

O DSPIC possui um gerador de paridade no qual o mesmo j calcula o valor a ser enviado

(SOUZA, 2011).
44

O buffer de transmisso possui quatro nveis, onde se pode definir quando ser gerada

uma interrupo no modo de transmisso da UART. Se o registrador correspondente a essa

configurao foi setado em nvel lgico alto, a interrupo ser gerada aps o envido de todo o

buffer, em nvel lgico baixo, a cada shift register interno de envio, uma interrupo gerada.

O registrador "URXxSEL1" e "URXxSEL0" pode ser configurado de forma que uma

interrupo serial ser gerada aps o buffer de recepo estar completo com 4 bytes, ou a cada

trs ou ento a cada caractere recebido. Lembrando que deve se substituir "x" por 1 ou 2

dependendo da UART utilizada.

Outros bits nos respectivos registradores tambm so utilizados para identificar se a

UART est ocupada transmitindo ou recebendo um dado, se a paridade for recebida diferente

da enviada, se ocorrer erro na recepo do stop bit ou se o buffer de comunicao serial

ultrapassar o seu limite, conforme respectiva configurao descrita no datasheet do fabricante

(MICROCHIP, 2005).

1.4.5 Conversor Analgico Digital

O microcontrolador DSPIC30F possui um conversor analgico digital que converte

um sinal analgico ligado em uma de suas entradas analgicas em um valor de 12 bits. Este

mdulo de converso analgico digital baseado em uma arquitetura de converso do

Registrador de Aproximao Sucessiva (SAR), com uma velocidade de converso mxima de

100 ksps (MICROCHIP, 2005).

O DSPIC30F4013 possui um mdulo AD com 13 entradas analgicas multiplexadas,

ou seja, permite ligar 13 sinais analgicos neste microcontrolador.


45

A tenso de referncia do conversor analgico digital pode ser configurada para se

basear na alimentao do dispositivo nos pinos "AVdd" e "Avss" ou pelos pinos "Vref+" e

"Vref-".

O mdulo AD contm seis registradores de 16 bit sendo que os registradores

"ADCON1", "ADCON2" e "ADCON3" controlam a operao do mdulo AD, o registrador

"ADCHS" seleciona os canais de entrada a serem convertidos. O "ADPCFG" configura os pinos

como portas de entrada analgicas ou digitais e o "ADCSSL" seleciona as entradas para

converso. Este mdulo tambm contm um buffer de dezesseis palavras somente leitura e de

dupla porta chamado de "ADCBUF0" at "ADCBUFF", onde os valores convertidos so

armazenados. O mesmo no pode ser escrito pelo software do programador.

Com o mdulo AD configurado inicia-se a aquisio dos dados, quando uma

converso completada o valor carregado no buffer e uma flag de interrupo "ADIF"

setado, onde o programa desviado para a funo de tratamento da respectiva interrupo e

fornece os valores que podem ser lidos do buffer executando as funes necessrias definidas

pelo programador.

possvel configurar um clock para o conversor AD assim como uma taxa de

amostragem especfica chamada de "Tad", tempo do mdulo AD. Um Tad equivale a um

perodo de clock de 667 ns para Vdd igual a 5 V conforme manual do fabricante e para uma

correta converso pode trabalhar at o mnimo possvel de 1 Tad. O Tad deve ser definido no

incio do programa e calculado conforme sequencia de clculo ilustrado na Figura 1.16.


46

Figura 1.16 Clculo de clock e taxa de amostragem para converso A/D.


Fonte MICROCHIP, 2005.

1.4.6 Modulao por Largura de Pulso

Pode-se definir o tempo do perodo para produzir o sinal PWM atravs de um dos

timers utilizados. O registrador que define o duty cycle o "OC1RS".

Como exemplo se o registrador "PR2" est configurado para "0xffff", podemos

escalonar o registrador "OC1RS" de "0x0000" a "0xffff", de forma a ter-se uma resoluo de

PWM de at 16 bits. (SOARES, 2011).

Outra forma de utilizar o PWM com pino de falha, que pode ser utilizado como um

sensor de temperatura do motor, que ao atingir certo nvel de temperatura, coloca este pino em

nvel 0, fazendo com que a sada PWM entre em alta impedncia parando o motor, que pode

arrefecer e entrar em funcionamento logo em seguida (SOARES, 2011).


47

1.4.7 Interrupes

As interrupes so estmulos internos ou externos ao microcontrolador, que, no

momento em que ocorrer e dependendo de sua prioridade, o DSPIC interrompe tudo o que est

executando e parte para o tratamento da respectiva interrupo. A prioridade das interrupes

ocorre de forma que se no momento em que uma interrupo est sendo tratada e outra de maior

prioridade ocorre, o microcontrolador ir parar de tratar a interrupo de menor prioridade,

tratar a interrupo de prioridade mais alta e em seguida continuar o tratamento da interrupo

de menor prioridade, voltando no final a executar sua tarefa normal at que outra interrupo

ocorra. Os registradores responsveis pela configurao das interrupes so:

IFS0, IFS1 e IFS2 - mantm o estado da ocorrncia da interrupo, informando se

elas ocorreram ou no;

IEC0, IEC1 e IEC2 - permitem habilitar as interrupes;

IPC0 a IPC10 - permitem configurar a prioridade das interrupes.

Para cada interrupo existem trs registradores associados a ela, sendo um de

habilitao da interrupo que permite com que a interrupo ocorra ou no, outro para

configurar a prioridade da interrupo e o terceiro que informa se a interrupo ocorreu ou no.

No DSPIC possvel configurar a prioridade de cada interrupo em sete nveis, de 1 a 7 e

quanto maior o valor numrico da interrupo, maior a sua prioridade.


48

1.4.8 Interrupo Externa

Esta interrupo conectada a pinos especficos do DSPIC, que quando esta funo

especial est configurada para determinado pino, sempre que ocorrer uma variao em uma

borda, que pode ser configurada para borda de subida ou descida, gera uma interrupo para o

DSPIC.

A configurao da borda que ir ocorrer a interrupo feita pelo registrador

"INTCON2". O Bit 0 do respectivo registrador possibilita a configurao de que borda ocorrer

a interrupo. J a habilitao da interrupo externa feita pelo registrador "IEC0", atravs do

bit "INT0IE". Alm da configurao da interrupo de um pino especfico, se faz necessrio

habilit-lo como entrada e funcionando de forma digital.

Sempre que ocorrer uma interrupo externa, essa ser desviada para funo especfica

para o tratamento da mesma. Chegando funo o bit de ocorrncia da interrupo deve ser

limpo para evitar que a interrupo ocorra novamente (SOARES,2011).

1.4.9 Interrupo de Timer

Uma interrupo de timer ocorre no momento em que ocorre a sua contagem mxima.

Neste momento o programa desviado para a funo especfica para o tratamento da respectiva

interrupo, onde no bloco de tratamento o bit de ocorrncia deve ser limpo (SOARES,2011).
49

1.4.10 Interrupo de Recepo Serial

Ao receber um Byte da comunicao serial, conforme configurao dos registradores

especficos para a comunicao UART, que pode ser por byte, caractere ou pelo buffer cheio,

uma interrupo de software gerada. Neste instante ocorre um desvio para a funo especfica

para tratar dessa interrupo, que dever ler o buffer da UART a fim de que o mesmo seja limpo,

desocupando a UART (SOARES,2011).

1.4.11 Interrupo de Converso Analgica Digital

Toda vez que uma converso Analgica/Digital efetuada, o mdulo gera uma

interrupo desviada e tratada pela funo correspondente, onde o valor digital correspondente

ao analgico pode ser lido no buffer do conversor e utilizado de acordo com as necessidades.

Ao final deve-se setar o registrador da interrupo do conversor indicando que a mesma foi

tratada (SOARES,2011).

O dsPIC30F4013 composto de 40 pinos, sendo que a Figura 1.17 apresenta o

diagrama de pinos.
50

Figura 1.17 Diagrama de pinos do dsPIC30F4013.


Fonte MICROCHIP, 2004.

1.5 Display de Cristal Liquido

Os displays so fornecidos em diversos formatos e tamanhos e so sempre

especificados em nmero de caracteres exibidos, no formato de colunas e linhas, sendo os mais

comuns os 08x02 (oito colunas por duas linhas), 16X01 (16 colunas por 1 linha), 16X02 (16

colunas por 2 linhas), 16X04 (16 colunas por 4 linhas), 20X01 (20 colunas por 1 linha), 20X02

(20 colunas por 2 linhas) e 20X04 (20 colunas por 4 linhas) (RAMOS, 2005).

A Figura 1.18 apresenta uma imagem com a representao de uma clula do Display.
51

Figura 1.18 Representao de uma clula com o caracter A.


Fonte Modificado de RAMOS, 2005.

Como pode ser observado na representao cada "clula" do LCD composta de 5

pixels na horizontal e de 8 pixels na vertical. J o caracter composto de 7 pixels na vertical e

5 pixels na horizontal.

1.5.1 Conexes

Basicamente os LCDs alfa numricos seguem um padro de especificao de interface,

onde esto presentes 14 pinos de acesso em LCDs sem iluminao em back-light ou ento 16

pinos para os que possuem iluminao em back-light. Na verdade, estes pinos so ilhas

soldveis para a insero de conectores tipo IDC e so classificados em 8 pinos para controle

de dados, trs linhas de controle e trs linhas de alimentao.

As conexes esto dispostas em 1 linha de 14 ou 16 pinos lado a lado, onde utiliza-se

uma barra de pinos SIL ou em duas linhas de 7 ou 8 pinos, onde utiliza-se de um conector DIL.

Na maioria dos displays, a pinagem est impressa e torna mais fcil a identificao de

cada um. A funo de cada pino resumida de acordo com a Tabela 1.2.
52

Tabela 1.2 Descrio das funes dos pinos do LCD.

Fonte: RAMOS, 2005.

Apesar dos LCDs serem projetados para trabalharem com 5 V, consumindo apenas

poucos miliampres (mA), tenses entre 4,5 V e 6 V funcionam perfeitamente.

O pino 1 (Vss) o terra do mdulo LCD. O Pino 2 (Vdd) o positivo. O pino 3 (Vo)

o controle do contraste do LCD. Para isso deve-se lig-lo a um potencimetro ou trim-pot de

10 K conectado ao Vss e Vdd, assim atuando como um divisor de tenso.

O pino 4 (RS) o Seletor de Registros. Quando este pino est em nvel lgico baixo,

os dados enviados para o LCD so tratados como comandos e os dados lidos do LCD indicam

o seu estado atual. Quando este pino est em nvel lgico alto, os dados so tratados como

caracteres, tanto para leitura quanto para escrita.

Para indicar se os dados sero lidos ou escritos no LCD, existe o pino 5 (R/W) que

controla exatamente se a operao em andamento de leitura quando estiver em nvel lgico

alto, ou gravao quando estiver em nvel lgico baixo.


53

O pino 6 (E) a linha de habilitao para os comandos do LCD. utilizado para iniciar

a transferncia de comandos ou caracteres entre o mdulo e as linhas de dados. Quando estiver

escrevendo no display, os dados so transmitidos apenas a partir de uma transio de alto para

baixo (H para L) deste sinal. No entanto, para ler informaes do display, as informaes

estaro disponveis imediatamente aps uma transio de L para H.

Os pinos 7 a 14 fazem parte do barramento de dados, que trabalha com os oito sinais

em paralelo ou ainda pode trabalhar com um barramento de quatro vias (normalmente D4 a

D7), mas os dados devem ser transmitidos em dois pacotes. Cada pacote de 4 bits conhecido

como nibble. Este um excelente recurso para minimizar o uso de pinos de I/O do

microcontrolador, mas ocupa um pouco mais de memria (RAMOS, 2005).

O quadro da Figura 1.19 representa o endereamento dos caracteres utilizado para

displays de 20 colunas por 4 linhas.

Figura 1.19 Quadro com representao do endereamento para display 20x04.


Fonte RAMOS, 2005.

1.6 Teclados Matriciais

Uma forma muito comum de entrada de dados em um sistema microcontrolado

atravs de teclas. Quando o nmero delas pequeno, cada uma pode ser associada a um pino

de entrada ou sada do microcontrolador. Entretanto, quando o seu nmero grande, no


54

conveniente utilizar muitos pinos. Um teclado convencional emprega 12 teclas ou 16 teclas

como apresentado pela imagem e respectivo esquema na Figura 1.20. Ao invs de se empregar

12 ou 16 pinos para a leitura desses teclados, emprega-se 7 ou 8 pinos, respectivamente (LIMA

e VILHAA, 2012).

Figura 1.20 Imagem de teclado 4x4 e esquema de ligao das teclas.


Fonte LIMA e VILHAA, 2012.

Para a leitura de teclados com vrias teclas, utiliza-se o conceito de matriz, em que os

botes so arranjados em colunas e linhas. Ao pressionar uma tecla fechado o contato entre

uma coluna e uma linha e o sinal da coluna se reflete na linha ou vice-versa. A ideia trocar

sucessivamente o nvel lgico das colunas (varredura), e verificar se esse nvel lgico aparece

nas linhas (ou vice-versa). Se, por exemplo, a varredura for realizada nas colunas e houver

alterao no sinal lgico de uma das linhas, significa que uma tecla foi pressionada e, ento,

com base na coluna habilitada sabe-se qual a tecla pressionada.

Nesse tipo de varredura, o emprego de resistores de pull-up ou pull-down nas vias de

entrada fundamental, visto que para a leitura as entradas sempre devem estar em um nvel

lgico determinado. A Figura 1.21 apresenta o esquema da matriz de dois teclados com
55

resistores de pull-up e pull-down e seus respectivos sinais de varretura, que so aplicados s

colunas. As linhas recebem o sinal de acordo com o boto pressionado (LIMA e VILHAA,

2012).

Figura 1.21 Esquemas dos teclados com resistores de pull-up (a) e pull-down (b) e
respectivos sinais de varredura.
Fonte LIMA e VILHAA, 2012.
2 DESENVOLVIMENTO DO PROTTIPO

O desenvolvimento do prottipo tem incio de seu planejamento atravs de um

diagrama de blocos com os principais pontos de entrada e sada. Para todo o controle das

operaes a executadas definido um Mdulo de Controle com base no microcontrolador

dsPIC30F4013. A Figura 2.1 ilustra o diagrama de blocos do prottipo.

Figura 2.1 Diagrama de blocos do prottipo.


Fonte - Autor, 2013.
57

Para realizar a anlise de vibraes o microcontrolador recebe o sinal de um

acelermetro triaxial, conectado ao mdulo de controle aos pinos 2, 3 e 4 por trs fios. O sinal

de tenso da fonte para ligar o motor transmitido ao pino 5 do microcontrolador. Ao pino 6

do microcontrolador ligado o boto de incio de teste do motor. J o sinal de consumo de

corrente do motor enviado ao pino 7 do microcontrolador. Um sensor ptico ligado ao pino

17 do microcontrolador e utilizado para realizar a medio da rotao do motor.

Um display conectado ao microprocessador atravs de seis cabos, sendo quatro de

dados, um para habilitar o Seletor de Registros e outro para habilitar o display. Os pinos 10, 22,

23, 24, 25 e 26 do microcontrolador so conectados ao display. Um teclado matricial de

dezesseis teclas conectado aos pinos 10, 16, 18, 19, 29, 30, 37 e 38 do microcontrolador.

O acionamento do motor em teste realizado por rel, acionado atravs do pino 36 do

microcontrolador. Ao pino 35 do microcontrolador ligado um Led de indicao de

funcionamento do mdulo de controle. O Mdulo de Controle fornece duas sadas de PWM

atravs dos pinos 33 e 34 do microcontrolador. Estas sadas no esto sendo utilizadas no

presente prottipo, trata-se de uma previso para uma futura verso para anlise do motor com

variao de tenso e consequentemente rotao. Tambm permite o acionamento de motores

em uma rampa de subida de tenso.

A comunicao serial com PCs realizada pelo Mdulo de Controle atravs dos pinos

TXD e RXD. Esta funcionalidade no utilizada na verso atual do prottipo, sendo uma

previso de uso futuro para carregar os dados do motor em teste e transmitir o resultado dos

testes para um software supervisrio. A programao do microcontrolador do Mdulo de


58

Controle realizada em Linguagem de Programao C. Na sequncia so apresentados os

detalhes de cada bloco, tanto em hardware quanto em software.

2.1 Hardware Utilizado

O hardware dividido em Mdulo de Controle, sensores (acelermetro, sensor de

tenso, sensor de corrente, sensor de rotao) e dispositivos de comunicao e interao com o

operador (Teclado, Display e PC).

2.1.1 Mdulo de Controle

Para o controle de todas as operaes executadas, utiliza-se um dsPIC30F4013. O

microcontrolador montado em um mdulo construdo com base em um circuito desenvolvido

por alunos de estgio da Feevale, para uso como um kit didtico para as mais diversas aplicaes

com este microcontrolador. A Figura 2.2 apresenta o esquemtico do Mdulo de Controle.


59

Figura 2.2 Esquemtico do Mdulo de Controle.


Fonte - Feevale, 2012.

Com base no esquemtico apresentado na Figura 2.2 observa-se que o Mdulo de

Controle possui duas interfaces de transmisso serial de dados atravs de dois conectores

ligados a um Circuito Integrado (CI) MAX232. Os conectores para transmisso serial de dados

so o J7 e J8. Para uso das sadas seriais necessrio o uso de jumpers nos pinos JP1 para

UART1 e JP2 para UART2. Tambm se verifica que o Mdulo de Controle utiliza um cristal

de 20 MHz para gerar o clock ao microprocessador.

A alimentao do Mdulo de Controle de 12 V sendo aps convertida para 3,3 V ou

5 V caso seja colocado um jumper no conector JP7. O Mdulo de Controle possui os conectores

J1, J2, J3, J4 e J6 como interface para acesso aos pinos de entrada e sada do microcontrolador.

O conector J5 utilizado para gravao in circuit do microcontrolador. A Figura 2.3 apresenta

uma foto da montagem do Mdulo de Controle.


60

Figura 2.3 Foto da montagem do Mdulo de Controle.


Fonte - Autor, 2013.

Na figura se observa o microcontrolador ao centro, o CI MAX232 direita e os pinos

dos conectores na parte superior. Ao lado esquerdo h o conector para gravao in circuit e o

conector J6.

2.1.2 Montagem do Acelermetro

O acelermetro utilizado no prottipo o MMA 7361L, do fabricante Freescale

Semiconductor. Este acelermetro possui 3 eixos e sensibilidade de 1,5 g ou 6 g. Trata-se de

um acelermetro capacitivo e que opera com alimentao de 3,3 V ou de 5 V.

O sinal emitido pelo acelermetro analgico para os trs eixos medidos (x, y e z). H

tambm a funo de 0g-Detect, que permite detectar quedas. Porm esta funcionalidade no

utilizada para este prottipo. A funo de Self-Test presente no acelermetro permite realizar

a verificao do funcionamento do mesmo. Para este prottipo esta funo tambm no est

sendo utilizada.
61

A Figura 2.4 apresenta o esquemtico da conexo do acelermetro ao Mdulo de

Controle. uma conexo com cabo de 4 vias e blindagem soldado diretamente sobre a placa

(sem conector), uma vez que este acelermetro j est montado em uma placa com o circuito

do acelermetro. A tenso de alimentao VSS transmitida atravs da blindagem do cabo,

desta forma j funcionando como proteo contra interferncias externas.

Figura 2.4 Esquemtico de ligao do acelermetro e rel.


Fonte - Autor, 2013.

Ainda na Figura 2.3 representada a conexo do Led de indicao de status do

Mdulo de Controle e o circuito de acionamento do motor em teste, formado por um resistor

de base, um transistor e um diodo para a bobina do rel. Este circuito utiliza tenso de 12 V

para acionar o rel.

Para facilitar o manuseio e fixao o acelermetro montado sobre uma placa de

circuito impresso ao cabo de 4 vias com blindagem. A Figura 2.5 apresenta uma foto da

montagem do acelermetro.
62

Figura 2.5 Foto do acelermetro sobre placa de circuito impresso.


Fonte - Autor, 2013.

A escala adotada para o acelermetro de 1,5 g, que opera com sensibilidade de 206

mV/g. A seleo desta escala realizada mantendo o pino g-select em nvel lgico 0.

Conforme o datasheet do fabricante neste caso no necessrio realizar nenhuma ligao ao

pino pois ele possui internamente resistores de pull down.

A Figura 2.6 apresenta o detalhe da fixao do acelermetro ao motor.

Figura 2.6 Foto do acelermetro fixado ao motor sob teste.


Fonte - Autor, 2013.

No detalhe apresentado se verifica que a fixao do acelermetro realizada junto ao

bero do motor junto a abraadeira do motor.


63

2.1.3 Montagem do Circuito Sensor de Tenso

A medio da tenso aplicada ao motor realizada por um divisor de tenso formado

por dois resistores, sendo um de 10 k e outro de 56 k, com tolerncia de 1%. A Figura 2.7

apresenta o esquemtico dos resistores e sua ligao ao Mdulo de Controle.

Figura 2.7 Esquemtico da medio de corrente e tenso.


Fonte - Autor, 2013.

O divisor de tenso utilizado transforma o sinal de tenso aplicado na fonte de uma

amplitude de 0 a 33 V em uma tenso de 0 a 5 V, para que possa ser interpretado pelo

microcontrolador. O sinal de tenso oriundo do divisor de tenso enviado ao pino 5 do

microcontrolador (AN3/RB3), configurado como entrada analgica.


64

2.1.4 Montagem do Sensor de Corrente

A medio da corrente do motor realizada atravs de um sensor de efeito Hall do

fabricante Allegro MicroSystems, modelo ACS712 20A. Este modelo de sensor utiliza

alimentao de 5 V e emite um sinal de tenso de sada linear de 0,5 a 4,5 V, conforme

apresentado no grfico da Figura 2.8. O sinal de sada do medidor de corrente conectado ao

pino 7 do microcontrolador (AN5/RB5) e est configurado como entrada analgica. Esta

ligao apresentada na Figura 2.7.

Figura 2.8 Imagem de curva de tenso de sada.


Fonte - ALLEGRO MICROSYSTEMS, 2013.

O sensor utilizado permite a leitura de correntes de 0 at 20 A. O esquema de aplicao

tpica do sensor de corrente recomendado pelo fabricante ilustrado na Figura 2.9.

Figura 2.9 Imagem com esquema de aplicao tpica do sensor de corrente.


Fonte - ALLEGRO MICROSYSTEMS, 2013.
65

Este sensor de corrente alimentado por de 5 V. Um capacitor de filtro de 1 nF e um

capacitor de desacoplamento da fonte no valor de 0,1 F tambm so necessrios. A corrente

do motor circula do pino 1 e 2 para o pino 3 e 4, fornecida pela fonte de alimentao do motor.

O pino 7 do CI fornece a tenso de sada proporcional a corrente ao microcontrolador. A Figura

2.10 apresenta uma foto da placa prottipo montada para realizar as medies de tenso e

corrente.

Figura 2.10 Foto da placa prottipo de aquisio de tenso e corrente.


Fonte - Autor, 2013.

esquerda da placa observam-se os dois resistores que formam o divisor de tenso

que realiza a converso da tenso recebida da fonte para uma escala de 0 a 5 V. Ao centro da

placa est o o circuito com o sensor de corrente ACS712. Observao: este mdulo de aquisio

de tenso e corrente est instalado dentro do gabinete por uma questo de praticidade. Para o

modelo definitivo o mdulo estar externo ao gabinete, prximo do motor sob teste.

2.1.5 Montagem do Sensor de Rotao

O sensor selecionado para realizar a medio da rotao o modelo OPB704 do

fabricante QT Optoeletronics. Basicamente consiste de um diodo emissor infravermelho e um

fototransistor NPN montados lado a lado dentro de um mesmo encapsulamento plstico. O


66

fototransistor responde a iluminao a partir do emissor quando um objeto refletor passa dentro

do campo de viso centrada tipicamente a 3,8 mm (OPTEK, 2012).

O esquemtico da montagem do circuito do sensor e a sua ligao com o Mdulo de

Controle so apresentadas na Figura 2.11.

Figura 2.11 Esquemtico de circuito do sensor de rotao.


Fonte - Autor, 2013.

O sensor alimentado por 5 V com dois resistores para limitar a corrente fornecida. O

terminal do coletor utilizado para enviar o sinal de nvel lgico "0" ou "1" ao pino 17 (RA11)

do microcontrolador, configurado como interrupo externa (INT0).

O sensor de medio da rotao est fixado junto carcaa do motor sob teste, no caso

um motor radial simples, com a medio realizada sobre a turbina. A Figura 2.12 apresenta uma

foto do sensor fixado carcaa do motor.


67

Figura 2.12 Sensor de rotao fixado carcaa do motor.


Fonte - Autor, 2013.

Nesta foto pode ser observado que h a necessidade de alterar o produto com um corte

na tampa do mesmo para que seja possvel fixar o sensor. Internamente, tambm h a

necessidade de acrescentar uma faixa preta com ponto branco sobre a turbina para que o sensor

opere com melhor desempenho.

2.1.6 Montagem do Display

O Display utilizado no prottipo possui 20 colunas e 4 linhas. Possui opo de luz de

background, de cor azul e alimentado por 5 V. A Figura 2.13 apresenta o esquemtico da

ligao do Display ao Mdulo de Controle.


68

Figura 2.13 Esquemtico da ligao do Display.


Fonte - Autor, 2013.

A conexo ao microcontrolador realizada por 6 fios, sendo quatro para transmisso

de dados (D7, D6, D5 e D4), um para habilitar escrita e outro para seleo de registro (dados

ou caracteres). O contraste ajustado atravs de potencimetro conectado a 5 VCC e terra

formando um divisor de tenso com sada conectada ao pino de Variao de Contraste (CV).

2.1.7 Montagem do Teclado

O teclado utilizado para o prottipo um teclado matricial de 4 linhas e 4 colunas. A

Figura 2.14 apresenta o esquemtico da conexo do teclado ao Mdulo de Controle.


69

Figura 2.14 Esquemtico de ligao do teclado matricial.


Fonte - Autor, 2013.

Sua conexo ao microcontrolador realizada atravs de oito pinos, sendo quatro

configurados como sada (colunas) e quatro configurados como entradas (linhas). Cada linha

possui um resistor de pull-down de valor 10 k.

2.1.8 Viso Geral do Prottipo

O prottipo est montado em um gabinete metlico. A Figura 2.15 apresenta uma foto

do interior deste gabinete dividida em trs reas.


70

3
1 2

Figura 2.15 Foto da parte interna do prottipo.


Fonte - Autor, 2013.

Na rea indicada (1) observa-se a fonte de alimentao montada para o Mdulo de

Controle e sensores. Nesta rea observa-se o transformador utilizado e a placa com o circuito

de retificao de tenso e converso para 12 V e 5 V. A rea (2) apresenta o Mdulo de Controle.

J a rea (3) apresenta os circuitos de medio de corrente, tenso e cabos de sada para o

acelermetro e para o sensor de rotao.

A Figura 2.16 apresenta uma foto da parte frontal do prottipo.

Figura 2.16 Foto da parte frontal do prottipo.


Fonte - Autor, 2013.
71

esquerda encontra-se o Display onde so apresentados os dados e direita o Teclado.

Entre o Teclado e o Display est o potencimetro para realizar o ajuste do contraste do Display.

J a Figura 2.17 apresenta a foto da parte de trs do prottipo.

Figura 2.17 Foto da parte de trs do prottipo.


Fonte - Autor, 2013.

Nesta foto observam-se a sada dos cabos do acelermetro e do sensor de rotao,

ambos do lado esquerdo. Abaixo destes dois cabos encontra-se o conector para comunicao

com o PC (previso). Ao centro esto as conexes para alimentao da fonte de tenso de

acionamento do motor e a sada para o motor. direita aparece o boto para ligar e desligar o

prottipo, o fusvel da fonte do prottipo e a sada do cabo para o boto de incio do teste.

2.2 Desenvolvimento de Software

O desenvolvimento do software para o microcontrolador realizado em linguagem de

Programao C. Para a programao utiliza-se a verso mais nova do software da Microchip, o

MPLAB X e tambm o compilador XC16 (MICROCHIP, 2013).

O MPLAB X IDE um aplicativo para desenvolvimento de programas para

microcontroladores e controladores de sinais digitais da Microchip. denominado ambiente de


72

desenvolvimento integrado por tratar-se de um nico ambiente para desenvolver os cdigos de

programao para os microcontroladores.

Esta nova verso do ambiente de desenvolvimento da Microchip traz muitas mudanas

em relao as verses anteriores do MPLAB, que foram desenvolvidas internamente pela

Microchip, enquanto que o MPLAB X baseado no NetBeans IDE da Oracle. Isto permite a

adio de recursos com muito mais rapidez e facilidade e proporciona uma arquitetura

expansvel e que pode trazer novidades no futuro (MICROCHIP, 2013).

A Figura 2.18 apresenta a tela inicial do MPLAB X, onde observa-se os menus e barras

de ferramentas desta nova interface.

Figura 2.18 Imagem da tela inicial do MPLAB X da Microchip.


Fonte - Autor, 2013.

O compilador MPLAB XC16 suporta todos os dispositivos Microchip de 16 bits. A

famlia DSPIC de controladores de sinal digital combina o alto desempenho requerido em


73

aplicaes DSP com o microcontrolador padro a recursos necessrios para aplicaes

embarcadas (MICROCHIP, 2013).

O compilador est disponvel para vrios sistemas operacionais mais populares,

incluindo 32 e 64 bit tais como Windows, Linux e Apple OS X (MICROCHIP, 2013).

O compilador pode ser executado em um dos trs modos de operao: Free, Standard

ou PRO. Os modos de operao Standard e PRO so modos licenciados e exigem uma chave

de ativao e conectividade com a Internet para habilit-los. O modo Free est disponvel para

os clientes sem necessitar de licena. Neste caso, os dispositivos suportados e memria esto

disponveis e idnticos aos dos outros modos. Os modos diferem apenas no nvel de otimizao

empregada pelo compilador (MICROCHIP, 2013).

2.2.1 Programa de Controle Desenvolvido

O desenvolvimento do programa de controle do Prottipo inicia com a definio do

cabealho do programa conforme o APENDICE A, no qual realiza-se o controle de verso.

Aps apresentado a listagem dos pinos com o mapeamento das ligaes, conforme cdigo

fonte que segue:

********************************************************************************
**** Mapeamento das ligacoes do DSPIC30F4013 aos outros modulos
********************************************************************************
Pino Funo Pino Ligao dos pinos aos mdulos utilizados
********************************************************************************
01 MCLR Push button reset +R1+R2+CN5 pino 6 (MCLR) p/gravar
in-circuit + VCC
02 AN0/VREF+/CN2/RB0 Pino ce Entrada Analogica Eixo X acelerometro
03 AN1/VREF-/CN3/RB1 Pino de Entrada Analogica Eixo Y acelerometro
04 AN2/SS1/LVDIN/CN4/RB2 Pino de Entrada Analogica Eixo Z acelerometro
05 AN3/CN5/RB3 Pino de Entrada Analogica para Medicao Tensao
06 AN4/IC7/CN6/RB4 Pino de Entrada para Botao Start para acionamento do teste
07 AN5/IC8/CN7/RB5 Pino de Entrada Analogica para Medicao de Corrente
08 PGC/EMUC/AN6/OCFA/RB6 CN5 Pino 4 (SCK) Serial Clock p/ gravacao in-circuit
09 PGD/EMUD/AN7/RB7 CN5 Pino 5 (SDA) Serial Data p/ gravacao in-circuit
74

10 AN8/RB8 Pino de Saida para Display (D4)


11 VDD 5V
12 Vss GND
13 OSC1/CLKI Cristal 20MHz + C3
14 OSC2/CLKO/RC15 Cristal 20MHz + C2
15 EMUD1/SOSCI/T2CK/U1ATX/CN1/RC13 Pino de Entrada para Teclado (Linha 1)
16 EMUC1/SOSCO/T1CK/U1ARX/CN0/RC14 Pino de Entrada para Teclado (Linha 2)
17 INT0/RA11 Pino de Entrada para Interrupcao de medicao
de RPM
18 IC2/INT2/RD9 Pino de Entrada para Teclado (Linha 3)
19 OC4/RD3 Pino de Entrada para Teclado (Linha 4)
20 Vss GND
21 VDD 5V
22 OC3/RD2 Pino de Saida para Display (D5)
23 IC1/INT1/RD8 Pino de Saida para Display (D6)
24 EMUC3/SCK1/RF6 Pino de Saida para Display (D7)
25 EMUD3/U1TX/SDO1/SCL/RF3 Pino de Saida para Display (RS)
26 U1RX/SDI1/SDA/RF2 Pino de Saida para Display (E)
27 U2TX/CN18/RF5 Pino TX para comunicacao serial - Saida
28 U2RX/CN17/RF4 Pino RX para comunicacao serial - Entrada
29 C1TX/RF1 Pino de Saida para Teclado (Coluna 1)
30 C1RX/RF0 Pino de Saida para Teclado (Coluna 2)
31 Vss GND
32 VDD 5V
33 EMUD2/OC2/RD1 PWM
34 EMUC2/OC1/RD0 PWM2
35 AN12/COFS/RB12 Pino de Saida LED STATUS(Entrada para Sensor Descarte Peca)
36 AN11/CSDO/RB11 Pino de Saida para Rele
37 AN10/CSDI/RB10 Pino de Saida para Teclado (Coluna 3)
38 AN9/CSCK/RB9 Pino de Saida para Teclado (Coluna 4)
39 AVss GND Tenso de referencia para conversor AD
40 AVDD 5V Tenso de referencia para conversor AD
*/

Ainda durante o processo de programao h a etapa para definir as bibliotecas

utilizadas no projeto. A principal das bibliotecas a do prprio processador utilizado, mas

tambm so carregadas bibliotecas de perifricos, clculos matemticos, textos, etc. Tambm

seguindo a seleo do tipo de oscilador utilizado e opes de funcionamento do

microcontrolador, conforme cdigo fonte transcrito que segue:

//******************************************************************************
//***** BIBLIOTECAS UTILIZADAS
//******************************************************************************
#include<p30f4013.h> //Biblioteca do dsPIC30F4013
#include<uart.h> //Biblioteca UART.h
#include<pwm.h> //Biblioteca PWM.h
#include<reset.h> //Biblioteca reset.h
#include<math.h> //Biblioteca para operacoes matematicas
#include<string.h> //Biblioteca para operacao com strings
#include<stdio.h> //Biblioteca para operacoes de IO

//******************************************************************************
//***** FUSES (CONFIGURACAO DOS REGISTRADORES)
//***** Configura caacteristicas de operacao do microcontrolador dspic30f4013
//******************************************************************************

_FOSC(CSW_FSCM_OFF & HS); // Oscilador externo sem tratamento de erro


_FWDT(WDT_OFF); // WatchDog desabilitado. Reseta processador num
evento de mal funcionamento de software.
// WDT_OFF = (0x7FFF)h = (111111111111111)
// WDT_ON = (0xFFFF)h = (l111111111111111)
_FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF); // Habilita MCLR, Desabilita PBOR e PWRT
75

_FGS(CODE_PROT_OFF); // Sem protecao de codigo - E possivel a leitura


posterior a gravacao do chip

Nesta etapa observa-se tambm a configurao dos registradores (Fuses) que

determinam as caractersticas de operao do microcontrolador.

Aps esta etapa definido as funes para ligar e desligar o Led indicador de status e

desta forma visualizar o normal funcionamento do microcontrolador. O Timer1 e sua rotina de

interrupo responsvel por ativar a rotina de ligar e desligar o Led. Est configurado para

operar com uma frequncia de 0,5 Hz que permite um intervalo de 0,5 s ligado e 0,5 s desligado.

Segue transcrio do cdigo fonte:

//**************************************************************************
//Rotina de inicializao do timer 1 para o LED indicador status
//**************************************************************************
void inicia_timer1(void) //PR1= 5000000/1024= 4882
{
T1CON = 0; //Desabilita a contagem do timer1
TMR1 = 0; //Limpa o conteudo do temporizador
IFS0bits.T1IF = 0; //Clear no bit de chamada da interrupcao do timer1
PR1 = Fcy/512; //Timer 1 conta at 4882
//Fcy/256 = 1s Medido c/ oscilo
//Fcy/512 = 0,5s
//Fcy/1024= 0,25s
T1CONbits.TCKPS = 3; //Ajusta o prescaler para 1:256
IPC0bits.T1IP = 4; //Define a prioridade da interrupo do timer1 = 4
IEC0bits.T1IE = 1; //Habilita a interrupo do timer1
T1CONbits.TON = 1; //Habilita a contagem do timer1
}

//****Rotina de tratamento da interrupo do Timer 1 controle do led indicador


void _ISR _T1Interrupt(void)
{
if (fgLed == 0){ //condicao para piscar o LED de status
fgLed = 1; //Se a flag estiver em 0 altera p/ 1 e liga o LED
LigLed; //Funcao criada para ligar o LED de status
}
else {
fgLed = 0; //Passa a flag de status do LED para 0
DesLed; //Funcao criada para desligar o LED de status
}

IFS0bits.T1IF = 0; //Clear no bit de interrupo do timer 1


}

Para uso do Display, utiliza-se as rotinas criadas para seu funcionamento. A rotina

lcd_init utilizada para a inicializao do Display. Nesta inicializao so definidos os


76

parmetros de funcionamento como o envio de dados de 4 bits, deslocamento do cursor e

limpeza da tela, conforme transcrio do cdigo fonte que segue:

void lcd_init() //Rotina de inicializacao do display


{
Delay_ms(1);
lcd_command(0x33); /0011 0011 Configura o display para modo 4 bits
lcd_command(0x32); //0011 0010 Configura o display para modo 4 bits
lcd_command(0x28); //0010 1000 Display ajustado para 4 linhas e fontes
5x7
lcd_command(0x0E); //0000 1100 Cursor ligado
lcd_command(0x06); //0000 0110 Desloca o cursor para a direita
lcd_command(0x01); //0000 0001 Limpa o display e seta contador de endereo
para zero.
Delay_ms(1);
}

A rotina lcd_command utilizada para o envio de comandos e a rotina lcd_data

utilizada para envio de dados ao Display. A rotina de envio de comandos utilizada para

configurar o seletor de registros em nvel lgico baixo para tratar as informaes recebidas

como comandos enquanto que a rotina de dados configura o seletor de registros do Display em

nvel lgico alto para que o Display interprete as informaes recebidas como dados a serem

exibidos. Segue transcrio das rotinas para envio de comandos e dados:

//**** Envia comandos para o display*******************************************


void lcd_command(unsigned char cmd)
{
RS = 0; //Seta o seletor de registros do display para comandos
DATA((cmd & 0xf0)>> 4); //Carrega os dados dos 4 bits mais significativos para
envio ao display
EN = 1; //Habilita o display para envio de dados
EN = 0; //Desabilita o envio de dados ao display
DATA(cmd & 0x0f); //Carrega os dados dos 4 bits menos significativos
EN = 1; //Habilita o display para envio de dados
EN = 0; //Desabilita o envio de dados ao display
Delay_ms(1); //Delay de 1ms

//**** Envia dados para o display***********************************************


void lcd_data(unsigned char data)
{
RS=1; //Seta o seletor de registros do display para comandos
DATA((data & 0xf0)>> 4); //Carrega os dados dos 4 bits mais significativos para
envio ao display
EN=1; //Habilita o display para envio de dados
EN=0; //Desabilita o envio de dados ao display
DATA(data & 0x0f); //Carrega os dados dos 4 bits menos significativos
EN=1; //Habilita o display para envio de dados
EN=0; //Desabilita o envio de dados ao display
Delay_ms(1); //Delay de 1ms
}
77

Outra rotina utilizada a DATA, responsvel pelo envio das informaes ao Display em

blocos de 4 bits, conforme cdigo fonte que segue:

void DATA(unsigned char nib){ //Funcao para envio de dados de 4 bits ao display
D4 = nib & 1; //Configura o 1o do bit do nible para D4
D5 = (nib & 2) >> 1; //Configura o 2o do bit do nible para D5, faz rolagem de
1 casa para direita
D6 = (nib & 4) >> 2; //Configura o 3o do bit do nible para D6, faz rolagem de
2 casas para direita
D7 = (nib & 8) >> 3; //Configura o 4o do bit do nible para D7, faz rolagem de
3 casas para direita
}

Outras rotinas para uso com o display tambm so criadas, sendo uma chamada Cursor

que posiciona o cursor do Display na linha e coluna selecionadas. A rotina DispString

utilizada para escrita de palavras. DispValDec uma rotina criada para a escrita de valores

decimais com a escolha da posio do ponto decimal em zero, uma ou duas casas. Para escrita

de valores decimais inteiros tm-se a rotina DispValInt. Estas rotinas esto disponveis no

Apndice A que apresenta o cdigo fonte completo.

Para a aquisio de informaes via teclado se utiliza a rotina le_Teclado. Esta rotina

ealiza a varredura das linhas e colunas do teclado. Nesta rotina uma das colunas colocada em

nvel lgico alto e as outras trs em nvel lgico baixo. Na sequncia verificado se alguma das

linhas retorna nvel lgico alto. Esta sequncia ocorre alternando o nvel lgico das colunas

uma de cada vez com a verificao do nvel encontrado nas linhas, uma a uma. Desta forma

identifica-se qual a tecla pressionada. Segue abaixo transcrio do cdigo fonte:

char le_Teclado(void)
{
Coluna_1 = 1;
Coluna_2 = 0;
Coluna_3 = 0;
Coluna_4 = 0;
Delay_ms(1);
if(Linha_1) return 1;
if(Linha_2) return 4;
if(Linha_3) return 7;
if(Linha_4) return 15; //(*)

Coluna_1 = 0;
78

Coluna_2 = 1;
Coluna_3 = 0;
Coluna_4 = 0;
Delay_ms(1);
if(Linha_1) return 2;
if(Linha_2) return 5;
if(Linha_3) return 8;
if(Linha_4) return 0;

Coluna_1 = 0;
Coluna_2 = 0;
Coluna_3 = 1;
Coluna_4 = 0;
Delay_ms(1);
if(Linha_1) return 3;
if(Linha_2) return 6;
if(Linha_3) return 9;
if(Linha_4) return 14; //(#)

Coluna_1 = 0;
Coluna_2 = 0;
Coluna_3 = 0;
Coluna_4 = 1;
Delay_ms(1);
if(Linha_1) return 10; // (A)
if(Linha_2) return 11; // (B)
if(Linha_3) return 12; // (C)
if(Linha_4) return 13; // (D)

return 16;
}

Alm do Timer1 tambm so ativados o Timer2, o Timer3, Timer4, mdulo AD, a INT0

e a UART2. O Timer2 est configurado com prioridade seis e responsvel pela aquisio das

amostras vindas do mdulo AD com uma taxa de amostragem de 10 kHz. J o Timer3 est

configurado com prioridade trs e utilizado para apresentao dos dados no Display, leitura

do Teclado e comunicao serial com o computador. O Timer4 utilizado para a

parametrizao do PWM1 e PWM2. A comunicao serial e os mdulos PWM so uma

previso para implantao futura.

A INT0 est configurada como prioridade sete e externa, recebendo o sinal do sensor

de rotao. O conversor AD est configurado de forma que as entradas AN0, AN1, AN2, AN3

e AN5 sejam entradas analgicas para receber o sinal dos trs eixos do acelermetro, a tenso

de alimentao da fonte e da corrente do motor sob teste. Segue trecho do cdigo fonte com a

parametrizao do mdulo AD:


79

void inicia_ADC()
{
ADCON1bits.ADON = 0; //desabilita o mdulo de converso A/D
ADCON1bits.ADSIDL = 0; //mdulo A/D continua convertendo mesmo com a CPU inativa
ADCON1bits.FORM = 0; //formato da sada da converso sem sinal
ADCON1bits.SSRC = 7; //contador interno termina uma amostragem e comea a prxima
ADCON1bits.ASAM = 0; //amostragem individual
ADCON2bits.VCFG = 0; //0 => referencia AVDD e AVSS interno, 1=> +Vref e -Vref externo
ADCON2bits.CSCNA = 1; //Habilita Scan alternado atravs das entradas selecionadas no
MUX A
//0; utiliza apenas um canal para a converso
ADCON2bits.SMPI = 4; //5 amostras ate a interrupcao ocorrer
//0; gera uma interrupo a cada converso - buffer(0)
ADCON2bits.BUFM = 0; //buffer de 16 bits
ADCON2bits.ALTS = 0; //utiliza sempre o MUX A, no alterna entre MUX A e MUX B
ADCON3bits.ADCS = Tad; //Tad equals Min amount of instr cycles Fastest possible
//seleciona o clock de converso
ADCON3bits.SAMC = 1; //define o tempo da auto-amostragem em 1 Tad
ADCON3bits.ADRC = 0; // derive Tad from system clock //
//utiliza o mesmo clock do sistema. Se 1 from internal RC
ADCHS = 0; //configura o conversor ANx como entrada positiva
ADCSSL = 0x002f; //entrada AN0,AN1,AN2,AN3 e AN5 p/ converso 00000000 0010 1111
ADPCFG = 0xffd0; //RB0,RB1,RB2,RB3,RB5 p/ entrada analog 1111 1111 1101 0000

IFS0bits.ADIF = 0; //clear no bit de chamada da interrupo da converso A/D


IPC2bits.ADIP = 5; //Define a prioridade da interrupo do mdulo A/D=7
IEC0bits.ADIE = 1; //habilita a interrupo do mdulo A/D
ADCON1bits.ADON = 1; //habilita o mdulo de converso A/D
}

A rotina principal main realiza a configurao das portas de entrada e sada dos pinos

dos PORTA, PORTB, PORTC, PORTD e PORTF. Nela realizado o zeramento de algumas

variveis utilizadas ao longo do programa, a inicializao da UART2 para transmisso de dados

ao PC via serial, a inicializao do Display LCD, a inicializao do conversor AD, os Timers

1, 2, 3 e 4 e a INT0 sendo que aps o programa entra em loop infinito. Segue abaixo transcrio

do cdigo fonte:

int main(void){
TRISA = 0xffff; //Seta TRISA como entradas
TRISB = 0xe0ff; //Seta RB0 a RB7 p/ entrada e RB8 a RB12 p/
saida - 1110 0000 1111 1111
TRISC = 0xffff; //Seta PortC como entradas; 1111 1111 1111 1111
TRISD = 0xfef8; //Seta RD0 a RD2 e RD8 como saidas e demais
portas como entradas - 1111 1100 1111 1000
TRISF = 0xff10; //Seta RF0 a RF3 e RF5 a RF7 como saidas e demais
portas como entradas - 1111 1111 0001 0000

inicio = 0;
inicia_UART2(); //Transmissao de dados para o PC via RS232
Delay_ms(5); //Tempo para evitar erro ao ligar o equipamento
lcd_init(); //Carrega rotina de inicializacao do display
fgLed = 0; //Zera a flag indicativa de estado do led
a = 0; //Zera a variavel a
i = 0; //Zera a variavel i
Tecla = 0; //Zera a variavel Tecla
cor = 0; //Zera a variavel corrente

inicia_ADC(); //Inicia conversor analogico digital


inicia_timer1(); //inicializa o timer de Atividade
Delay_ms(400); //Tempo para inicializar os timers simultaneos
80

inicia_timer3(); //inicializa o timer de envio de dados ao display/PC


inicia_timer2(); //inicializa o timer de aquisicao dados analogicos
inicia_timer4(); //inicia timer de PWM
inicia_int0(); //inicializa interrupo 0

while(1){ //Loop principal -> infinito


} //Fim do while
return 0; //Devolve zero (0)
}

O processador em loop infinito aguarda as interrupes, atendendo a cada uma de acordo

com sua prioridade, sendo o Timer3 responsvel pela execuo da rotina de teste solicita

interrupo do processador a cada 125 ms para execut-la.

A rotina de atendimento a interrupo do Timer3 gerencia as telas de execuo.

Inicialmente apresentada a tela de inicializao, exibida ao ligar a Giga de Testes, e apresenta

as informaes da verso do software e autor, aguardando pressionar a tecla "*" para troca de

tela, carregando a tela seguinte que o menu de seleo das telas de parametrizao, execuo

ou exibio dos parmetros digitados.

A tela de parametrizao (1) utilizada para digitar o cdigo do item a ser testado e

seus limites de corrente, tenso e RPM. Para a troca dos campos utiliza-se a tecla "#". Aps a

parametrizao pressiona-se a tecla "*" para retornar ao menu inicial. Para execuo do teste

utiliza-se a tela 2 (execuo). O fluxograma bsico da rotina de teste apresentado na Figura

2.19.
81

INICIO

BOTO N
INCIO?

S
MEDE TENSO

TENSO N MENSAGEM
OK? FALHA TENSO

S
ACIONA RELE
MOTOR

INICIA CONTADOR
15 s

MEDE ROTAO

MEDE CORRENTE

MEDE VIBRAO

COMPARA COM
PADRO

CONTADOR N
= 15 s?

S
DESLIGA RELE
MOTOR

VALORES N ESCREVE
OK? REPROVADO

S
ESCREVE
APROVADO

Figura 2.19 Fluxo bsico do software.


Fonte - Autor, 2013.
82

O teste comea ao pressionar o boto de incio. Primeiramente realizada a verificao

da tenso da fonte do motor. Caso esteja correta o teste incia acionando o rel para o motor

entrar em funcionamento e realiza o incio da contagem de tempo de 15 s. Na sequencia ocorre

a verificao de rotao do motor, a corrente de consumo e a verificao da vibrao. Os valores

medidos so comparados aos valores padro pr-definidos. Este sequencia repetida durante

os 15 s e ao final desligado o rel do motor e no campo status apresentada a mensagem

"APROVADO" caso os valores lidos estejam dentro dos limites estabelecidos ou ento

"REPROVADO" caso esteja fora dos limites. Ao final do teste a rotina aguarda novo comando

de incio. O cdigo fonte completo est disponvel no Apndice A.

No mdulo de AD so realizados os clculos de acelerao da gravidade em valores

rms. Primeiramente os valores de acelerao so colocados em mdulo, para eliminar os valores

negativos. Aps o valor convertido para seu valor em acelerao (g). Para indicao do valor

lido em rms realizada uma amostragem de 1000 pontos, conforme Equao 2.1.

1000
1
= 2 (2.1)
1000
=1

Trata-se de um somatrio com o valor de cada ponto coletado elevado ao quadrado.

Apos a coleta das 1000 amostras retirada a raiz quadrada da mdia das amostras para que seja

obtido o valor rms de g. Segue abaixo a transcrio da rotina de interrupo do mdulo AD:

//******************************************************************************
//***** Rotina de Tratamento da Interrupo do Conversor A/D
83

//******************************************************************************
void _ISR _ADCInterrupt(void)
{
int i = 0; //define a varivel inteira Pos_Atual
ptr = &ADCBUF0; //ponteiro ptr recebe o endereo do buffer0 de
converso A/D

while (i < 16) //executa a leitura da converso A/D enquanto i<16


{
ADResult[i++] = *ptr++; //ponteiro ptr incrementado at i=15
//ADResul recebe os valores da converso A/D na
posio '0'
//so feitas 16 leituras para garantir que os 16
buffers da
//converso A/D sejam lidos e automaticamente
limpos,
//garantindo que o resultado da prxima leitura
fique no buffer0
} //fim do while

AC_x = ADResult[0]; //Sinal acelerometro eixo x


AC_y = ADResult[1]; // Sinal acelerometro eixo y
AC_z = ADResult[2]; // Sinal acelerometro eixo z
Tensao = ADResult[3]; // Tensao da fonte
Corrente = ADResult[4]; // Corrente do motor

if (contamostra<1000){
contamostra++;
if (AC_x > gx_Z)Mgx = AC_x - gx_Z; else Mgx = gx_Z - AC_x; //Faz o modulo de
g
// Mgx = Mgx / 0.160; //Divide pelo valor de 1g
Migx = Mgx / 653.0; //Divide pelo valor de 1g
Mtgx = Mtgx + (Migx * Migx); //Soma os valores ate ter 1000 amostras

if (AC_y > gy_Z)Mgy = AC_y - gy_Z; else Mgy = gy_Z - AC_y; //Faz o modulo de
g
// Mgy = Mgy / 0.160; //Divide pelo valor de 1g - 160
Migy = Mgy /655.0; //Divide pelo valor de 1g - 160
Mtgy = Mtgy + (Migy * Migy); //Soma os valores ate ter 500 amostras

if (AC_z > gz_Z)Mgz = AC_z - gz_Z; else Mgz = gz_Z - AC_z; //Faz o modulo de
g
// Mgz = Mgz / 0.160; //Divide pelo valor de 1g - 160
Migz = Mgz /655.0; //Divide pelo valor de 1g - 160
Mtgz = Mtgz + (Migz * Migz); //Soma os valores ate ter 500 amostras
}
else {
Mg_y = sqrt(Mtgy / 1000) * 100;// / 10; //Migy; //Mtgy;// / 10000.0; // *
20.0; // Calcula a variavel para exibicao no display (x1000)
Mg_x = sqrt(Mtgx / 1000) * 100;// / 10; //Migx; //Mtgx / 1000.0; // * 20.0;
// Calcula a variavel para exibicao no display (x1000)
Mg_z = sqrt(Mtgz / 1000) * 100;// / 10;// / 1000.0; // * 20.0; // Calcula
a variavel para exibicao no display (x1000)
contamostra = 0; //Contador para amostragem AD (0.5s)
Mtgy =0;
Mtgx = 0;
Mtgz=0;
x_RMS = Mg_x;
y_RMS = Mg_y;
z_RMS = Mg_z;

IFS0bits.ADIF = 0; //clear no bit de chamada da interrupo da


converso A/D
}
84

Com o desenvolvimento das rotinas de software o prottipo verificado para

comprovar o seu correto funcionamento e indicar os pontos de melhoria necessrios. O Captulo

3 apresenta os resultados obtidos.


3 TESTES E AVALIAES

Os testes com o prottipo so realizados em partes. Primeiro verifica-se a indicao de

tenso, aps corrente, rotao e por fim vibrao, comparando os valores medidos aos valores

esperados.

A verificao da tenso ocorre aplicando-se tenso (fonte de bancada) na entrada da

Giga de Teste e verificando seu resultado no Display. ento realizado um comparativo entre

o valor apresentado e o valor da fonte de tenso. A indicao de tenso no Display realizada

com preciso de uma casa decimal. O resultado obtido com a indicao de tenso satisfatrio,

pois apresenta variao mxima de 1,6% em comparao medio realizada com multmetro

digital modelo Minipa ET1110A. A Tabela 3.1 mostra o comparativo entre os valores

fornecidos ao sistema e os valores indicados.

Tabela 3.1 Comparativo entre Tenses.

Tenso Tenso
Tenso Fonte Variao (%)
Multmetro Display Giga
0,0 0,0 0,0 0,0%
5,0 5,1 5,0 -1,6%
10,0 10,1 10,0 -1,0%
15,0 15,1 15,1 -0,2%
20,0 20,2 20,1 -0,5%
25,0 25,2 25,2 0,0%
30,0 30,2 30,3 0,3%
Fonte - Autor, 2013.
86

A corrente verificada de forma similar tenso, comparando-se a corrente indicada no

display da Giga de Testes com o valor indicado pelo ampermetro da fonte, com um motor CC

RS100 24V de cdigo Imobras 101201024. A Tabela 3.2 apresenta os dados coletados de

corrente, considerando trs valores de referncia.

Tabela 3.2 Comparativo de Valores de Corrente.

Iref
Leitura 1,75 2,25 3,20
1 1,9 2,3 3,0
2 1,8 2,3 3,0
3 1,7 2,2 3,2
4 1,7 2,2 3,3
5 1,9 2,1 3,0
6 1,6 2,4 3,0
7 1,7 2,3 3,0
8 1,9 2,2 3,0
9 1,6 2,1 3,0
10 1,8 2,1 3,2
Fonte - Autor, 2013.

A Tabela apresenta dez leituras para cada corrente de referncia escolhida, sendo os

valores 1,75 A, 2,25 A e 3,20 A. A Tabela 3.3 apresenta a anlise dos valores adquiridos.

Tabela 3.3 Analise dos dados da Tabela 3.2

Iref
Valores Lidos 1,75 2,25 3,20
Minimo 1,6 2,1 3
Maximo 1,9 2,4 3,3
Mdia 1,76 2,22 3,07
Amplitude 0,3 0,3 0,3
Variao
Max 7,9% 6,3% 3,0%
Variao
Md 0,6% -1,4% -4,2%
Fonte Autor, 2013.
87

Com base na anlise dos dados medidos, verifica-se que a corrente mdia para as trs

diferentes correntes ficou prximo ao valor de referncia com a maior diferena para o valor de

3,2 A. Os valores de corrente apresentam variao com uma amplitude de 0,3 A em relao aos

trs valores de corrente de referncia (Iref). Esta variao chega a 7,9% comparado ao valor de

referncia de 1,75 A.

Para verificar a indicao de RPM, submete-se o motor a diferentes velocidades, sendo

comparado o valor informado no display ao calculado atravs da medio da frequncia do sinal

emitido pelo sensor de corrente via osciloscpio. A Tabela 3.4 apresenta os resultados obtidos

para as diferentes rotaes testadas.

Tabela 3.4 Resultados de Medio de RPM.

Rotao
Frequncia Rotao
Indicada
Medida (Hz) Terica
(RPM)
1440 24 1440
2280 37,3 2238
3120 52 3120
3840 64 3840
4080 67,5 4050
Fonte - Autor, 2013.

Comparando-se os dados de rotao terica aos da rotao indicada verifica-se que h

coerncia nas leituras, uma vez que apresentam pouca ou nenhuma variao. A Figura 3.1

apresenta uma foto com um exemplo de forma de onda do sinal do sensor de rotao medido

com osciloscpio.
88

Figura 3.1 Foto com forma de onda do sinal do sensor de rotao.


Fonte - Autor, 2013.

Na foto observa-se a medio de uma frequncia de 67,57 Hz, equivalente a 4050

RPM. O clculo da rotao equivalente realizado multiplicando-se a frequncia medida por

120, uma vez que a taxa de amostragem de 0,5 s.

Para verificar o funcionamento do acelermetro primeiro realiza-se o zeramento dos trs

eixos (x, y, z), posicionando-se o acelermetro com seu eixo z posicionado para cima, conforme

apresentado na foto da Figura 3.2.

Figura 3.2 Foto do acelermetro posicionado.


Fonte - Autor, 2013.

Aps, ao pressionar a tecla "*" para acessar a tela 2 de execuo do teste

automaticamente realizado o zeramento dos eixos. Este zeramento ocorre conforme


89

determinado na rotina de software. Neste momento o display apresenta os trs eixos zerados,

conforme pode ser visualizado na Figura 3.3.

Figura 3.3 Foto da indicao de zeramento do acelermetro.


Fonte Autor, 2013.

Ao alterar a posio do acelermetro os valores indicados so alterados em seu

respectivo eixo. Por exemplo, alterar a posio do acelermetro girando-o em seu eixo "y" para

a esquerda o display passa a indicar 0.0gx, 1.0gy e 1.0gz conforme apresentado na foto da

Figura 3.4.

Figura 3.4 Foto da indicao com o acelermetro girado em y.


Fonte Autor, 2013

Ao girar o acelermetro ainda em seu eixo "y" porm para a direita, tambm ocorre a

indicao de 0.0gx, 1.0gy e 1.0gz. Ao inverter o acelermetro de forma a manter o eixo "z"

direcionado para baixo a indicao de 0.0gx, 0.0gy e 2.0gz. Ao girar o acelermetro em seu
90

eixo "x" a indicao passa a ser de 1.0gx, 0.0gy e 1.0gz. Desta forma, verifica-se que o

acelermetro est corretamente instalado e seu sinal corretamente interpretado pelo

microprocessador.

Outro teste realizado o de acionamento do motor. Para isto o motor conectado Giga

de Teste, a Tela 2 selecionada e o boto de incio pressionado. Verifica-se que o motor

ento ligado, as caractersticas de tenso, corrente, RPM e vibrao so indicadas no Display e

aps 15 s o motor desligado. A Figura 3.5 apresenta uma foto do Display aps final do teste.

Figura 3.5 Apresentao do Display aps final do teste.


Fonte Autor, 2013.

Pela foto verifica-se que os dados so corretamente exibidos no Display, porm ao final

do teste no est sendo apresentado a mensagem de "APROVADO" ou "REPROVADO",

indicando o status do motor testado.


CONSIDERAES FINAIS

O objetivo geral estabelecido para este Trabalho de Concluso de Curso o

desenvolvimento de um prottipo para aquisio de caractersticas de motores eltricos de

corrente contnua e uso destas informaes para aprovao ou reprovao dos motores,

indicando o motivo da falha. As caractersticas medidas so corrente, rotao, tenso e vibrao.

A informao de aprovao ou rejeio realizada via Display e armazenada em arquivo de

dados transmitido de forma serial a um microcomputador. A parametrizao das informaes

realizada via teclado.

Os objetivos especficos definidos para este Trabalho so:

1. Estudo de caractersticas de motores DC;

2. Estudo de funcionamento microcontrolador DSPIC;

3. Estudo de funcionamento de acelermetros;

4. Estudo sobre displays;

5. Estudo e desenvolvimento do hardware necessrio;


92

6. Desenvolvimento do software para microcontrolador, em linguagem C.

7. Montagem do prottipo;

8. Verificao do funcionamento do prottipo.

O objetivo geral deste TCC no foi plenamente atingido. Todo o hardware foi

desenvolvido e testado, podendo ser comprovada a indicao correta das caractersticas de

tenso, corrente, rotao e apresentao dos valores de vibrao. Porm a apresentao da

aprovao ou rejeio no est implementada, bem como a transmisso dos dados para o PC.

Referente aos objetivos especficos, considera-se atendido o estudo sobre motores

eltricos de corrente contnua, estudo de microcontrolador, estudo de acelermetros, estudo

sobre displays e estudo e desenvolvimento do hardware necessrio.

O desenvolvimento de software foi atendido, porm ainda restam pontos de

implementao e melhoria como a indicao das mensagens de alertas e erros e transmisso

dos dados ao PC.

A montagem do prottipo tambm uma etapa plenamente atendida e que permitiu a

verificao do funcionamento do mesmo. Com a realizao dos testes com o prottipo so

identificadas oportunidades de melhoria que so citadas como desenvolvimentos futuros:

Finalizao do software para indicao do status de aprovao ou reprovao do

motor testado, bem como indicao do componente da falha caso reprovado e a


93

implementao da comunicao serial com o PC com o desenvolvimento de um

supervisrio.

Implementao de uso de PWM para acionamento dos motores, permitindo

aquisio das caractersticas em diferentes pontos da curva de torque. Desta

forma permite-se analisar o motor em vrios pontos da curva caracterstica;

Implementao do software para, alm da anlise de amplitude do sinal realizar

a anlise espectral da frequncia da vibrao. Desta forma torna-se possvel

identificar tambm o componente especfico causador da vibrao e rudo

(rolamento, chaveamento das escovas, desbalanceamento do rotor, etc.).


REFERNCIAS BIBLIOGRFICAS

AUTOMAO 2010. Sensores ticos. Site da internet: 2010. Disponvel em:

<http://automacao2010.blogspot.com.br/2010/03/sensores-digitais-oticos-e-ultra.html>

Acesso em: 12 junho 2013.

JOHNSON ELETRIC. Motor EC. Site da internet: 2013. Disponivel em:

<http://www.johnsonelectric.com/pt/resources-for-engineers/automotive-applications/motion-

technology/ec-motor-brushless.html>. Acesso em 20 de novembro de 2013.

LIMA, Charles Borges de e VILHAA Marco V. M.. AVR e Arduino: Tcnicas de Projeto.

2 Ed. Florianpolis SC: IFSC, 2012.

MARAL, Rui F. M. e SUSIN, Altamiro A.. Detectando Falhas Incipientes em Mquinas

Rotativas. 1 Ed. Ponta Grossa - PR. UTFPF, 2005. Disponvel em:

<http://revistas.utfpr.edu.br/pg/index.php/revistagi/article/view/167> Acessado em 17 agosto

2013.
95

MARQUES, A. M. Ventura. Converso de Unidades de Vibrao. Revista Mecatrnica

Atual, Ed. 34: 2007. Disponvel em <http://www.mecatronicaatual.com.br/artigos/786-

converso-de-unidades-de-vibrao> Acesso em: 03 outubro 2013.

MICROCHIP, Technology Incorporated.dsPIC30F3014,dsPIC30F4013 Data Sheet.

Califrnia: 2010. 228p. Disponvel em:

<http://ww1.microchip.com/downloads/en/DeviceDoc/70138G.pdf>. Acesso em: 20/09/2013.

MICROCHIP, Technology Incorporated.Getting Started with dsPIC30F Digital Signal

Controllers User's Guide. Califrnia: 2005. 132p. Disponvel em:

<http://ww1.microchip.com/downloads/en/DeviceDoc/70151a.pdf>. Acesso em: 12/06/2013.

MICROCHIP, Technology Incorporated.MPLAB XC16 C Compiler Users Guide.

Califrnia: 2013. 366p. Disponvel em:

<http://ww1.microchip.com/downloads/en/DeviceDoc/50002071C.pdf>. Acesso em:

20/09/2013.

OPTEK, Technology Inc.. Datasheet. Reflective Object Sensor, Texas, v. 1, n. 1, p. 1 - 9,

mar. 2012.

RAMOS, Eduardo Souza.Comunicao de LCD em 4 vias. Site de internet: 2005 Disponvel

em: <http://www.4shared.com/office/nlNMTdzN/tutorial_lcd_em_4_vias.htm> Acessado em

12/3/13.
96

SEARA DA CINCIA. O Acelermetro, Site da internet: 2012. Disponvel em:

<http://www.seara.ufc.br/tintim/tecnologia/acelerometro/acelerometro01.htm> Acesso em:23

setembro 2012.

SIEMENS LTDA.Motores de Corrente Continua. Ed.01/2006. Disponvel

em:<http://www.deg.ufla.br/site/_adm/upload/arquivos/motorcc-siemens.pdf> Acesso em 05

outubro 2012.

SILVA, Tiago Maciel da,Desenvolvimento de Sistema que Executa a Monitorao de

Vibraes em Motores de Induo Trifsicos. 1. Ed. Novo Hamburgo RS. (FEEVALE,

2011)

SIMONE, Gildo Aluisio. Mquinas de Corrente Contnua: Teoria e Exerccios. 1.ed. So

Paulo SP:rica, 2000.

SOARES, Alex Rodrigues.Desenvolvimento de Sistema Sensor Microcontrolado de

Acidente Automotivo via Tecnologia GPS e GSM. 1. Ed. Novo Hamburgo RS.

(FEEVALE, 2011)

SOUZA, David Jos de. Desbravando o PIC.4.ed. So Paulo, SP: rica, 2006.

UNIP, Universidade Paulista.Sensoreamento de Corrente.2010. Disponvel

em:<http://www.ebah.com.br/content/ABAAABSYwAH/sensoreamento-corrente#>. Acesso

em: 12 junho 2013.


97

WIKIPEDIA Org, Efeito Hall. Site da internet:2013. Disponvel em:

<http://pt.wikipedia.org/wiki/Efeito_Hall> Acesso em: 12 junho 2013.


ANEXO A

BLOCO DIAGRAMA MICRONTROLADOR DSPIC30F4013


APNDICE A

SOFTWARE DESENVOLVIDO PARA O PROTTIPO

/*
Autor: Marcos Jose Mossmann
Data: 30/11/2013
Titulo: Giga de Teste Para Motores Eletricos DC - Baixa Potencia
Rev: 14
Assunto:
00 Listar todos os pinos do dsPIC no Mapeamento das ligacoes
00 Escolher pino de saida para ligar um LED - OK
01 Desenvolvimento da delayms() e rotinas para Display LCD com timer1 - OK
02 Ajuste rotina display - OK
03 Habilitar timer2 mais rapido (20Hz) para display - OK
03 Plotar cursor (linha, coluna) - OK
03 Criar conversor texto para hexa para escrever no display (string)- OK
05 Habilitar comunicacao serial - OK
07 Habilitar leitura do teclado - OK 9/11/13
07 Implementar conversor AD - OK
09 Implementar conversor AD - OK
09 Habilitar timer 3 para envio de dados a display / PC - OK
11 Habilitar Timer 4 para PWM - OK, mas verificar frequencia
11 Habilitar INT para RPM - OK MAS FALTA ACERTAR LEITURA E INDICACAO
11 Revisar rotina teclado - falha ultima linha do teclado - OK
11 Labels indicacao no display - OK
13 Acertar leitura acelerometro (calibrar)
13 Temporizar e estruturar teste
13 Entrada de parametros via teclado para configuracao

********************************************************************************
**** Mapeamento das ligacoes do DSPIC30F4013 aos outros modulos
********************************************************************************
Pino Funo Pino Ligao dos pinos aos mdulos utilizados
********************************************************************************
01 MCLR Push button reset +R1+R2+CN5 pino 6 (MCLR) p/gravar in-circuit + VCC
02 AN0/VREF+/CN2/RB0 Pino de Entrada Analogica Eixo X acelerometro
03 AN1/VREF-/CN3/RB1 Pino de Entrada Analogica Eixo Y acelerometro
04 AN2/SS1/LVDIN/CN4/RB2 Pino de Entrada Analogica Eixo Z acelerometro
05 AN3/CN5/RB3 Pino de Entrada Analogica para Medicao Tensao
06 AN4/IC7/CN6/RB4 Pino de Entrada para Botao Start para acionamento do teste
07 AN5/IC8/CN7/RB5 Pino de Entrada Analogica para Medicao de Corrente
08 PGC/EMUC/AN6/OCFA/RB6 CN5 Pino 4 (SCK) Serial Clock p/ gravacao in-circuit
09 PGD/EMUD/AN7/RB7 CN5 Pino 5 (SDA) Serial Data p/ gravacao in-circuit
10 AN8/RB8 Pino de Saida para Display (D4)
11 VDD 5V
12 Vss GND
13 OSC1/CLKI Cristal 20MHz + C3
14 OSC2/CLKO/RC15 Cristal 20MHz + C2
15 EMUD1/SOSCI/T2CK/U1ATX/CN1/RC13 Pino de Entrada para Teclado (Linha 1)
16 EMUC1/SOSCO/T1CK/U1ARX/CN0/RC14 Pino de Entrada para Teclado (Linha 2)
17 INT0/RA11 Pino de Entrada para Interrupcao de medicao de RPM
18 IC2/INT2/RD9 Pino de Entrada para Teclado (Linha 3)
19 OC4/RD3 Pino de Entrada para Teclado (Linha 4)
100

20 Vss GND
21 VDD 5V
22 OC3/RD2 Pino de Saida para Display (D5)
23 IC1/INT1/RD8 Pino de Saida para Display (D6)
24 EMUC3/SCK1/RF6 Pino de Saida para Display (D7)
25 EMUD3/U1TX/SDO1/SCL/RF3 Pino de Saida para Display (RS)
26 U1RX/SDI1/SDA/RF2 Pino de Saida para Display (E)
27 U2TX/CN18/RF5 Pino TX para comunicacao serial - Saida
28 U2RX/CN17/RF4 Pino RX para comunicacao serial - Entrada
29 C1TX/RF1 Pino de Saida para Teclado (Coluna 1)
30 C1RX/RF0 Pino de Saida para Teclado (Coluna 2)
31 Vss GND
32 VDD 5V
33 EMUD2/OC2/RD1 PWM1
34 EMUC2/OC1/RD0 PWM2
35 AN12/COFS/RB12 Pino de Saida LED STATUS(Entrada para Sensor Descarte Peca)
36 AN11/CSDO/RB11 Pino de Saida para acionamento rele
37 AN10/CSDI/RB10 Pino de Saida para Teclado (Coluna 3)
38 AN9/CSCK/RB9 Pino de Saida para Teclado (Coluna 4)
39 AVss GND Tenso de referencia para conversor AD
40 AVDD 5V Tenso de referencia para conversor AD
*/
//******************************************************************************
//***** BIBLIOTECAS UTILIZADAS
//******************************************************************************
#include<p30f4013.h> //Biblioteca do dsPIC30F4013
#include<uart.h> //Biblioteca UART.h
#include<pwm.h> //Biblioteca PWM.h
#include<reset.h> //Biblioteca reset.h
#include<math.h> //Biblioteca para operacoes matematicas
#include<string.h> //Biblioteca para operacao com strings
#include<stdio.h> //Biblioteca para operacoes de IO

//******************************************************************************
//***** FUSES (CONFIGURACAO DOS REGISTRADORES)
//***** Configura caacteristicas de operacao do microcontrolador dspic30f4013
//******************************************************************************

_FOSC(CSW_FSCM_OFF & HS); // Oscilador externo sem tratamento de erro


_FWDT(WDT_OFF); //WatchDog desabilitado. Reseta processador num evento de mal
funcionamento de software.
// WDT_OFF = (0x7FFF)h = (111111111111111)
// WDT_ON = (0xFFFF)h = (l111111111111111)
_FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF); // Habilita MCLR, Desabilita PBOR e PWRT
_FGS(CODE_PROT_OFF); // Sem protecao de codigo - E possivel a leitura
posterior a gravacao do chip

//******************************************************************************
//**** DEFINE VALORES PADRAO PARA O PROGRAMA************************************
//******************************************************************************
#define Fcy 5000000 //Freqncia do ciclo=freqncia do oscilador/4
//dsPIC necessita de 4 ciclos de clock para executar
//um ciclo de instruo
#define Tad (7)
//Frequencia do Timer 2 para habilitar conv A/D = 10kHz
#define Freq_AD (Fcy / 10000); //Freq_AD = 500
#define LigLed LATBbits.LATB12 = 1; //Definicao para led ligado em RB12
#define DesLed LATBbits.LATB12 = 0; //Definicao para led desligado em RB12
//#define Self_Test_On LATDbits.LATD0 = 1; //habilita o self test do acelerometro
//#define Self_Test_Off LATDbits.LATD0 = 0; //Desliga o self test do acelerometro

//Definicao dos pinos utilizados pelo display


#define RS LATFbits.LATF3 //Define pino RF3 como RS do display
#define EN LATFbits.LATF2 //Define pino RF2 como enable do display
#define D4 LATBbits.LATB8 //Define pino RB8 como Pino 4 display
#define D5 LATDbits.LATD2 //Define pino RD2 como Pino 5 display
#define D6 LATDbits.LATD8 //Define pino RD8 como Pino 6 display
#define D7 LATFbits.LATF6 //Define pino RF6 como Pino 7 display

//Pinos utilizados pelo teclado:


#define Coluna_4 LATFbits.LATF1 //Out Coluna 4 (Teclas 1 4 7 *)
#define Coluna_3 LATFbits.LATF0 //Out Coluna 3 (Teclas 2 5 8 0)
#define Coluna_2 LATBbits.LATB10 //Out Coluna 2 (Teclas 3 6 9 #)
#define Coluna_1 LATBbits.LATB9 //Out Coluna 1 (Teclas A B C D)
//
#define Linha_4 PORTCbits.RC13 //In Linha 4 (Teclas 1 2 3 A) + Pull Dw 4K7
101

#define Linha_3 PORTCbits.RC14 //In Linha 3 (Teclas 4 5 6 B) + Pull Dw 4K7


#define Linha_2 PORTDbits.RD9 //In Linha 2 (Teclas 7 8 9 C) + Pull Dw 4K7
#define Linha_1 PORTDbits.RD3 //In Linha 1 (Teclas * 0 # D) + Pull Dw 4K7

#define Inicio PORTBbits.RB4 //Entrada sinal inicio teste


#define LigaRele LATBbits.LATB11 = 1; //Saida acionamento rele
#define DesRele LATBbits.LATB11 = 0; //Saida acionamento rele

//******************************************************************************
//****DECLARACAO DAS VARIAVEIS**************************************************
//******************************************************************************
char fgLed; //Flag para indicar estado do Led.
unsigned char fginicio = 0; //Flag para indicar estado do rele
unsigned char tempoteste; //variavel para contar o tempo de teste
char inicio; //variavel para inicio testes
unsigned int i,temp; //Variaveis i e temp para rotinas display
unsigned char a; //Variavel para testes com display
unsigned int fgrpm; //Flag para indicar estado leitor rotacao.
unsigned int Par2; //define a variavel inteira sem sinal Par2
//Parametro 2 recebidoou transmitido via UART
char Cmd; //define a variavel Cmd
volatile unsigned int *ptr; //define a varivel ponteiro inteira sem sinal ptr
unsigned int ADResult[16]; //define a matriz de variveis inteiras sem sinal
ADResult
//recebe o resultado da converso A/D
unsigned int Corrente, Tensao, AC_z, AC_y, AC_x; //Recebem os valores das analogicas
unsigned int Rotacao; //recebe o valor da rotacao lido na int0
char Tecla; //recebe o valor pressionado no teclado
unsigned int duty = 0; //Variavel para uso no PWM
int vezes=0; //Variavel de contagem de ciclos para execuo do clculo valor RMS
unsigned int total_x=0; //Variavel p/ acumular valores vibrao p/ clculo RMS eixo x
unsigned int total_y=0; //Variavel p/ acumular valores de vibrao clculo RMS eixo y
unsigned int total_z=0; //Variavel p/ acumular valores vibrao p/ clculo RMS eixo z
float x_RMS=0; //Variavel p/ colocar o valor RMS calculado de vibrao do eixo x
float y_RMS=0; //Variavel p/ colocar o valor RMS calculado de vibrao do eixo y
float z_RMS=0; //Variavel p/ colocar o valor RMS calculado de vibrao do eixo z
unsigned int gx, gy, gz; //Variaveis p/ calculos acelerometro
unsigned int u,cor,rot1, rot; //Variavel p/ calculo tensao e corrente e rotacao
unsigned int corZ = 2048;
float u_rms = 0; //Variavel para calculo tensao RMS
float cor_rms=0; //Variavel para calculo corrente RMS
float total_u=0; //Variavel que recebe o total de tensao medida
float total_corr=0; //Variavel que recebe o total de corrente medida

unsigned int Imax=2300; //Variavel p/ receber o valor maximo permitido de corrente


unsigned int Imin=2150; //Variavel p/ receber o valor minimo permitido de corrente
unsigned int RPMmax = 2500; //Variavel p/ receber o valor maximo permitido de rotacao
unsigned int RPMmin = 1600; //Variavel p/ receber o valor minimo permitido de rotacao
unsigned int Vmax; //Variavel p/ receber o valor maximo permitido de tensao
unsigned int Vmin; //Variavel p/ receber o valor minimo permitido de tensao
unsigned char Tela = 0; //Variavel que determina qual a tela ativa
unsigned char Campo = 0; //Variavel que determina qual a tela ativa
unsigned char Index = 0; //Variavel que determina qual a tela ativa
unsigned char fgcampo; //flag para indicar campo a ser preenchido

unsigned char imax[4]; //variavel p/ receber o valor digitado de limite de corrente


unsigned char imin[4]; //variavel p/ receber o valor digitado de limite de corrente
unsigned char vmax[4]; //variavel p/ receber o valor digitado de limite de tensao
unsigned char vmin[4]; //variavel p/ receber o valor digitado de limite de tensao
unsigned char rpm1[4]; //variavel p/ receber o valor digitado de limite de rpm
unsigned char rpm2[4]; //variavel p/ receber o valor digitado de limite de rpm
unsigned char codigo[9]; //variavel para receber o valor digitado de codigo
unsigned int gx_Z=1400; //Variavel para valor de calibrao eixo x
unsigned int gy_Z=1400; //Variavel para valor de calibrao eixo y
unsigned int gz_Z=1400; //Variavel para valor de calibracao eixo z
unsigned int Mgx; //variavel para calculo do valor medio de x
unsigned int Mgy; //variavel para calculo do valor medio de y
unsigned int Mgz; //variavel para calculo do valor medio de z
float Migy,Migx,Migz; //Variaveis para valor integrativo da media do eixo y
unsigned int contamostra; //variavel para contador tempo
float Mtgy=0, Mtgx=0,Mtgz=0; //variavel para receber somatorio das amostragens
unsigned int corr; //variavel para calculo da corrente
// float Migx;
// unsigned int Migz;
102

//******************************************************************************
//**** FUNCOES UTILIZADAS
//******************************************************************************
void inicia_timer1(void); //Inicia timer 1. indica estado
void __attribute__((interrupt, auto_psv))_T1Interrupt(void);
void Delay_ms(int d){ double i; int f; f = 13 * d; for (i=0;i<f;i++){} } //Funcao delay,
utilizada para display
void DATA(unsigned char nib); //Funcao utilizada para envio de 4 bits ao display
void lcd_init(void); //Subrotina lcd_init para inicializacao do display
void lcd_command(unsigned char);//Subrotina lcd_command p/ envio de comandos p/ display
void lcd_data(unsigned char); //Subrotina lcd_data p/ transferencia de dados ao display
void DispValDec(unsigned int, char); //Subrotina p/ escrever valor decimal no display
void DispValInt(unsigned int ); //Subrotina p/ escrever valor inteiro no display
unsigned int ConvIntDec(unsigned int, char); //Subrotina para converter valor inteiro em
decimal
void DispValHex(unsigned int); //Subrotina para escrever valor hexadecimal no display
void inicia_timer2(void); //Subrotina para iniciar o timer 2
void __attribute__((interrupt, auto_psv))_T2Interrupt(void);
void inicia_ADC (void); //inicia a converso A/D
void __attribute__((interrupt, auto_psv)) _ADCInterrupt(void); //Rotina Atendimento
Interrupcao da converso A/D
void inicia_UART2(void); //iniciar a UART2
void __attribute__((interrupt, auto_psv))_U2TXInterrupt(void); //interrupcao de
transmissqo de dados
void __attribute__((interrupt, auto_psv))_U2RXInterrupt(void); //interrupcao de
recepcao de recepcao de dados
void inicia_timer3(void); //Rotina para iniciar o timer 3
void __attribute__((interrupt, auto_psv))_T3Interrupt(void);
void inicia_timer4(void); //Inicia o timer da configuracao do PWM
//void __attribute__((interrupt, auto_psv))_T4Interrupt(void);
void cursor(unsigned char L, unsigned char C); //Subrotina para escolher posicao de
escrita do cursor
void DispString(char *string); //Funcao para escrever caracteres no display
void TransPac2 (char b); //Funcao para transmitir um byte via UART2
char le_Teclado(void); //Rotina para leitura do teclado
void inicia_int0(void); //inicia a interrupo de mudana de nivel
no pino 17(INT0)
void __attribute__((interrupt, auto_psv)) _INT0Interrupt(void); //Rotina de
tratamento da interrupo de INT0
void Tela_1(void); //Tela configuracao parametros motor
void Tela_2(void); //Tela parametros lidos (execucao)
void Inicializacao(void); //Tela de inicializacao da giga
void Tela_Menu(void); //Tela Inicial para selecao execucao ou parametrizacao
void Alarmes(void); //Tela de mensagens de alertas

int main(void){
TRISA = 0xffff; //Seta TRISA como entradas
TRISB = 0xe0ff; //Seta RB0 a RB7 p/ entrada e RB8 a RB12 p/ saida -
1110 0000 1111 1111
TRISC = 0xffff; //Seta PortC como entradas; 1111 1111 1111 1111
TRISD = 0xfef8; //Seta RD0 a RD2 e RD8 como saidas e demais portas como
entradas - 1111 1100 1111 1000
TRISF = 0xff10; //Seta RF0 a RF3 e RF5 a RF7 como saidas e demais portas
como entradas - 1111 1111 0001 0000

inicio = 0;

inicia_UART2(); //Transmissao de dados para o PC via RS232


Delay_ms(5); //Tempo para evitar erro ao ligar o equipamento
lcd_init(); //Carrega rotina de inicializacao do display
fgLed = 0; //Zera a flag indicativa de estado do led
a = 0; //Zera a variavel a
i = 0; //Zera a variavel i
Tecla = 0; //Zera a variavel Tecla
cor = 0; //Zera a variavel corrente

inicia_ADC(); //Inicia conversor analogico digital


inicia_timer1(); //inicializa o timer de Atividade
Delay_ms(400); //Tempo para inicializar os timers simultaneos
inicia_timer3(); //inicializa o timer de envio de dados ao display/PC
inicia_timer2(); //inicializa o timer de aquisicao dados analogicos
inicia_timer4();
inicia_int0(); //inicializa a interrupcao externa 0

while(1){ //Loop principal -> infinito

} //Fim do while
103

return 0; //Devolve zero (0)

//******************************************************************************
//Rotina de inicializao do timer 1 para o LED indicador status
//******************************************************************************
void inicia_timer1(void) //PR1= 5000000/1024= 4882
{
T1CON = 0; //Desabilita a contagem do timer1
TMR1 = 0; //Limpa o conteudo do temporizador
IFS0bits.T1IF = 0; //Clear no bit de chamada da interrupcao do timer1
PR1 = Fcy/512; //Timer 1 conta at 4882
//Fcy/256 = 1s Medido c/ oscilo
//Fcy/512 = 0,5s
//Fcy/1024= 0,25s
T1CONbits.TCKPS = 3; //Ajusta o prescaler para 1:256
IPC0bits.T1IP = 4; //Define a prioridade da interrupo do timer1=4
IEC0bits.T1IE = 1; //Habilita a interrupo do timer1
T1CONbits.TON = 1; //Habilita a contagem do timer1
}

//****Rotina de tratamento da interrupo do Timer 1 controle do led indicador


void _ISR _T1Interrupt(void)
{
if (fgLed == 0){ //condicao para piscar o LED de status
fgLed = 1; //Se a flag estiver em 0 altera para 1 e liga o LED
LigLed; //Funcao criada para ligar o LED de status
}
else {
fgLed = 0; //Passa a flag de status do LED para 0
DesLed; //Funcao criada para desligar o LED de status
}

contamostra = 0; //Contador para amostragem AD (0.5s)

Rotacao = fgrpm; //Variavel Rotacao recebe o valor da flag rpm


fgrpm = 0; //Zera a flag de rpm
rot1 = (Rotacao * 120); //Calcula a rpm x 120 pois ciclo de 0,5s

IFS0bits.T1IF = 0; //Clear no bit de interrupo do timer 1


}

//*****************************************************************************
//Rotina de inicializao do timer 2 para aquisicao de dados analogicos
//******************************************************************************
void inicia_timer2(void) //PR1= 5000000/1024= 4882
{
T2CON = 0; //Desabilita a contagem do timer2
TMR2 = 0; //Limpa o conteudo do temporizador
IFS0bits.T2IF = 0; //Clear no bit de chamada da interrupcao do timer2
PR2 = Freq_AD; //Timer conta ate 500
//Fcy/256 = 1s Medido c/ oscilo
//Fcy/512 = 0,5s
//Fcy/1024= 0,25s
T2CONbits.TCKPS = 0; //Ajusta o prescaler para 1:1
IPC1bits.T2IP = 6; //Define a prioridade da interrupo do timer1=6
IEC0bits.T2IE = 1; //Habilita a interrupo do timer1
T2CONbits.TON = 1; //Habilita a contagem do timer2
}

//****Rotina de tratamento da interrupo do Timer 2


void _ISR _T2Interrupt(void)
{

// Configuracao AD:
ADCON1bits.SAMP = 1; //Aquisio de amostras analgicas iniciada

IFS0bits.T2IF = 0; //Clear no bit de interrupo do timer 2


}

//*****************************************************************************
//***** Rotina para a inicializao do conversor A/D
//******************************************************************************
void inicia_ADC()
{
104

ADCON1bits.ADON = 0; //desabilita o mdulo de converso A/D


ADCON1bits.ADSIDL = 0; //mdulo A/D continua convertendo mesmo com a CPU em modo
idle(inativa)
ADCON1bits.FORM = 0; //formato da sada da converso sem sinal
ADCON1bits.SSRC = 7; //contador interno termina uma amostragem e j comea a
prxima
ADCON1bits.ASAM = 0; //amostragem individual
ADCON2bits.VCFG = 0; //0 => referencia AVDD e AVSS interno, 1 => +Vref e -Vref
externo
ADCON2bits.CSCNA = 1; //Habilita Scan alternado atravs das entradas selecionadas
no MUX A
//0; utiliza apenas um canal para a converso
ADCON2bits.SMPI = 4; //5 amostras ate a interrupcao ocorrer
//0; gera uma interrupo a cada converso - buffer(0)
ADCON2bits.BUFM = 0; //buffer de 16 bits
ADCON2bits.ALTS = 0; //utiliza sempre o MUX A, no alterna entre MUX A e MUX B
ADCON3bits.ADCS = Tad; //Tad equals Min amount of instr cycles Fastest possible
//seleciona o clock de converso
ADCON3bits.SAMC = 1; //define o tempo da auto-amostragem em 1 Tad
ADCON3bits.ADRC = 0; // derive Tad from system clock //
//utiliza o mesmo clock do sistema. Se (1) from internal
RC
ADCHS = 0; //configura o conversor ANx como entrada positiva
ADCSSL = 0x002f; //entrada AN0, AN1, AN2, AN3 e AN5 para a converso 0000
0000 0010 1111
ADPCFG = 0xffd0; //RB0, RB1, RB2, RB3, RB5 p/ entrada analog - 1111 1111 1101
0000

IFS0bits.ADIF = 0; //clear no bit de chamada da interrupo da converso A/D


IPC2bits.ADIP = 5; //Define a prioridade da interrupo do mdulo A/D=5
IEC0bits.ADIE = 1; //habilita a interrupo do mdulo A/D
ADCON1bits.ADON = 1; //habilita o mdulo de converso A/D
}

//******************************************************************************
//***** Rotina de Tratamento da Interrupo do Conversor A/D
//******************************************************************************
void _ISR _ADCInterrupt(void)
{
int i = 0; //define a varivel inteira Pos_Atual
ptr = &ADCBUF0; //ponteiro ptr recebe o endereo do buffer0 de
converso A/D

while (i < 16) //executa a leitura da converso A/D enquanto i<16


{
ADResult[i++] = *ptr++; //ponteiro ptr incrementado at i=15
//ADResul recebe os valores da converso A/D na
posio '0'
//so feitas 16 leituras para garantir que os 16
buffers da
//converso A/D sejam lidos e automaticamente
limpos,
//garantindo que o resultado da prxima leitura
fique no buffer0
} //fim do while

AC_x = ADResult[0]; //Sinal acelerometro eixo x


AC_y = ADResult[1]; // Sinal acelerometro eixo y
AC_z = ADResult[2]; // Sinal acelerometro eixo z
Tensao = ADResult[3]; // Tensao da fonte
Corrente = ADResult[4]; // Corrente do motor

if (contamostra<1000){
contamostra++;
if (AC_x > gx_Z)Mgx = AC_x - gx_Z; else Mgx = gx_Z - AC_x; //Faz o modulo de
g
// Mgx = Mgx / 0.160; //Divide pelo valor de 1g - 160
Migx = Mgx / 653.0; //Divide pelo valor de 1g - 160
Mtgx = Mtgx + (Migx * Migx); //Soma os valores ate ter 1000 amostras

if (AC_y > gy_Z)Mgy = AC_y - gy_Z; else Mgy = gy_Z - AC_y; //Faz o modulo de
g
// Mgy = Mgy / 0.160; //Divide pelo valor de 1g - 160
Migy = Mgy /655.0; //Divide pelo valor de 1g - 160
Mtgy = Mtgy + (Migy * Migy); //Soma os valores ate ter 1000 amostras
105

if (AC_z > gz_Z)Mgz = AC_z - gz_Z; else Mgz = gz_Z - AC_z; //Faz o modulo de
g
// Mgz = Mgz / 0.160; //Divide pelo valor de 1g - 160
Migz = Mgz /655.0; //Divide pelo valor de 1g - 160
Mtgz = Mtgz + (Migz * Migz); //Soma os valores ate ter 1000 amostras
}
else {
// Mtgy = Mtgy;// / 500.0;//000.0;
Mg_y = sqrt(Mtgy / 1000) * 100;// / 10; //Migy; //Mtgy;// / 10000.0; // *
20.0; // Calcula a variavel para exibicao no display (x1000)
Mg_x = sqrt(Mtgx / 1000) * 100;// / 10; //Migx; //Mtgx / 1000.0; // * 20.0;
// Calcula a variavel para exibicao no display (x1000)
Mg_z = sqrt(Mtgz / 1000) * 100;// / 10;// / 1000.0; // * 20.0; // Calcula
a variavel para exibicao no display (x1000)
contamostra = 0; //Contador para amostragem AD (0.5s)
Mtgy =0;
Mtgx = 0;
Mtgz=0;
x_RMS = Mg_x;
y_RMS = Mg_y;
z_RMS = Mg_z;

IFS0bits.ADIF = 0; //clear no bit de chamada da interrupo da


converso A/D
}

//******************************************************************************
//Inicializacao do timer 3 para escrita no display e envio dados ao PC
//******************************************************************************
void inicia_timer3(void)
{ //5000000/1800= 2777,77

T3CON = 0; //Desabilita a contagem do timer 3


TMR3 = 0; //Limpa o conteudo do temporizador
IFS0bits.T3IF = 0; //Clear no bit de chamada da interR do timer 3
PR3 = Fcy/(1024); //Timer 3 conta ate 2777,77
//Fcy/256 = 0,5s = 2 Hz
//Fcy/512 = 0,25s = 4 Hz
//Fcy/1024 = 0,125ms = 8 Hz
//Fcy/1800 = 0,068s = 14 Hz
//Fcy/2048 = 0,0675s = 15Hz

T3CONbits.TCKPS = 3; //Ajusta o prescaler para 1:256


IPC1bits.T3IP = 3; //Define a prioridade da interrupcao do timer 3
IEC0bits.T3IE = 1; //Habilita a interrupcao do timer 3
T3CONbits.TON = 1; //Habilita a contagem do timer 3
}

//******************************************************************************
//Rotina de tratamento da interrupcao do Timer 3 para envio dados a display / PC
//******************************************************************************
void _ISR _T3Interrupt(void)
{
unsigned char fgu=0, fgi=0, fgrpm=0;

Tecla = le_Teclado(); //Coloca o valor lido do teclado para variavel tecla

if(Tela == 0){ //Verifica se variavel Tela for 0


Inicializacao(); //Mostra tela de inicializacao
if (Tecla == 15) { //Se pressiona * avanca para proxima tela
lcd_command(0x01); //0000 0001 Limpa o display e seta contador de
endereo para zero.
Delay_ms(1); //Tempo para limpeza do display
Tela = 1; //Seta variavel tela em 1
} //Encerra verificacao de pressionamento tecla *
} //Encerra verificacao da tela de inicializacao
if (Tela == 1){ //Seleciona o menu de opcoes (TELA 1 ou 2)
Tela_Menu(); //chama tela de opcoes
if (Tecla == 1) { //Verifica se a variavel Tecla esta em 1
lcd_command(0x01); //0000 0001 Limpa o display e seta contador de endereo
para zero.
Delay_ms(1); //Tempo para limpeza do display
Index = 0; //Zera variavel Index
106

fgcampo = 0; //Zera flag de campo


Campo = 0; //Forca a variavel campo iniciar em 0 para nao intereferir
na proxima tela
Tela = 2; //chama tela de parametrizacao
Tecla = 16; //Forca o valor de tecla em 16 para nao comecar escrevendo
no display
}
if (Tecla == 2) { //Verifica se a variavel Tecla esta em 2
lcd_command(0x01); //0000 0001 Limpa o display e seta contador de endereo
para zero.
Delay_ms(1); //Tempo para limpeza do display
Index = 0; //Zera variavel Index
gx_Z = AC_x; //Variavel para valor de calibrao eixo x
gy_Z = AC_y; //Variavel para valor de calibrao eixo y
gz_Z = AC_z; //Variavel para valor de calibrao eixo z
Tela = 3; //chama tela de execucao
}
if (Tecla == 3) { //Verifica se a variavel Tecla esta em 2
lcd_command(0x01); //0000 0001 Limpa o display e seta contador de endereo
para zero.
Delay_ms(1); //Tempo para limpeza do display
Index = 0; //Zera variavel Index
Tela = 4; //chama tela de execucao
}
}

if (Tela == 2){ //Verifica se a tela selecionada e a 2 (PARAMETROS)


Tela_1(); //Mostra a tela de parametrizacao

if (Campo == 0) { //Verifica se o campo escolhido e 0


cursor(1,Index+8); //Posiciona o cursor no campo 0 e index desloca o
cursor

if (Tecla<10) { //Verifica se o valor de Tecla esta menor


que 10
lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )0x30
para indicar numero
codigo[Index] = Tecla + 0x30; //
if(Index<8) Index++; //Enquanto o index for menor que 8
incrementa a variavel
}
if (Tecla == 14){ //Verifica se pressionou a tecla proximo (#)
fgcampo = 1; //Seta a flag fgcampo
}
if (Tecla == 16 & fgcampo == 1) {
Campo=1; //Altera a variavel campo para 1
fgcampo = 0; //Zera a flag campo
Index = 0; //Zera a variavel index
} //Encerra verificacao de tecla proximo
} //Encerra verificacao campo 0

if (Campo == 1) { //Verifica se o campo escolhido e 1


cursor(2,Index+6); //Posiciona o cursor no campo 1 e index desloca o
cursor
if (Tecla<10) { //Verifica se o valor de Tecla esta menor
que 10
lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )x30
para indicar numero
imin[Index] = Tecla + 0x30; //
if(Index<3) Index++; //Enquanto o index for menor que 8 incrementa a
variavel
if(Index==2){
lcd_data(0x2E);
Index++;
}
}
if (Tecla == 14){ //Verifica se pressionou a tecla proximo (#)
fgcampo = 1; //Seta a flag campo em 1
}
if (Tecla == 16 & fgcampo == 1) {
Campo = 2; //Altera a variavel campo para 2
fgcampo = 0;
Index = 0;
} //Encerra verificacao de tecla proximo
} //Encerra verificacao do campo 1

if (Campo == 2) { //Verifica se o campo escolhido e 2


107

cursor(2,Index+16); //Posiciona o cursor no campo 2 e index desloca o


cursor
if (Tecla<10) { //Verifica se o valor de Tecla esta menor
que 10
lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )x30
para indicar numero
imax[Index] = Tecla + 0x30; //
if(Index<3) Index++; //Enquanto o index for menor que 8
incrementa a variavel
if(Index==2){
lcd_data(0x2E); //Acrescenta o ponto no display
Index++;

}
}
if (Tecla == 14){ //Verifica se pressionou a tecla proximo (#)
fgcampo = 1;
}
if (Tecla == 16 & fgcampo == 1) {
Campo = 3; //Altera a variavel campo para 3
fgcampo = 0;
Index = 0;
} //Encerra verificacao de tecla proximo
} //Encerra verificacao do campo 2

if (Campo == 3) { //Verifica se o campo escolhido e 3


cursor(3,20); //Posiciona o cursor no campo 3 e index desloca o cursor
if (Tecla==1) { //Verifica se o valor de Tecla esta menor que 10
lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )x30 para
indicar numero
// vmin[Index] = Tecla + 0x30; //
// if(Index<3) Index++; //Enquanto o index for menor que 8
incrementa a variavel
// if(Index==2){
// lcd_data(0x2E);
// Index++;
Vmax = 1400;
Vmin = 1200;
}
if (Tecla ==2){
cursor(3,20); //Posiciona o cursor no campo 3 e index desloca o cursor
lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )x30 para
indicar numero
Vmax = 2600;
Vmin = 2800;
}
if (Tecla == 14){ //Verifica se pressionou a tecla proximo (#)
fgcampo = 1;
}
if (Tecla == 16 & fgcampo == 1) {
Campo = 5; //Altera a variavel campo para 4
fgcampo = 0;
Index = 0;
} //Encerra verificacao de tecla proximo
} //Encerra verificacao do campo 3

if (Campo == 4) { //Verifica se o campo escolhido e 4


cursor(3,Index + 16); //Posiciona o cursor no campo 4 e index desloca o
cursor
if (Tecla<10) { //Verifica se o valor de Tecla esta menor que 10
lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )x30 para
indicar numero
vmax[Index] = Tecla + 0x30; //
if(Index<3) Index++; //Enquanto o index for menor que 8 incrementa
a variavel
if(Index==2){
lcd_data(0x2E);
Index++;
}
}
if (Tecla == 14){ //Verifica se pressionou a tecla proximo (#)
fgcampo = 1; //Seta flag de campo
}
if (Tecla == 16 & fgcampo == 1) {
Campo = 5; //Altera a variavel campo para 5
fgcampo = 0; //Zera flag de campo
Index = 0; //Zera variavel Index
108

} //Encerra a verificacao de tecla proximo


} //Encerra a verificacao do campo 4

if (Campo == 5) { //Verifica se o campo escolhido e 5


cursor(4,Index + 6); //Posiciona o cursor no campo 5 e index
desloca o cursor
if (Tecla<10) { //Verifica se o valor de Tecla esta menor
que 10
lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )x30 para
indicar numero
rpm1[Index] = Tecla + 0x30; //
if(Index<3) Index++; //Enquanto o index for menor que 8 incrementa
a variavel
}
if (Tecla == 14){ //Verifica se pressionou a tecla proximo (#)
fgcampo = 1;
}
if (Tecla == 16 & fgcampo == 1) {
Campo = 6; //Altera a variavel campo para 6
fgcampo = 0; //Zera a flag de campo
Index = 0; //Zera a variavel Index
} //Encerra verificacao de tecla proximo
} //Encerra verificacao do campo 5

if (Campo == 6) { //Verifica se o campo escolhido e 6


cursor(4,Index + 16); //Posiciona o cursor no campo 6 e index desloca
o cursor
if (Tecla<10) { //Verifica se o valor de Tecla esta menor que 10
lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )x30 para
indicar numero
rpm2[Index] = Tecla + 0x30; //
if(Index<3) Index++; //Enquanto o index for menor que 8 incrementa a
variavel
}
if (Tecla == 14){ //Verifica se pressionou a tecla proximo (#)
fgcampo = 1;
}
if (Tecla == 16 & fgcampo == 1) {
Campo = 0; //Altera a variavel campo para 0
fgcampo = 0;
Index = 0;
} //Encerra verificacao de tecla proximo
} //Encerra verificacao do campo 6
} //Encerra parametros da tela 2 (PARAMETROS)

if (Tecla == 15) {
lcd_command(0x01); //0000 0001 Limpa o display e seta contador de endereo
para zero.
Delay_ms(1); //Tempo para limpeza do display
Tela = 1; //Seta variavel Tela em 1
}

if (Tela == 3){ //Tela de execucao


Tela_2(); //Carrega os labels da tela de execucao
cursor(1,8); //Posiciona o cursor no campo 1
DispString(codigo); //Escreve no display o valor do codigo

// if (Vmax > u & Vmin < u){


if (Inicio == 1 & fginicio == 0) {
fginicio = 1;
tempoteste = 0;
fgu = 0;
fgi = 0;
fgrpm = 0;
LigaRele;
}
// }
u = (0.008 * Tensao) * 100; //Calculo 33V/4096 x tensao medida
cursor(3,1); //Posiciona o cursor para indicar Tensao
DispValDec(u,1); //Indicacao tensao no display com 1 decimal

if (Corrente > corZ) corr = Corrente - corZ; else corr = corZ - Corrente;
cor = (corr + 10) * 1.16; //Equacao para conversao da corrente

// if(Vmax > u & Vmin < u) fgu =1;


// DispValInt(u);
109

if(Imax > cor & Imin < cor) fgi = 1;


if(RPMmax > rot1 & RPMmin < rot1) fgrpm = 1;

if(fgu ==1 & fgi ==1 & fgrpm == 1){


cursor(4,9);
DispString("APROVADO");
}

cursor(2,1); //Posiciona o cursor na linha 2 e coluna 7


// DispValInt(Mg_x);
// DispValInt(x_RMS);
DispValDec(x_RMS,1);
cursor(2,8); //Posiciona o cursor na linha 2 e coluna 12
// DispValInt(y_RMS);
DispValDec(y_RMS,1);
cursor(2,15); //Posiciona o cursor na linha 2 e coluna 17
// DispValInt(z_RMS);
DispValDec(z_RMS,1);

if(fginicio == 1){
// Indicacao da RPM no display
cursor(3,13);
DispValInt(rot1);

cursor(3,7); //Posiciona o cursor para indicar corrente


DispValDec(cor,1); //Indicacao tensao no display com 1 decimal

// x_RMS = (93600 * Mg_x) / rot1;


// y_RMS = (93600 * Mg_y) / rot1;
// z_RMS = (93600 * Mg_z) / rot1;

if (tempoteste<70){ //temporizador do teste


tempoteste++; //incremeta contador tempo
}
else{
DesRele;
fginicio=0;
}
}

if (Tecla == 15) { //Verifica se a tecla 8 foi pressionada


lcd_command(0x01); //0000 0001 Limpa o display e seta contador de endereo
para zero.
Delay_ms(1); //Tempo para termino limpeza do display
Tela = 1; //Seta flag de tela em 1 para retorno ao menu
}
}

if (Tela == 4){ //Verifica se a tela selecionada e a 4 (PARAMETROS)


Tela_1(); //Mostra a tela de parametrizacao
cursor(1,8); //Posiciona o cursor no campo 0
DispString(codigo);
cursor(2,6);
DispString(imin);
cursor(2,16);
DispString(imax);
cursor(3,6);
DispString(vmin);
cursor(3,16);
DispString(vmax);
cursor(4,6);
DispString(rpm1);
cursor(4,16);
DispString(rpm2);
if (Tecla == 15) { //Verifica se a tecla 8 foi pressionada
lcd_command(0x01); //0000 0001 Limpa o display e seta contador de
endereo para zero.
Delay_ms(1); //Tempo para termino limpeza do display
Tela = 1; //Seta flag de tela em 1 para retorno ao menu
}
}

//
// if (Tecla != 16){ //Faz a varredura do teclado caso o
valor lido seja diferente de 16
// cursor(1,9); //Posiciona o cursor na linha 2 coluna
5
110

// if (Tecla<10) lcd_data(Tecla + 0x30); //Caso o valor lido seja <10 soma )x30
para indicar numero
// else lcd_data(Tecla + 0x37); //Caso seja maior ou igual a 10 ajusta
para letras A a F
// }

//Rampa subida PWM


if (duty>500) duty=0; //Rampa para aceleracao do PWM
OC1RS = duty; //Rampa aceleracao PWM
duty=duty+10; //Rampa aceleracao PWM
//Final controle rampa PWM

IFS0bits.T3IF = 0; //Clear no bit de interrupcao do timer 3


}

//******************************************************************************
//Habilitacao do timer 4. Rotina de configuracao do PWM para motores
//Timer 4 nao aceita interrupcao
//******************************************************************************
void inicia_timer4(void)
{
T4CON = 0; //Desabilita a contagem do timer 4
TMR4= 0; //Limpa o conteudo do temporizador
PR4= 500; //=500. Gera uma frequencia de 10kHz
T4CONbits.TCKPS= 3; //Prescaler 1:1

// OC1RS = 501; //Duty cycle 100%. Mas teroricamente de 0 a 99% de PR4.


OC1RS = 250; //Duty cycle ~ 50%. Write the duty cycle for the second
PWM pulse
OC1R = 0; //Write the duty cycle for the first PWM pulse
OC1CON= 6; //when OCxCON = 110 or 111, output compare is usef for the
PWM mode

// OC2RS = 501; //Duty cycle 100%. Mas teroricamente de 0 a 99% de PR4.


// OC2RS = 0; //Duty cycle ~ 25%. Write the duty cycle for the second
PWM pulse
// OC2R = 0; //Write the duty cycle for the first PWM pulse
// OC2CON= 6; //When OCxCON = 110 or 111, output compare is usef for the
PWM mode

T4CONbits.TON = 1; //Habilita a contagem do timer4


}

//******************************************************************************
//Habilitacao do timer 4. Rotina de configuracao do PWM para motores
//Timer 4 nao aceita interrupcao
//******************************************************************************
void inicia_timer4(void)
{
T4CON = 0; //Desabilita a contagem do timer 4
TMR4= 0; //Limpa o conteudo do temporizador
PR4= 500; //=500. Gera uma frequencia de 10kHz
T4CONbits.TCKPS= 3; //Prescaler 1:1

// OC1RS = 501; //Duty cycle 100%. Mas teroricamente de 0 a 99% de PR4.


OC1RS = 250; //Duty cycle ~ 50%. Write the duty cycle for the second
PWM pulse
OC1R = 0; //Write the duty cycle for the first PWM pulse
OC1CON= 6; //when OCxCON = 110 or 111, output compare is usef for the
PWM mode

// OC2RS = 501; //Duty cycle 100%. Mas teroricamente de 0 a 99% de PR4.


// OC2RS = 0; //Duty cycle ~ 25%. Write the duty cycle for the second
PWM pulse
// OC2R = 0; //Write the duty cycle for the first PWM pulse
// OC2CON= 6; //When OCxCON = 110 or 111, output compare is usef for the
PWM mode

T4CONbits.TON = 1; //Habilita a contagem do timer4


}

//******************************************************************************
111

//**** INICIA INTERRUPO EXTERNA 0 - RPM


//******************************************************************************
void inicia_int0(void){

INTCON2bits.INT0EP=0; //Configura a interrupo externa para 1


//ocorrncia em borda de descida
IPC0bits.INT0IP=7; //prioridade da int externa
IEC0bits.INT0IE=1; //habilita interrupo externa
}

//******************************************************************************
//**** Rotina de tratamento da interrupo de INT0
//******************************************************************************
void __attribute__((interrupt, auto_psv)) _INT0Interrupt(void){

IEC0bits.INT0IE=0; //desabilita a interrupo externa

//fgrpm = 1;
fgrpm++;

IFS0bits.INT0IF=0; //zera a flag de interrupo externa 0


IEC0bits.INT0IE=1; //Habilita a interrupo externa}
}

//******************************************************************************
//**** ROTINAS UTILIZADAS PARA O DISPLAY
//******************************************************************************
void DATA(unsigned char nib){ //Funcao para envio de dados de 4 bits ao display
D4 = nib & 1; //Configura o 1o do bit do nible para D4
D5 = (nib & 2) >> 1; //Configura o 2o do bit do nible para D5, faz rolagem de
1 casa para direita
D6 = (nib & 4) >> 2; //Configura o 3o do bit do nible para D6, faz rolagem de
2 casas para direita
D7 = (nib & 8) >> 3; //Configura o 4o do bit do nible para D7, faz rolagem de
3 casas para direita
}

void lcd_init() //Rotina de inicializacao do display


{
Delay_ms(1);
lcd_command(0x33); //0011 0011 Configura o display para modo 4 bits
lcd_command(0x32); //0011 0010 Configura o display para modo 4 bits
lcd_command(0x28); //0010 1000 Display ajustado para 4 linhas e fontes 5x7
lcd_command(0x0E); //0000 1100 Cursor ligado
lcd_command(0x06); //0000 0110 Desloca o cursor para a direita
lcd_command(0x01); //0000 0001 Limpa o display e seta contador de endereo
para zero.
Delay_ms(1);
}

//**** Envia comandos para o display*******************************************


void lcd_command(unsigned char cmd)
{
RS = 0; //Seta o seletor de registros do display para comandos
DATA((cmd & 0xf0)>> 4); //Carrega os dados dos 4 bits mais significativos para
envio ao display
EN = 1; //Habilita o display para envio de dados
EN = 0; //Desabilita o envio de dados ao display
DATA(cmd & 0x0f); //Carrega os dados dos 4 bits menos significativos
EN = 1; //Habilita o display para envio de dados
EN = 0; //Desabilita o envio de dados ao display
Delay_ms(1); //Delay de 1ms
}

//**** Envia dados para o display***********************************************


void lcd_data(unsigned char data)
{
RS=1; //Seta o seletor de registros do display para comandos
DATA((data & 0xf0)>> 4); //Carrega os dados dos 4 bits mais significativos para
envio ao display
EN=1; //Habilita o display para envio de dados
EN=0; //Desabilita o envio de dados ao display
DATA(data & 0x0f); //Carrega os dados dos 4 bits menos significativos
EN=1; //Habilita o display para envio de dados
EN=0; //Desabilita o envio de dados ao display
112

Delay_ms(1); //Delay de 1ms


}

//**** Rotina para selecionar posicao no display********************************


void cursor(unsigned char L, unsigned char C){ // L (linha) = 1, 2, 3 ou 4
// C (coluna) = 1 a 20

unsigned char poslcd; //variavel para selecionar posicao no display

switch(L){ //
case 1:
poslcd = 0x7F + C; //escolhe a posicao da coluna a ser escrita na linha
1 (1 a 20)
break;
case 2:
poslcd = 0xbF + C; //escolhe a posicao da coluna a ser escrita na linha
2 (1 a 20)
break;
case 3:
poslcd = 0x93 + C; //escolhe a posicao da coluna a ser escrita na linha
3 (1 a 20)
break;
case 4:
poslcd = 0xd3 + C; //escolhe a posicao da coluna a ser escrita na linha
4 (1 a 20)
break;
}

lcd_command(poslcd); //Envia os dados para a rotina de comandos do display


}

//**** Rotina para escrita de uma string na posicao corrente do cursor *********
void DispString(char *string) {
int i;
char c;
for (i=0;i<strlen(string);i++) { //for para escrever no display conforme o
tamanho da string
c = string[i];// - 0x20;
lcd_data(c); //escreve no display
}
}

//*********************************************************************************
//Rotina para escrita de valor decimal no display com escolha do ponto
//*********************************************************************************

void DispValDec(unsigned int val, char dot){ //escreve valor inteiro convertido para
decimal com
//escolha da posicao do ponto
//dot=0, nenhuma casa decimal
//dot=1, uma casa decimal
//dot=2, duas casas decimais

char Uni,Dec,Cen;

Cen = (val / 1000) + 0x30; //variavel cen recebe o valor ja modificado


divido por 1000 e convertido para ascii
Dec = ((val / 100) %10) + 0x30; //variavel dec recebe o valor ja
modificado divido por 100 e convertido para ascii
Uni = ((val / 10) %10) + 0x30; //variavel uni recebe o valor ja
modificado divido por 10 e convertido para ascii

switch(dot){ //rotina para determinar posicao do ponto

case 0x00: //caso dot=0x00 ento sem nenhum ponto


lcd_data(Cen); //escreve centena no display
lcd_data(Dec); //escreve dezena no display
lcd_data(Uni); //escreve unidade no display
break; //fim do case

case 0x01: //caso dot=0x01 ento uma casa decimal


lcd_data(Cen); //escreve centena no display
lcd_data(Dec); //escreve dezena no display
lcd_data(46); //escreve um ponto no display
lcd_data(Uni); //escreve unidade no display
113

break; //fim do case

case 0x02: //caso dot=0x02 ento duas casas decimais


lcd_data(Cen); //escreve centena no display
lcd_data(46); //escreve um ponto no display
lcd_data(Dec); //escreve dezena no display
lcd_data(Uni); //escreve unidade no display
break; //fim do case
}
}

//*********************************************************************************
//Rotina que escreve um valor inteiro no display serial
//*********************************************************************************
void DispValInt(unsigned int val){

char Uni,Dec,Cen,Mil;
Uni = (val % 10)+ 0x30; //utiliza o resto da divisao de val
por 10 e soma 0x30 para conversao ascii
val = val/10; //divide val para "deslocar" os valor para
direita
Dec = (val % 10)+ 0x30; //com val deslocado utiliza o resto
da divisao por 10 e converte pra ascii
val = val/10; //divide val para "deslocar" os valor para
direita
Cen = (val % 10)+ 0x30; //com val deslocado utiliza o resto
da divisao por 10 e converte pra ascii
val = val/10; //divide val para "deslocar" o valor para
direita
Mil = (val % 10)+ 0x30; //com val deslocado utiliza o resto
da divisao por 10 e converte pra ascii
lcd_data(Mil); //escreve Mil no display
lcd_data(Cen); //escreve Cen no display
lcd_data(Dec); //escreve Dec no display
lcd_data(Uni); //escreve Uni no display
}

//*********************************************************************************
//Rotina para conversao de numero inteiro em decimal
//*********************************************************************************
unsigned int ConvIntDec(unsigned int val, char range){

int v;
unsigned long longVal;
unsigned int resrange;

resrange = (range * 1000000)/4095;


//constante=30000/4095=7326 para 30,0V
//constante=10000/4095=2442 para 10,0V
//constante=5000/4095=1221 para 5,00V
longVal = (long)val * resrange; //Multiplica val pelo fator de
proporcionalidade
if (range>10) v=10000; //para ranges maiores de 10 o valor longVal
deve ser dividido por 10000
else v=1000; //para valores menores ou iguais a 10
longVal deve ser dividido por 1000
val = longVal/v; //divide o resultado, multiplicado pelo
fator de proporcionalidade, v

return(val); //retorna val, que possui o valor inteiro


ja convertido para decimal
}

//*************************************************************************************
***********
//Rotina que escreve um valor em hexadecimal no display
//*************************************************************************************
***********
void DispValHex(unsigned int val)
{
char Uni,Dec,Cen;

Uni = (val & 0xf) + 0x30; //operao AND para pegar o ultimo nibble
Dec = ((val >> 4) & 0xf) + 0x30; //desloca o valor de val 4 bit para a direita
e realiza operao AND pegando o segundo nibble
Cen = ((val >> 8) & 0xf) + 0x30; //desloca o valor de val 8 bits para a
direita e realiza operao AND para pegar o primeiro nibble
114

if (Uni>0x39){ //se o valor de Uni for maior que o 9 em


ascii
Uni = Uni + 0x7; //soma em Uni mais 7 para chegar em A at F
}
if (Dec>0x39){ //se o valor de Dec for maior que o
9 em ascii
Dec = Dec + 0x7; //soma em Dec mais 7 para chegar em A at F
}
if (Cen>0x39){ //se o valor de Cen for maior que o
9 em ascii
Cen = Cen + 0x7; //soma em Cen mais 7 para chegar em A at F
}
lcd_data(Cen); //escreve centena no display
lcd_data(Dec); //escreve dezena no display
lcd_data(Uni); //escreve unidade no display
}
//******************************************************************************
//FINAL DAS ROTINAS PARA O DISPLAY LCD
//******************************************************************************

//*************************************************************************************
***********
//***** Inicializacao do modulo UART2
*************************************************************
//*************************************************************************************
***********
void inicia_UART2()
{
unsigned int ubrg; //define a variavel ubrg
unsigned int config1; //define a variavel config1
unsigned int config2; //define a variavel config2

CloseUART2(); // desabilita a UART2


ubrg = 32; // ubrg=(fcy/(BaudRate*16))-1
// fcy=FCristal/4
// Neste Caso: Baud Rate=9600
// Freq.Cristal=20MHz
// fcy=5MHz, ubrg=31,55

ConfigIntUART2(UART_RX_INT_EN & //Funcao para configuracao das


interrupcoes da UART
//habilita a interrupcao de recepcao
UART_RX_INT_PR3 & //Define a prioridade da interrupcao
de recepcao=3
UART_TX_INT_EN & //habilita a interrupcao de
transmissao
UART_TX_INT_PR4); //Define a prioridade da interrupcao
de transmissao=4
config1 = UART_EN & //Define a variavel config1 com os
seguintes parametros
//Habilita o modulo UART2
UART_IDLE_CON & //UART funcionando no modo
IDLE
UART_RX_TX & //Configura a comunicao atraves dos
pinos padroes
//de TX e RX (U2TX e U2RX)
UART_DIS_WAKE & //Desabilita o modo
"Wake-up"
UART_DIS_LOOPBACK & //desabilita o modo "loop
back"
UART_DIS_ABAUD & //Desabilita o modo
"autobaud"
UART_NO_PAR_8BIT & //Define a comunicao com 8
bits de dados e
//sem bit de paridade
UART_1STOPBIT; //Define o Stop Bit=1
config2 = UART_INT_TX_BUF_EMPTY &
//Define a variavel config2
com os seguintes parametros
//Ocorre interrupcao de
transmissao quando buffer de
//transmisso for esvaziado
UART_TX_PIN_NORMAL & //Define o bit TXBreak como
normal
115

UART_TX_ENABLE & //Habilita a transmissao da


UART2
UART_INT_RX_BUF_FUL &
//Ativa a interrupcao de
recepcao quando Buffer estiver cheio (4 bytes)
UART_ADR_DETECT_DIS &
//Desativa o modo de "adress
detect"
UART_RX_OVERRUN_CLEAR;
//Limpa o flag de "overrun"
OpenUART2(config1, config2, ubrg); //Habilita a UART2 com
os parametros de configuracao
//definidos pelas variaveis
Config1, config2 e ubrg
}

//*************************************************************************************
***********
//***** Rotina de tratamento da Interrupcao da transmissao de dados
******************************
//*************************************************************************************
***********
void _ISR _U2TXInterrupt(void){ //funcao da rotina de interrupcao de
transmissao de dados
IFS1bits.U2TXIF=0; //clear no bit de chamada da
interrupcao de transmissao
}

//*************************************************************************************
***********
//***** Rotina de tratamento da Interrupcao do recebimento de dados
******************************
//*************************************************************************************
***********
void _ISR _U2RXInterrupt(void){ //funcao da rotina de interrupcao de
transmissao de dados
IFS1bits.U2RXIF=0; //clear no bit de chamada da
interrupcao de transmissao
}

//*************************************************************************************
***********
//****** Rotina para enviar o pacote de dados via UART2
*******************************************
//*************************************************************************************
***********
void TransPac2 (char b){ //Funcao que transmite um byte

while(BusyUART2()); //retorna o status da transmissao; espera


enquanto a UART2 estiver ocupada
putcUART2(b); //transmite via UART2 o byte
while(BusyUART2()); //espera a UART2 desocupar
//1=UART2 ocupada, 0=UART2 desocupada
}

//*************************************************************************************
***********
//***** Rotina para a leitura do teclado matricial 4x4
*************************************
//*************************************************************************************
***********
char le_Teclado(void)
{
Coluna_1 = 1;
Coluna_2 = 0;
Coluna_3 = 0;
Coluna_4 = 0;
Delay_ms(1);
if(Linha_1) return 1;
if(Linha_2) return 4;
if(Linha_3) return 7;
if(Linha_4) return 15; //(*)

Coluna_1 = 0;
Coluna_2 = 1;
Coluna_3 = 0;
Coluna_4 = 0;
116

Delay_ms(1);
if(Linha_1) return 2;
if(Linha_2) return 5;
if(Linha_3) return 8;
if(Linha_4) return 0;

Coluna_1 = 0;
Coluna_2 = 0;
Coluna_3 = 1;
Coluna_4 = 0;
Delay_ms(1);
if(Linha_1) return 3;
if(Linha_2) return 6;
if(Linha_3) return 9;
if(Linha_4) return 14; //(#)

Coluna_1 = 0;
Coluna_2 = 0;
Coluna_3 = 0;
Coluna_4 = 1;
Delay_ms(1);
if(Linha_1) return 10; // (A)
if(Linha_2) return 11; // (B)
if(Linha_3) return 12; // (C)
if(Linha_4) return 13; // (D)

return 16;
}

void Inicializacao(void) { //Escreve na tela a mensagem de inicializacao


cursor(1,3); //Posiciona o cursor na linha 1, coluna 5
DispString("GIGA TESTE MOTOR"); //escreve no diplay a mensagem
cursor(2,5); //Posiciona o cursor na linha 2, coluna 5
DispString("VERSAO 14"); //escreve no diplay a mensagem
cursor(3,5); //Posiciona o cursor na linha 3, coluna 5
DispString("30/11/2013"); //escreve no diplay a mensagem
cursor(4,3); //Posiciona o cursor na linha 4, coluna 5
DispString("MARCOS MOSSMANN"); //escreve no diplay a mensagem
// Delay_ms(2000); //Tempo para mostrar mensagem de inicializacao
// lcd_command(0x01); //0000 0001 Limpa o display e seta contador de
endereo para zero.
// Delay_ms(1); //Tempo para execucao do comando de limpar
display
}

void Tela_Menu(void) { //Exibe tela para selecao modo


// lcd_init(); //Inicializa lcd
cursor (1,1);
DispString("1 - Parametrizar"); //Mostra opcao 1 - parametrizacao
cursor (2,1);
DispString("2 - Executar"); //Mostra opcao 2 - execucao
cursor (3,1);
DispString("3 - Parametros"); //Mostra opcao 2 - execucao
}

void Tela_1(void){ //Tela para parametrizacao dos limites


cursor(1,1);
DispString("CODIGO:"); //Exibe label CODIGO
cursor(2,1);
DispString("Imin:"); //Exibe label Imin
cursor(2,11);
DispString("Imax:"); //Exibe label Imax
cursor(3,1);
// DispString("Vmin:"); //Exibe label Vmin
// cursor(3,11);
// DispString("Vmax:"); //Exibe label Vmax
DispString("1 - 12V / 2 - 24V");
cursor(4,1);
DispString("RPM1:"); //Exibe label RPM max
cursor(4,11);
DispString("RPM2:"); //Exibe label RPM min
}

void Tela_2(void){ //Tela de exibicao resultado medicao

cursor(1,1);
DispString("CODIGO:"); //Exibe label CODIGO
117

cursor(2,5);
DispString("gx"); //Exibe label vibracao x
cursor(2,12);
DispString("gy"); //Exibe label vibracao y
cursor(2,19);
DispString("gz"); //Exibe label vibracao z
cursor(3,5);
DispString("V"); //Exibe label tensao
cursor(3,11);
DispString("A"); //Exibe label corrente
cursor(3,17);
DispString("RPM"); //Exibe label rotacao
cursor(4,1);
DispString("STATUS:"); //Exibe label status
}

void Alarmes(void){

cursor(4,9);
if(u > Vmax)DispString("TENSAO ALTA");
if(u < Vmin) DispString("TENSAO BAIXA");
if(cor > Imax) DispString("CORR. ALTA");
if(cor < Imin) DispString("CORR. BAIXA");
if(rot1 > RPMmax) DispString("RPM ALTA");
if(rot1 < RPMmin) DispString("RPM BAIXA");