Professional Documents
Culture Documents
Universidade Feevale
Instituto de Cincias Exatas e Tecnolgicas - ICET
Bacharelado em Engenharia Eletrnica
Trabalho de Concluso de Curso
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.
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 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
curso, mas tambm a buscar conhecimentos. Agradeo em especial ao meu orientador deste
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
Por fim, agradeo a todos que, de uma forma ou de outra, me ajudaram nesta conquista
to importante.
Obrigado.
RESUMO
Apresenta bases tericas sobre motores eltricos de corrente contnua, anlises de vibrao,
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
ou rejeio realizada via display. A parametrizao das informaes realizada via teclado
matricial.
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
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
by a keyboard matrix.
vibration.
LISTA DE FIGURAS
INTRODUO ...................................................................................................................... 14
2 DESENVOLVIMENTO DO PROTTIPO................................................................. 56
ANEXO A ................................................................................................................................ 98
APNDICE A ......................................................................................................................... 99
INTRODUO
O uso de motores eltricos tornou-se muito popular com o passar dos anos para as mais
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
Todos os motores produzidos devem ser verificados aps seu processo de produo,
problemas de campo. A motivao deste trabalho justamente esta etapa de verificao das
prottipo para aquisio de caractersticas dos motores como tenso eltrica fornecida pela
motor em anlise.
15
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
possibilidades de melhorias e trabalhos futuros bem como crticas referentes a este Trabalho de
Concluso de Curso.
1 MTODOS E COMPONENTES
sua porta motriz ou mecnica. Nesse sentido energtico tem-se a operao como motor. Como
retira-se energia eltrica em suas portas eltricas, sendo essa energia na forma de uma corrente
O estator composto de uma estrutura ferromagntica com polos salientes nos quais
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
(SIEMENS, 2006).
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
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
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
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
para a manuteno dos torques "favorveis", os quais garantem o funcionamento dos motores
(SIEMENS, 2006).
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
apenas uma bobina, o comutador, as escovas e dois ims externos bobina. Atravs deste
possui duas ranhuras e responsvel pela alterao do sentido da corrente (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
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).
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
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
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
mancais. Devido a este fato, medindo-se vibraes nos mancais pode-se detectar e determinar
mancais, por ser um dos pontos vlidos pelas normas em uso empregadas para avaliar o
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
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
qualquer funo peridica possa ser decomposta por uma srie de ondas sinusoidais puras com
em acelerao da gravidade (g), metros por segundo ao quadrado (m/s), milmetros por
Nas unidades expressas em decibel (dB) os ndices subscritos indicam a qual valor
2007).
A
AdB 20 log (1.1)
Aref
V
VdB 20 log (1.2)
Vref
circular. A frequncia, neste caso, expressa em Hertz (Hz) ou Rotaes por Minuto (RPM).
integradores e diferenciadores eletrnicos podem ser usados para transformar o sinal eltrico
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
Expresso Unidade
D Deslocamento, valor pico a pico [mm]
V Velocidade, valor RMS [mm/s]
A Acelerao, valor RMS [g]
RPM Rotaes por Minuto
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
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
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).
relacionadas s atividades tcnicas brasileiras. As diretrizes utilizadas para ser possvel executar
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
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
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",
eltricas que apresentam vibrao entre 0,7 a 1,8 mm/s, porm no apresentam riscos de danos,
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
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
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
desgaste do prprio componente. Uma anlise de vibrao executada nos motores permite o
1.3 Sensores
Para realizar a medio de vibrao utilizam-se acelermetros; para medir a corrente e tenso
1.3.1 Acelermetros
31
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
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).
Se a caixa for acelerada para cima, como mostra a Figura 1.7, a compresso do material
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
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,
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
para um eixo ortogonal aos outros. Esse um acelermetro de 3 eixos, representado na Figura
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
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
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
Esse tipo de acelermetro equivale ao piezeltrico, mas em alguns casos pode ser mais
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
circuitos de controle de motores, conforme mostra o bloco diagrama da Figura 1.13 (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
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
monitorado e ser rpido o bastante para operar com frequncias at 5 MHz (UNIP, 2010).
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
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
galvnico. Podem trabalhar com vrios formatos de onda (faixa ampla de frequncia).
gua quando encapsulados propriamente. Como a tenso de Hall , em geral, da ordem de mV,
sensor, como por exemplo o campo de outros fios, podem diminuir ou aumentar o campo que
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
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
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
emissor-receptor.
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
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
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
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
1.4 Microcontroladores
(como utilizados em PCs). Eles so embarcados em outros dispositivos, onde possam controlar
elementos adicionais em sua estrutura interna, como memria de leitura e escrita para
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
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
modificada, com instrues de suporte a Digital Signal Controller (DSC). Por sua vez a CPU
instrues que alteram o fluxo do programa e a instruo de movimento de uma palavra dupla.
(SOUZA, 2006).
interrupes, onde cada uma pode ser configurada em sete nveis de prioridade. No ANEXO A
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
principal do sistema, sendo que desta forma processa a Milhes de Instrues por Segundo
(MIPS).
1.4.3 Temporizadores
temporizadores, efetuando uma contagem de tempo para que determinada operao ocorra,
65.535, sendo cada um deles composto por 3 registradores, sendo os registradores "TMRX,
2010).
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
"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.
como tambm o envio de um start bit identificando o incio de transmisso e um stop bit,
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
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
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.
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
UART est ocupada transmitindo ou recebendo um dado, se a paridade for recebida diferente
(MICROCHIP, 2005).
um sinal analgico ligado em uma de suas entradas analgicas em um valor de 12 bits. Este
basear na alimentao do dispositivo nos pinos "AVdd" e "Avss" ou pelos pinos "Vref+" e
"Vref-".
converso. Este mdulo tambm contm um buffer de dezesseis palavras somente leitura e de
fornece os valores que podem ser lidos do buffer executando as funes necessrias definidas
pelo programador.
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
Pode-se definir o tempo do perodo para produzir o sinal PWM atravs de um dos
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
1.4.7 Interrupes
momento em que ocorrer e dependendo de sua prioridade, o DSPIC interrompe tudo o que est
ocorre de forma que se no momento em que uma interrupo est sendo tratada e outra de maior
de menor prioridade, voltando no final a executar sua tarefa normal at que outra interrupo
habilitao da interrupo que permite com que a interrupo ocorra ou no, outro para
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.
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
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
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,
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).
diagrama de pinos.
50
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
5 pixels na horizontal.
1.5.1 Conexes
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
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
Apesar dos LCDs serem projetados para trabalharem com 5 V, consumindo apenas
O pino 1 (Vss) o terra do mdulo LCD. O Pino 2 (Vdd) o positivo. O pino 3 (Vo)
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
Para indicar se os dados sero lidos ou escritos no LCD, existe o pino 5 (R/W) que
O pino 6 (E) a linha de habilitao para os comandos do LCD. utilizado para iniciar
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
Os pinos 7 a 14 fazem parte do barramento de dados, que trabalha com os oito sinais
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
atravs de teclas. Quando o nmero delas pequeno, cada uma pode ser associada a um pino
como apresentado pela imagem e respectivo esquema na Figura 1.20. Ao invs de se empregar
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,
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
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
diagrama de blocos com os principais pontos de entrada e sada. Para todo o controle das
acelermetro triaxial, conectado ao mdulo de controle aos pinos 2, 3 e 4 por trs fios. O sinal
dados, um para habilitar o Seletor de Registros e outro para habilitar o display. Os pinos 10, 22,
dezesseis teclas conectado aos pinos 10, 16, 18, 19, 29, 30, 37 e 38 do microcontrolador.
presente prottipo, trata-se de uma previso para uma futura verso para anlise do motor com
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
por alunos de estgio da Feevale, para uso como um kit didtico para as mais diversas aplicaes
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
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.
dos conectores na parte superior. Ao lado esquerdo h o conector para gravao in circuit e o
conector J6.
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
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
de base, um transistor e um diodo para a bobina do rel. Este circuito utiliza tenso de 12 V
circuito impresso ao cabo de 4 vias com blindagem. A Figura 2.5 apresenta uma foto da
montagem do acelermetro.
62
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.
por dois resistores, sendo um de 10 k e outro de 56 k, com tolerncia de 1%. A Figura 2.7
fabricante Allegro MicroSystems, modelo ACS712 20A. Este modelo de sensor utiliza
do motor circula do pino 1 e 2 para o pino 3 e 4, fornecida pela fonte de alimentao do motor.
2.10 apresenta uma foto da placa prottipo montada para realizar as medies de tenso e
corrente.
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.
fototransistor responde a iluminao a partir do emissor quando um objeto refletor passa dentro
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)
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
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
de dados (D7, D6, D5 e D4), um para habilitar escrita e outro para seleo de registro (dados
formando um divisor de tenso com sada conectada ao pino de Variao de Contraste (CV).
configurados como sada (colunas) e quatro configurados como entradas (linhas). Cada linha
O prottipo est montado em um gabinete metlico. A Figura 2.15 apresenta uma foto
3
1 2
Controle e sensores. Nesta rea observa-se o transformador utilizado e a placa com o circuito
J a rea (3) apresenta os circuitos de medio de corrente, tenso e cabos de sada para o
Entre o Teclado e o Display est o potencimetro para realizar o ajuste do contraste do Display.
ambos do lado esquerdo. Abaixo destes dois cabos encontra-se o conector para comunicao
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.
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
A Figura 2.18 apresenta a tela inicial do MPLAB X, onde observa-se os menus e barras
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
Aps apresentado a listagem dos pinos com o mapeamento das ligaes, conforme cdigo
********************************************************************************
**** 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
//******************************************************************************
//***** 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
//******************************************************************************
Aps esta etapa definido as funes para ligar e desligar o Led indicador de status e
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.
//**************************************************************************
//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
}
Para uso do Display, utiliza-se as rotinas criadas para seu funcionamento. A rotina
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
Outra rotina utilizada a DATA, responsvel pelo envio das informaes ao Display em
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
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
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
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
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
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
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
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
com sua prioridade, sendo o Timer3 responsvel pela execuo da rotina de teste solicita
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
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
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
da tenso da fonte do motor. Caso esteja correta o teste incia acionando o rel para o motor
medidos so comparados aos valores padro pr-definidos. Este sequencia repetida durante
"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
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
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
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;
tenso, aps corrente, rotao e por fim vibrao, comparando os valores medidos aos valores
esperados.
Giga de Teste e verificando seu resultado no Display. ento realizado um comparativo entre
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
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
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
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.
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.
emitido pelo sensor de corrente via osciloscpio. A Tabela 3.4 apresenta os resultados obtidos
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.
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
eixos (x, y, z), posicionando-se o acelermetro com seu eixo z posicionado para cima, conforme
determinado na rotina de software. Neste momento o display apresenta os trs eixos zerados,
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.
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
microprocessador.
Outro teste realizado o de acionamento do motor. Para isto o motor conectado Giga
aps 15 s o motor desligado. A Figura 3.5 apresenta uma foto do Display aps final do teste.
Pela foto verifica-se que os dados so corretamente exibidos no Display, porm ao final
corrente contnua e uso destas informaes para aprovao ou reprovao dos motores,
7. Montagem do prottipo;
O objetivo geral deste TCC no foi plenamente atingido. Todo o hardware foi
aprovao ou rejeio no est implementada, bem como a transmisso dos dados para o PC.
supervisrio.
<http://automacao2010.blogspot.com.br/2010/03/sensores-digitais-oticos-e-ultra.html>
<http://www.johnsonelectric.com/pt/resources-for-engineers/automotive-applications/motion-
LIMA, Charles Borges de e VILHAA Marco V. M.. AVR e Arduino: Tcnicas de Projeto.
2013.
95
20/09/2013.
mar. 2012.
12/3/13.
96
setembro 2012.
em:<http://www.deg.ufla.br/site/_adm/upload/arquivos/motorcc-siemens.pdf> Acesso em 05
outubro 2012.
2011)
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.
em:<http://www.ebah.com.br/content/ABAAABSYwAH/sensoreamento-corrente#>. Acesso
/*
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
//******************************************************************************
//******************************************************************************
//**** 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
//******************************************************************************
//****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
//******************************************************************************
//**** 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;
} //Fim do while
103
//******************************************************************************
//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 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
}
// Configuracao AD:
ADCON1bits.SAMP = 1; //Aquisio de amostras analgicas iniciada
//*****************************************************************************
//***** Rotina para a inicializao do conversor A/D
//******************************************************************************
void inicia_ADC()
{
104
//******************************************************************************
//***** 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
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;
//******************************************************************************
//Inicializacao do timer 3 para escrita no display e envio dados ao PC
//******************************************************************************
void inicia_timer3(void)
{ //5000000/1800= 2777,77
//******************************************************************************
//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;
}
}
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 (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 (Corrente > corZ) corr = Corrente - corZ; else corr = corZ - Corrente;
cor = (corr + 10) * 1.16; //Equacao para conversao da corrente
if(fginicio == 1){
// Indicacao da RPM no display
cursor(3,13);
DispValInt(rot1);
//
// 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
// }
//******************************************************************************
//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
//******************************************************************************
//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
//******************************************************************************
111
//******************************************************************************
//**** Rotina de tratamento da interrupo de INT0
//******************************************************************************
void __attribute__((interrupt, auto_psv)) _INT0Interrupt(void){
//fgrpm = 1;
fgrpm++;
//******************************************************************************
//**** 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
}
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;
}
//**** 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;
//*********************************************************************************
//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;
//*************************************************************************************
***********
//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
//*************************************************************************************
***********
//***** 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
//*************************************************************************************
***********
//***** 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
//*************************************************************************************
***********
//***** 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;
}
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");