CENTRO PAULA SOUZA
FACULDADE DE TECNOLOGIA
FATEC SANTO ANDRÉ
Tecnologia em Eletrônica Automotiva
Leone de Sousa e Silva
Vando Antonio de Sousa
APLICAÇÃO DO MICROPASSO NO MOTOR DE
PASSO DO PAINEL DE INSTRUMENTOS
AUTOMOTIVO
Santo André – São Paulo
2012
CENTRO PAULA SOUZA
FACULDADE DE TECNOLOGIA
FATEC SANTO ANDRÉ
Tecnologia em Eletrônica Automotiva
Leone de Sousa e Silva
Vando Antonio de Sousa
APLICAÇÃO DO MICROPASSO NO MOTOR DE
PASSO DO PAINEL DE INSTRUMENTOS
AUTOMOTIVO
Monografia apresentada ao Curso de Tecnologia
Autotrônica da FATEC Santo André, como
requisito parcial para conclusão do curso de
Tecnologia em Autotrônica
Orientador: Prof. Weslley Medeiros Torres
Santo André – São Paulo
2012
Dedicamos este trabalho às nossas famílias
e aos nossos estimados amigos que sempre
estiveram próximos durante esta jornada.
AGRADECIMENTOS
Gostaríamos de agradecer a todos aqueles que direta e indiretamente contribuíram para
a realização deste trabalho e principalmente aos colegas de sala, que mantiveram estímulos
nos momentos mais árduos desta jornada e auxiliaram no desenvolvimento mútuo do
conhecimento. Dedicamos nosso trabalho aos professores, colaboradores e funcionários da
Fatec Santo André que sempre estiveram prontos a nos ajudar.
Agradecemos também a Deus, aos nossos queridos familiares, e em especial ao
Professor Armando Laganá e ao Professor Cleber Willian Gomes pelo apoio e pelo incentivo,
ao Professor Wagner Massarope pelas palavras de perseverança e de grande estímulo e
também ao Professor Weslley Torres pelas orientações providenciais para o desenvolvimento
do trabalho.
“O assunto mais importante do mundo pode
ser simplificado até o ponto em que todos
possam apreciá-lo e compreendê-lo. Isso é –
ou deveria ser – a mais elevada forma de
arte.”
Charles Chaplin
RESUMO
Seja no formato digital, seja no formato analógico, o painel de instrumentos automotivo
fornece uma variedade de informações relevantes ao condutor do veículo, como a velocidade
na qual o automóvel se encontra, a rotação do motor de combustão interna, o nível de
combustível no tanque, entre outras, permitindo ao motorista observar e analisar as diversas
situações de desempenho, bem como apontamentos de possíveis problemas. Este painel indica
com exatidão os valores medidos, graças às técnicas de controle dos motores de passo. Porém,
a exatidão em baixas rotações fica comprometida quando os motores sofrem problemas como
ressonância, vibração e ruídos, causados principalmente por mudanças abruptas nos níveis de
corrente elétrica fornecida a eles. Este trabalho visa minimizar essas pequenas interferências,
e com uma técnica de subdivisão dos passos, ou seja, do deslocamento angular do motor,
melhorar significativamente a precisão e a linearidade do controle dos ponteiros de um
protótipo de mostrador, avaliando desta forma a importância da técnica do micropasso no
motor de passo dos paineis dos automóveis.
Palavras-chave: painel de instrumentos, automóvel, motores de passo, linearidade,
micropasso.
ABSTRACT
Be in digital format, either in analog format, the automotive instrument panel provides a
variety of useful information to the driver of the vehicle, as the speed at which the automobile
is, the internal combustion engine revolution, fuel level in the tank, among other, allowing the
driver to observe and analyze the various performance situations, as well as hints of possible
problems. This panel indicates the exact measurements, because of the control techniques of
the stepper motors. However, the accuracy at low speeds is compromised when the engines
suffer from problems such as resonance, vibration and noise, mainly caused by abrupt
changes in the levels of electrical current supplied to them. This study seeks to minimize these
little interferences, and with a technique of subdivision of the steps, i.e., the angular
displacement of the motor, improve the accuracy and linearity of the control of the needles of
a prototype display, thereby evaluating the importance of microstepping technique in the
stepper motor of the panels of automobiles.
Keywords: instrument panel, automobile, stepper motors, linearity, microstepping.
LISTA DE ILUSTRAÇÕES
Figura 1: Painel de instrumentos, ou cluster. Extraído de (OFRIA, 2007)............................................................ 16
Figura 2:Visão explodida do cluster. Extraído de (GUIMARÃES, 2007). ........................................................... 17
Figura 3: Exemplo de máscara. Extraído de (GUIMARÃES, 2007). .................................................................... 18
Figura 4: Conector de um Mercedes Classe A. Extraído de (GUIMARÃES, 2007). ............................................ 18
Figura 5: Chicote do painel de instrumentos. Extraído de (http://commons.wikimedia.org). ............................... 18
Figura 6: Visibilidade dos clusters do Mercedes Classe A (à esq.) e do Mercedes Classe G. Adaptado de
(GUIMARÃES, 2007)........................................................................................................................................... 19
Figura 7: Exemplar de motor de passo em três vistas diferentes. Adaptado de (Fraen 6405-15xx - Standard
Stepper Motors Datasheet). ................................................................................................................................... 20
Figura 8: Localização do motor de passo na construção do painel. Extraído de (BOSCH, 2005). ....................... 20
Figura 9: Motor de relutância variável. Extraído de (BRITES et al., 2008). ......................................................... 21
Figura 10: Comparação do fluxo magnético em um entreferro maior (a) e um menor (b). Adaptado de (KENJO,
1984)...................................................................................................................................................................... 22
Figura 11: Motor de ímã permanente. Extraído de (BRITES et al, 2008). ............................................................ 22
Figura 12: Motor híbrido. Extraído de (BRITES et al., 2008). .............................................................................. 23
Figura 13: Motor unipolar. Extraído de (BRITES et al., 2008). ............................................................................ 24
Figura 14: Motor bipolar. Extraído de (BRITES et al., 2008). .............................................................................. 24
Figura 15: Motor bifilar. Adaptado de (JONES, 1995) ......................................................................................... 25
Figura 16: Enrolamentos de um motor polifásico. Adaptado de (JONES, 1995) .................................................. 25
Figura 17: Comparativo entre os modos de passo completo e de micropasso. Extraído de (www.atmel.com). ... 26
Figura 18: Exemplo de conexão entre um seqüenciador e um driver. Extraído de (KENJO, 1984). .................... 27
Figura 19:Motor de corrente contínua. .................................................................................................................. 28
Figura 20: Motor de corrente contínua com sentido invertido. ............................................................................. 28
Figura 21: Ponte “H” com chaves. ........................................................................................................................ 29
Figura 22: Polarização do motor para sentido horário (a) e anti-horário (b). ........................................................ 29
Figura 23: Ponte H com transistores. Extraído de (MANEA, 2009). .................................................................... 30
Figura 24: Diagrama de blocos simplificado de um microcontrolador. ................................................................ 31
Figura 25: Controle em malha aberta com tensão fixa. ......................................................................................... 31
Figura 26: Controle em malha aberta com corrente fixa. ...................................................................................... 32
Figura 27: Driver com sensor de corrente. ............................................................................................................ 32
Figura 28: Controle em malha fechada com controle de corrente. ........................................................................ 33
Figura 29: Sequência de acionamento no motor unipolar com passo completo. Adaptado de (pt.wikipedia.org). 33
Figura 30: Motor bipolar com passo completo. Adaptado de (BRITES et al., 2008). ........................................... 34
Figura 31: Motor unipolar com meio passo. Extraído de (BRITES et al., 2008). ................................................. 34
Figura 32: Motor bipolar com meio passo. Extraído de (BRITES et al., 2008). ................................................... 35
Figura 33: Corrente nas bobinas durante o micropasso e sua trajetória resultante. Extraído de (YEDAMALE et
al., 2002). ............................................................................................................................................................... 36
Figura 34: Trajetória da corrente no micropasso utilizando 1/8 de passo. Extraído de (LAIDMAN, 2001). ........ 36
Figura 35: Energia de excitação em função dos comprimentos de passo. Extraído de (Industrial Circuits
Application Note – Microstepping). ...................................................................................................................... 37
Figura 36: Sinal PWM. Extraído de (GHIRARDELLO, 2008). ............................................................................ 38
Figura 37: Ciclo ativo. Extraído de (GHIRARDELLO, 2008). ............................................................................. 38
Figura 38: Potência aplicada à carga. Extraído de (GHIRARDELLO, 2008). ...................................................... 39
Figura 39: Protótipo experimental. ........................................................................................................................ 40
Figura 40: Sensor de velocidade.Extraído de (BOSCH, 2005). ............................................................................ 41
Figura 41: Fluxograma parcial de controle do motor. ........................................................................................... 43
Figura 42: Sensor de nível de combustível. ........................................................................................................... 44
Figura 43: Esquema elétrico do sensor de combustível. ........................................................................................ 44
Figura 44: Marcador de combustível. .................................................................................................................... 45
Figura 45. Display LCD. ....................................................................................................................................... 46
Figura 46: Driver do motor de passo para micropassos. ....................................................................................... 48
Figura 47: Sinal de PWM no controle do micropasso. .......................................................................................... 49
Figura 48:Sinal de PWM no controle do micropasso. ........................................................................................... 49
Figura 49: Sinal na “ponte H”. .............................................................................................................................. 50
Figura 50: Forma de onda da corrente nas bobinas. .............................................................................................. 50
Figura 51:Forma de onda da corrente nas bobinas. ............................................................................................... 50
LISTA DE TABELAS
Tabela 1: Relações entre velocidade, pulsos e período para se definir o deslocamento ........................................ 42
Tabela 2: Relação para se encontrar o nível de combustível. ................................................................................ 45
Tabela 3: Porcentagem de corrente por deslocamento em função do seno do ângulo. .......................................... 47
Tabela 4: Porcentagem de corrente por deslocamento em função do cosseno do ângulo. .................................... 48
LISTA DE ABREVIATURAS
ADC – Analog-to-Digital Converter
CCP – Capture, Compare and PWM
I/O – Input/Output
IP – Instrument Panel
LCD – Liquid Crystal Display
PCB – Printed Circuit Board
PWM – Pulse Width Modulation
SUMÁRIO
1 INTRODUÇÃO.................................................................................................................................................. 13
1.1 Motivação e Objetivos ................................................................................................................................. 14
1.2 Conteúdo ..................................................................................................................................................... 14
1.3 Metodologia................................................................................................................................................. 14
2 CONCEITOS DE CLUSTER ............................................................................................................................. 16
2.1 Componentes do Painel ............................................................................................................................... 17
2.1.1 Visibilidade .......................................................................................................................................... 19
2.2 Fundamentos do Motor de Passo ................................................................................................................. 19
2.2.1 Tipos de motores de passo .................................................................................................................... 21
2.3 Características e Operação........................................................................................................................... 23
3 DRIVER DO MOTOR DE PASSO .................................................................................................................... 27
3.1 Esquema da ponte “H” ................................................................................................................................ 28
3.2 Microcontrolador ......................................................................................................................................... 30
3.3 Sistema de Controle de Motor de Passo ...................................................................................................... 31
3.3.1 Topologias de controle ......................................................................................................................... 31
3.3.1.1 Controle em malha aberta com tensão fixa ........................................................................................ 31
3.3.1.2 Controle em malha aberta com corrente fixa ..................................................................................... 32
3.3.1.3Controle em malha fechada com controle de corrente ........................................................................ 32
3.3.2 Formas de controle ............................................................................................................................... 33
3.3.2.1 Passo completo .................................................................................................................................. 33
3.3.2.2 Meio Passo ........................................................................................................................................ 34
3.3.3 Sistema de Micropasso ......................................................................................................................... 35
3.4 Circuito PWM ............................................................................................................................................. 38
4 EXPERIMENTOS............................................................................................................................................. 40
4.1 Velocímetro ................................................................................................................................................. 40
4.2 Marcador de Combustível ........................................................................................................................... 44
4.2 Odômetro ..................................................................................................................................................... 45
4.3 Micropassos ................................................................................................................................................. 46
5 CONCLUSÕES E PROPOSTAS FUTURAS .................................................................................................... 51
REFERÊNCIAS .................................................................................................................................................... 52
ANEXO I............................................................................................................................................................... 54
ANEXO II ............................................................................................................................................................. 74
ANEXO III ............................................................................................................................................................ 75
ANEXO IV ............................................................................................................................................................ 84
ANEXO V ............................................................................................................................................................. 85
ANEXO VI ............................................................................................................................................................ 98
13
1 INTRODUÇÃO
Sabe-se que o mostrador automotivo, localizado imediatamente atrás do volante do
veículo e de frente para o condutor, exibe informações de extrema importância para garantir a
segurança e o bom desempenho do automóvel, a integridade e o conforto do próprio motorista
e dos demais integrantes. Ele possui várias luzes capazes de indicar o estado de
funcionamento de determinados componentes do veículo, como a temperatura do líquido de
arrefecimento do motor e o alerta para portas abertas, entre outros. Também mostra, de forma
analógica (com ponteiros conectados a motores de passo), como se encontra a velocidade de
deslocamento do veículo, a rotação e a temperatura do motor, entre outros parâmetros - cada
um com suas devidas escalas de medição. Em veículos mais modernos e sofisticados, de
forma a incrementar o design do interior do veículo, exibe estes dados de forma digital em
telas de LCD. Porém, por se tratar de um sistema que gera altos custos de produção e, logo,
um acentuado acréscimo ao preço do automóvel, ainda permanece a predominância no
mercado dos veículos com mostradores analógicos.
Os motores de passo que movimentam esses ponteiros – ou agulhas, como são
conhecidos nas linhas de produção – são eficientes e relativamente de baixo custo. Com o
auxílio de um microcontrolador, o qual vai captar os sinais dos diversos sensores do veículo e
convertê-los em movimento angular, eles executam movimentos que oscilam constantemente
e de forma linear, de acordo com as características instantâneas de desempenho do veículo em
funcionamento.
Contudo, o motor de passo é prejudicado com possíveis e iminentes interferências,
como ressonância, ruídos e vibrações; alterações no fornecimento da corrente elétrica que o
alimenta causam perda da linearidade da angulação do motor e, por conseqüência, dos
ponteiros, gerando em baixas rotações um movimento impreciso e, em alguns casos, trêmulo.
Nessas situações, uma alternativa eficaz é a aplicação do sistema de micropasso, o qual busca
suavizar o deslocamento angular, executando passos muito menores aos que conduzem
normalmente esses motores, fator que exige um gerenciamento eletrônico eficaz e que alcance
o devido resultado: controlar esse gerador de movimentos para que o sistema analógico do
painel de instrumentos possua uma exibição tão linear quanto possível, considerando
inclusive momentos em que as variações são menores e o motor de passo se movimenta sob
velocidade reduzida.
14
1.1 Motivação e Objetivos
A motivação pela qual foi realizado esse estudo capta como base a ideia de que os
ponteiros, por abrangerem muitos valores decimais de velocidade, de nível de combustível no
tanque, de rotação, entre outros, necessita de uma precisão condizente com as variações que
devem ser identificadas pelo condutor do veículo.
Com base nos conceitos sobre o motor de passo, suas características e seus
fundamentos de operação, o trabalho que se segue tem por objetivo o desenvolvimento por
hardware e software de um controle preciso dos ponteiros do painel de instrumentos, com a
aplicação de um microcontrolador. Esta ação permitirá ao motor de passo elevar seu
desempenho de linearidade com a redução ou eliminação dos elementos causadores de
interferências no movimento, mesmo em baixas rotações do motor. O veículo, então, passa a
ter um mostrador com ponteiros livres de oscilações indesejáveis.
1.2 Conteúdo
No capítulo 2, discutimos sobre os componentes gerais de um painel de instrumentos
automotivo e os conceitos e princípios de operação dos motores de passo; no capítulo 3,
relatamos os fundamentos do driver do motor de passo, técnicas de controle do motor e
também o hardware e o software associados ao desenvolvimento eletrônico do cluster; no
capítulo 4, são apresentados e discutidos os resultados dos experimentos; e finalmente, no
capítulo 5, são expostas as conclusões geradas pelos resultados e projetados novos estudos e
desafios.
1.3 Metodologia
Foram utilizados para os experimentos práticos relacionados a esse estudo dois
motores de passo que produzem o direcionamento (horário e anti-horário) dos ponteiros, um
display LCD para mostrar, de acordo com um determinado número de pulsos, a distância
percorrida pelo veículo e a total registrada (odômetro), além de dois ponteiros com seus
respectivos marcadores de velocidade (velocímetro) e nível de combustível. Para a utilização
do microcontrolador, programamos em linguagem C, e projetamos também um hardware
15
eletrônico para controle dos motores de passo. Primeiramente, foi moldado um fluxograma
com as ações de leitura que o cluster deveria executar, e com base nele foi criado um software
desenvolvido no compilador MPLAB IDE, com um microcontrolador PIC 16F877A.
16
2 CONCEITOS DE CLUSTER
Em um automóvel, um painel de instrumentos – também chamado por engenheiros de
produto das montadoras como cluster ou até mesmo IP Cluster, sinônimo de instrument panel
– é um conjunto de marcadores (Fig. 1) que fornece as principais informações sobre o veículo,
compreendendo os dados relacionados aos sistemas mecânicos e eletroeletrônicos. Segundo
(DING, 2008), “Ele desempenha um papel importante [...] por prover informações
necessárias, e importância para segurança e economia.”.
Por essas razões, o cluster pode ser considerado o principal meio de comunicação
entre o veículo e o motorista. De acordo com (GUIMARÃES, 2007), “[...] processa algumas
informações de sensores e interruptores e, em alguns casos, é responsável pelo controle de
algumas funções no veículo.”. Exemplos:
- Indicar a velocidade do veículo e a rotação do motor;
- Indicar o nível de combustível;
- Controlar as luzes de aviso e de alerta;
- Controlar as setas, lavadores e limpadores dos vidros.
Figura 1: Painel de instrumentos, ou cluster. Extraído de (OFRIA, 2007).
17
Parte considerável dos paineis de instrumentos trabalha com ponteiros mecânicos
(denominados tecnicamente como agulhas, ou needles) e mostrador, e possui um circuito
magnético compacto, que possibilita agilidade e rapidez aos ponteiros.
2.1 Componentes do Painel
Em sua estrutura, um cluster (Fig. 2) é composto por:
- Lente;
- Carcaça;
- PCB (Placa de circuito impresso);
- Tampa traseira;
- Máscara (Fig. 3);
- Conector.
Na visão de (GUIMARÃES, 2007), “Todos estes componentes devem ser
precisamente montados para que a aparência final seja excelente e o conjunto esteja
totalmente livre de ruídos.”.
Entre esses elementos, a máscara se torna bastante importante, pois é um filme feito de
polímero que traz detalhes importantes relativos ao layout do painel. É nela que estão
marcados os símbolos de alarme, de alerta, as unidades de medição de cada instrumento e
também as escalas dos ponteiros. Segundo (GUIMARÃES, 2007) “[...] o formato de sua
borda é feito no sentido de garantir uma perfeita montagem na carcaça.”.
Figura 2:Visão explodida do cluster. Extraído de (GUIMARÃES, 2007).
18
Figura 3: Exemplo de máscara. Extraído de (GUIMARÃES, 2007).
O conector (Fig. 4) também é de suma importância para um cluster automotivo, pois
ele irá interligar o painel de instrumentos ao restante do veículo. Ele fica localizado na tampa
traseira do painel, e a quantidade desses conectores e suas pinagens vão variar de acordo com
a quantidade de funções realizadas pelo cluster. É importante salientar também o tipo de
travamento utilizado entre o conector desse painel de instrumentos e a contra-peça do chicote
do veículo. Nas palavras de (GUIMARÃES, 2007), “Atualmente, procura-se utilizar
conectores sem mecanismos sofisticados de travamento. Eles são mais caros que os
convencionais e oferecem a mesma qualidade no travamento.”. A Figura 5 mostra um
exemplar de chicote do painel.
Figura 4: Conector de um Mercedes Classe A. Extraído de (GUIMARÃES, 2007).
Figura 5: Chicote do painel de instrumentos. Extraído de (http://commons.wikimedia.org).
19
2.1.1 Visibilidade
Um fator também importante de se salientar é a visibilidade (Fig. 6) do cluster ao
condutor do veículo através do volante de direção do automóvel, a qual precisa ser perfeita.
Segundo (GUIMARÃES, 2007), “Além de ter relação direta com a aparência do conjunto
final, existem regulamentações que fiscalizam os projetos para garantir que todos os
instrumentos sejam facilmente visualizados pelo motorista.”. Não é apropriado que haja
ponteiros precisos e de boa linearidade se os mesmos ficam ocultos ao olhar do motorista.
Portanto, os detalhes radiais do volante não podem interferir na exibição do painel de
instrumentos.
Figura 6: Visibilidade dos clusters do Mercedes Classe A (à esq.) e do Mercedes Classe G. Adaptado de
(GUIMARÃES, 2007).
2.2 Fundamentos do Motor de Passo
O motor de passo (Fig. 7) pode ser definido como um motor elétrico síncrono que
pode dividir um ciclo completo de rotação em um grande número de passos. Como o próprio
nome sugere, os passos desse tipo de motor acontecem um de cada vez, situação oposta aos
motores convencionais, que giram de forma contínua. Para (GRANT, 2005), “Um motor de
passo é um motor alimentado eletricamente que gera rotação vinda de uma corrente elétrica
que circula dentro do motor.”.
Nas palavras de (BRITES et al., 2008), “Eles podem ser usados em aplicações onde é
necessário controlar vários fatores tais como: ângulo de rotação, velocidade, posição e
sincronismo.”. É o caso do painel de instrumentos automotivo, o qual requer respostas rápidas
e com o máximo de linearidade possível.
20
Figura 7: Exemplar de motor de passo em três vistas diferentes. Adaptado de (Fraen 6405-15xx - Standard
Stepper Motors Datasheet).
De acordo com (YEDAMALE et al., 2002), o motor de passo “É muito usado em
aplicações de baixo custo e sistemas de controle open loop, o que significa que não há retorno
de informações sobre a posição em que o rotor se encontra, o que elimina a possível utilização
de elementos caros, como leitores óticos.”.
Existem várias aplicações para esse sistema open loop. Nas palavras de (ASTARLOA
et al., 2003), “Um controle open loop é o bastante para muitos dispositivos, tais como
pequenas fresadoras, impressoras e itens eletrônicos, devido a uma pequena aceleração
aplicada à carga estática.”.
A posição do motor é conhecida simplesmente tendo como base o número de pulsos
de entrada. A seqüência desses pulsos influencia diretamente no direcionamento do eixo de
rotação do motor. A velocidade desse eixo de rotação é diretamente relacionada com a
freqüência dos pulsos de entrada, e a duração da rotação tem relação com o número de pulsos
aplicados na entrada. A Figura 8 exibe, além dos itens de construção do painel de
instrumentos, a localização do motor de passo nesse conjunto.
Figura 8: Localização do motor de passo na construção do painel. Extraído de (BOSCH, 2005).
21
2.2.1 Tipos de motores de passo
Existem três tipos de motor de passo: de relutância variável, de ímãpermanente, e
híbrido. Nas palavras de (CONDIT et al., 2004), “O estator [...] do motor de passo possui
múltiplos enrolamentos. O arranjo destes enrolamentos é o fator primário para distinguir, de
um ponto de vista elétrico, os diferentes motores de passo.”. Vamos descrevê-los:
- O motor de passo de relutância variável (Fig. 9) funciona com base em um rotor
multi-dentado e um estator. Quando os enrolamentos do estator são energizados por uma
corrente contínua, os pólos passam a ficar magnetizados. Para(BRITES et al., 2008), “A
rotação ocorre quando os dentes do estator são atraídos pelos pólos do estator energizado,
devido à força que aparece, para que o sistema tenha o circuito com menor relutância.”.
É importante salientar que o espaço do entreferro (Fig. 10) deve ser o menor possível,
para produzir maior torque exigindo menos do rotor e para alcançar uma precisão de
posicionamento mais alta, fator muito importante na técnica do micropasso. Para um mesmo
nível de força magnetomotriz um entreferro pequeno renderá um maior fluxo magnético, o
que produzirá um torque maior. Pode-se deduzir também, de acordo com (KENJO, 1984),
“[...] que o deslocamento de uma posição de equilíbrio é menor com um entreferro menor
quando um torque externo é aplicado ao rotor.”.
Figura 9: Motor de relutância variável. Extraído de (BRITES et al., 2008).
22
Figura 10: Comparação do fluxo magnético em um entreferro maior (a) e um menor (b). Adaptado de (KENJO,
1984).
- Os motores de ímã permanente, como o da Figura 11 possuem esses ímãs
adicionados à estrutura do motor, e não possui dentes como o de relutância variável. Nas
palavras de (BRITES et al., 2008): “Motores de ímã permanente tem baixo custo e baixa
resolução, com passos típicos de 7,5º a 15º (48 – 24 passos / revolução).”. O rotor é
magnetizado com a alternância dos pólos norte e sul; tais pólos estão situados em uma linha
reta que se encontra paralela ao eixo do rotor. Estes pólos magnetizados fazem com que a
intensidade do fluxo magnético seja incrementada e, conseqüentemente, apresenta um torque
de melhor desempenho, se comparado ao motor citado anteriormente.
Figura 11: Motor de ímã permanente. Extraído de (BRITES et al, 2008).
- Por último, temos os motores híbridos (Fig. 12), que são mais caros, porém possuem
maior eficiência quanto aos quesitos resolução de passo, torque e velocidade. De acordo com
(BRITES et al., 2008), “Ângulos de passo típico de motores híbridos estão entre 3,6º a 0,9º
(100 – 400 passos / volta). O motor híbrido combina as melhores características dos motores
23
de ímã permanente e motor de relutância variável.”. Seu rotor é multi-dentado como o de
relutância variável e possui um ímã magnetizado axialmente em volta de seu eixo. Ainda
segundo (BRITES et al., 2008), “Os dentes do rotor provém um melhor caminho que ajuda a
guiar o fluxo magnético para locais preferidos no GAP de ar.”. Esse GAP é conhecido
também como entreferro.
Figura 12: Motor híbrido. Extraído de (BRITES et al., 2008).
2.3 Características e Operação
O motor de passo, além dos movimentos precisos, apresenta mais algumas
características:
- É um dispositivo seguro: se algum sistema externo quebrar, o motor pára;
- Possuem uma longa vida útil;
- Excelente torque em baixas velocidades;
- Ótima repetibilidade: depois de avançar, pode retornar exatamente à posição anterior.
- Ocorrendo alguma sobrecarga mecânica, o motor não se danifica.
Quanto à sua operação, os motores de passo podem ser divididos em: unipolares e
bipolares.
Quanto ao seu enrolamento, podemos ter os motores: unipolar, bipolar, bifilar e multifase.
24
Os motores unipolares (Fig. 13) têm dois enrolamentos por fase, um para cada sentido
da corrente elétrica. Nas palavras de (BRITES et al., 2008), “Desde que neste arranjo um pólo
magnético possa ser invertido sem comutar o sentido da corrente, o circuito da comutação
pode ser feito de forma muito simples [...] para cada enrolamento.”
Figura 13: Motor unipolar. Extraído de (BRITES et al., 2008).
Os motores bipolares (Fig. 14) só têm um enrolamento por fase. A corrente elétrica em
um enrolamento precisa ser invertida para que o pólo magnético também seja invertido. Por
isso, o circuito que conduz a corrente deve possibilitar a inversão do sentido da mesma
utilizando, por exemplo, uma ponte H. Nas palavras de (BRITES et al., 2008): “Há duas
ligações por fase, nenhuma está em comum.[...]Como os enrolamentos são melhor utilizados,
são mais poderosos do que um motor unipolar do mesmo peso.”.
Figura 14: Motor bipolar. Extraído de (BRITES et al., 2008).
Os motores bifilares (Fig. 15), como o nome sugere, são compostos por dois fios, e são
semelhantes aos motores bipolares; porém, neste caso, cada uma das bobinas é composta por
dois fios enrolados em paralelo. Ou seja: um motor bifilar possui oito terminais – o dobro dos
terminais de um motor bipolar.
25
Segundo (JONES, 1995), “Na prática, motores com enrolamento bifilar são sempre
energizados como os motores unipolares ou bipolares.”. Para usar o motor bifilar como
unipolar, visando alta tensão de operação, são conectados em série os dois fios de cada
bobina. Além disso, nas palavras de (JONES, 1995), “[...] o ponto de conexão é usado como
derivação central.”, como na bobina 1 da Figura 15. Para usá-lo como bipolar, se a aplicação
exige alta corrente de operação, os dois fios de cada bobina são conectados em paralelo, como
na bobina 2 da mesma figura.
Figura 15: Motor bifilar. Adaptado de (JONES, 1995).
Por último, temos os motores polifásicos ou multi-fase, que possuem todos os
enrolamentos conectados em uma série cíclica, com um ponto de derivação definido entre
cada par de enrolamentos no ciclo; ou com apenas um terminal de cada enrolamento do motor
acessível, enquanto os terminais da outra extremidade dos enrolamentos são conectados em
comum formando uma conexão interna inacessível. Para (JONES, 1995), “No contexto dos
motores trifásicos, estas configurações poderiam ser descritas como Delta e Y, mas elas
também podem ser usadas com motores de 5 fases [...]”, como mostra a Figura 16. Alguns
motores polifásicos deixam expostos todos os finais dos enrolamentos do motor, permitindo
ao usuário decidir usar as configurações Delta, Y ou alternar entre ambas, permitindo acionar
cada enrolamento de forma independente. Os motores multi-fase são utilizados em aplicações
que exigem maior torque, como posicionamento de antenas e equipamentos de laboratório,
por exemplo.
Figura 16: Enrolamentos de um motor polifásico. Adaptado de (JONES, 1995).
26
No caso do painel de instrumentos, os motores de passo possuem um rotor que contém
um ímã permanente, que é controlado por uma série de campos eletromagnéticos, os quais são
acionados e desacionados de forma mecânica. Para fazer a curva do eixo do motor, um
eletroímã é energizado, atraindo aos dentes eletromagnéticos os dentes da engrenagem. Nesse
momento, os dentes da engrenagem estão alinhados a esse eletroímã, porém um pouco
deslocados do eletroímã seguinte. Assim, quando o próximo eletroímã é ligado, o anterior é
desligado, sendo necessário que a engrenagem gire um pouco para se alinhar ao próximo, e
assim por diante. Cada um desses pequenos giros é chamado de passo, e uma somatória
desses passos nos dá a rotação completa. Dessa maneira, o motor pode girar com precisão
angular.
Apesar de serem de baixo custo e de manutenção simples, os motores de passo sofrem
constantemente com interferências no seu deslocamento angular, surgindo ressonâncias,
vibrações e ruídos no sistema. Isso pode ocorrer tanto no sistema de passo completo do motor
quanto no de meio passo. Segundo (MORAR, 2004), “A fraqueza das operações de passo
completo e de meio passo aparecem em baixas velocidades. O movimento pode ser irregular.”
Para que esses efeitos sejam minimizados, é aplicada ao motor a lógica do micropasso,
que exige menor posicionamento do rotor em função do tempo se comparado ao passo
completo (Fig. 17). Ainda de acordo com (MORAR, 2004), “Isto tem um significado especial
em laboratórios. A forte tendência à ressonância é mais um motivo para migrar para o
micropasso.”. A técnica do micropasso será detalhada posteriormente neste trabalho.
Figura 17: Comparativo entre os modos de passo completo e de micropasso. Extraído de (www.atmel.com).
27
3 DRIVER DO MOTOR DE PASSO
Para acionamento do motor de passo, e posteriormente a aplicação da técnica do
micropasso, é essencial que se tenha um conhecimento do driver do mesmo.
Os sinais de saída de um sequenciador lógico são transmitidos para as entradas de um
driver de alimentação, pelo qual são direcionadas as ações de liga/desliga nos enrolamentos
do motor. Esse driver de alimentação pode ser chamado de driver do motor ou simplesmente
driver.
O método mais simples de conexão é a direta, mostrada nos itens (a) e (b) (Fig. 18).
Porém, se a corrente de saída do seqüenciador não for suficiente para alimentar os
transistores, se torna necessário adicionar um buffer para que seja possível amplificar a
corrente entre os dois estágios, como é mostrado nos itens (c) e (d) da Figura 18.
Figura 18: Exemplo de conexão entre um seqüenciador e um driver. Extraído de (KENJO, 1984).
28
3.1 Esquema da ponte “H”
Um circuito fundamental para aplicações que utilizam motor de corrente contínua - no
caso do nosso estudo, o motor de passo - é chamado de circuito ponte, ou ponte “H”. Com ela,
é possível controlar o acionamento da bobina do motor e também o sentido de circulação da
corrente elétrica, que irá definir o lado para o qual o motor deverá se deslocar.
O sentido de rotação do motor de corrente contínua depende da polaridade na qual ele
é energizado. Considerando que a bobina de um motor de corrente contínua tenha dois pontos
(a) e (b) (Fig.19), ao fechar a chave S1 o motor será energizado com o positivo da fonte no
ponto (a). Desse modo, o motor irá girar no sentido horário.
Figura 19: Motor de corrente contínua.
Para fazer com que o motor gire no sentido anti-horário, a polaridade do motor deve
ser invertida, ou seja, o positivo deve ser aplicado no ponto (b) (Fig. 20).
Figura 20: Motor de corrente contínua com sentido invertido.
Observando a Figura 19 e a Figura 20, pode-se deduzir que para inverter o sentido de
rotação do motor deve ser invertida também a polaridade da fonte de energia. Quando existe a
necessidade de inverter o sentido de rotação de um motor, monta-se um circuito para fazer a
inversão de polaridade a partir de chaves de acionamento. Tal circuito é chamado de ponte
“H”, cuja denominação é associada à forma de construção do mesmo, como pode ser
observado na Figura 21.
29
Figura 21: Ponte “H” com chaves.
Ao acionar somente as chaves S1 e S4, o motor será polarizado com positivo no ponto
‘a’, fazendo com que o motor gire no sentido horário. O sentido da corrente elétrica pode ser
observado na Figura 22 (a).
Ao acionar somente as chaves S2 e S3, o motor será polarizado com o positivo no
ponto ‘b’, fazendo com que o motor gire no sentido anti-horário. O sentido da corrente
elétrica pode ser observado na Figura 22 (b).
(a)
(b)
Figura 22: Polarização do motor para sentido horário (a) e anti-horário (b).
30
Substituindo as chaves utilizadas nos exemplos acima por transistores, o circuito de
ponte “H” pode ser controlado por sinais discretos, ou mesmo por microcontroladores.
É importante colocar diodos em paralelo com os componentes de chaveamento, a fim
de bloquear picos de tensão reversa, ocasionados quando acontece o desligamento dos
transistores. Como podemos observar na Figura 23, se o transistor Q1A está conduzindo, o
caminho da corrente elétrica no circuito será indicado pela curva de traçado cinza que passa
pela bobina e conduz através do transistor Q2B até o aterramento. Após cortar os transistores,
a bobina gera uma tensão reversa que é descarregada através dos diodos. O caminho da
corrente elétrica também pode ser observado na Figura 23.
Figura 23: Ponte H com transistores. Extraído de (MANEA, 2009).
3.2 Microcontrolador
O microcontrolador é um circuito integrado de alta capacidade que possui um
microprocessador, memórias e periféricos de I/O (entrada e saída), e em alguns modelos
dispositivos periféricos como conversores analógicos/digitais (ADC) e também interface de
entrada e saída de dados. Ele recebe informações de variáveis físicas – temperatura,
resistência, velocidade, entre outras – após serem convertidas em sinais elétricos por sensores,
gerencia essas informações através de uma lógica de programação e executa ações nos
dispositivos de saída (lâmpadas, motores, válvulas, etc.). A Figura 24 exemplifica, em um
diagrama de blocos, o fluxo de dados em um microcontrolador
31
Figura 24: Diagrama de blocos simplificado de um microcontrolador.
3.3 Sistema de Controle de Motor de Passo
3.3.1 Topologias de controle
As topologias de controle utilizadas em diversas aplicações para motor de passo são:
malha aberta com tensão fixa, malha aberta com corrente fixa e em malha fechada com
controle de corrente.
3.3.1.1 Controle em malha aberta com tensão fixa
Este é o método mais simples de controle do motor de passo, onde a tensão aplicada
nas bobinas é a tensão nominal do motor (Fig. 25).
Figura 25: Controle em malha aberta com tensão fixa.
32
3.3.1.2 Controle em malha aberta com corrente fixa
Este método é utilizado para ajudar a manter o torque em velocidades elevadas.
Conforme a velocidade do motor aumenta, o tempo que uma bobina fica energizada diminui.
Assim, a corrente elétrica na bobina não consegue atingir seu valor nominal, o que acarreta na
perda de torque. Para compensar essa perda, conforme a velocidade do motor aumenta,
aumenta-se a tensão injetada na bobina de forma que a corrente elétrica dela seja sempre igual
à corrente nominal para qual a bobina foi projetada, mantendo uma relação de velocidade e
torque (Fig. 26).
Figura 26: Controle em malha aberta com corrente fixa.
3.3.1.3 Controle em malha fechada com controle de corrente
Neste método utiliza-se um resistor shunt (Fig.27) como sensor, para fazer a leitura de
corrente que esta sendo aplicada na bobina, visando garantir que a corrente elétrica na bobina
atinja seu valor esperado (corrente nominal). A partir desse retorno, o controle aumenta ou
diminui a corrente conforme a necessidade (Fig. 28).
Figura 27: Driver com sensor de corrente.
33
Figura 28: Controle em malha fechada com controle de corrente.
3.3.2 Formas de controle
3.3.2.1 Passo completo
Passo completo é o maior deslocamento que o rotor faz quando uma bobina do estator
é energizada. Para fazer um passo completo, no caso do motor unipolar, energiza-se uma
bobina de cada vez. Ao energizar um enrolamento do estator, ele cria um fluxo que se alinha
com o rotor. Então esta primeira bobina deve ser desacionada e em seguida outra bobina deve
ser acionada. Isto fará com que o fluxo criado na bobina que está energizada puxe o rotor,
fazendo ele se deslocar para se alinhar com o fluxo. Para deslocar mais um passo, a bobina
deve ser desenergizada e energizada a próxima da sequência, e assim sucessivamente para as
outras bobinas, conforme mostrado na Figura 29.
Figura 29: Sequência de acionamento no motor unipolar com passo completo. Adaptado de (pt.wikipedia.org).
34
No caso de um motor bipolar, uma bobina deve ser energizada de cada vez, e em
seguida elas devem ser energizadas com a polaridade invertida, como se observa na Figura
30.
Figura 30: Motor bipolar com passo completo. Adaptado de (BRITES et al., 2008).
3.3.2.2 Meio Passo
Para o meio passo utilizando o motor unipolar, é preciso energizar uma bobina, e então
a próxima bobina da sequencia deve ser energizada. O fluxo magnético criado por essa bobina
fará com que o motor desloque em direção à mesma, porém como a outra bobina ainda está
acionada, seu fluxo será similar ao da primeira e, devido a isso, o rotor se manterá entre as
duas bobinas. Em seguida, desenergiza-se a primeira bobina que foi energizada e assim
sucessivamente, como pode ser visto na Figura 31.
Figura 31: Motor unipolar com meio passo. Extraído de (BRITES et al., 2008).
Quando um motor bipolar é utilizado com meio passo, a seqüência fica como na
Figura 32.
35
Figura 32: Motor bipolar com meio passo. Extraído de (BRITES et al., 2008).
3.3.3 Sistema de Micropasso
O sistema de microstepping (micropasso) consiste em controlar o fluxo de corrente
que passa pelas bobinas, criando uma subdivisão do passo completo, e dessa forma gerando
maior suavidade no movimento do rotor. Segundo (MANEA, 2009), “[...] a melhor forma de
onda para controlar a corrente no motor de passo é uma senoide.”. Deve-se observar que, ao
controlar os motores de passo em full step ou em half step, a seqüência elétrica de energizar as
bobinas se repete a cada quatro ciclos.Esse fenômeno do motor de passo significa que um
ciclo elétrico completo (360° elétricos) consiste em quatro passos completos. Vale lembrar
que um ciclo elétrico completo é diferente de uma volta completa do rotor.
O motor de passo é um motor elétrico síncrono, ou seja, cuja posição do rotor está em
sincronia com o fluxo do estator. A lógica de micropasso existente dentro do motor é que o
rotor terá um movimento bem mais suave sob baixas freqüências, já que o fluxo do estator,
que controla a posição na qual o rotor deve parar, vai se alterar gradualmente e dosado em
pequenas partes. A corrente nas bobinas devera seguir a trajetória de uma senoide (Fig. 33),
defasadas de 90° uma da outra, seguindo de maneira mais contínua, se comparado aos
sistemas de full-step (passo completo) e half-step (meio passo).
36
Figura 33: Corrente nas bobinas durante o micropasso e sua trajetória resultante. Extraído de (YEDAMALE et
al., 2002).
A trajetória de corrente resultante no micropasso pode ser observada detalhadamente
na Figura 34.
Figura 34: Trajetória da corrente no micropasso utilizando 1/8 de passo. Extraído de (LAIDMAN, 2001).
Há muitos tipos de micropasso: desde 1/3 de passo até 1/64 de passo, ou até passos
menores ainda.
37
Com freqüências chegando a duas ou três vezes maiores que a freqüência natural do
sistema, o micropasso acaba tendo pouca influência no movimento do rotor, se comparado ao
passo completo. Os motivos para tal afirmação são a inércia de carga e o efeito da filtragem
do rotor.
Em muitas aplicações, o modo de micropasso pode incrementar o desempenho do
sistema, além de baixar os custos e a complexidade do mesmo. Pode ser usado para resolver
problemas de ruídos e ressonância – que de fato afetam os motores de passo do painel de
instrumentos automotivo – e elevar os níveis de precisão e resolução de cada passo dado pelo
motor.
Podemos afirmar que o sistema de micropasso permite que os níveis de energia de
excitação (Fig. 35) sejam reduzidos de tal forma que todas as ressonâncias sejam
completamente eliminadas. Porém, isso só é atingível em um motor de passo ideal. Na
verdade, há várias fontes de aumento de ressonância no sistema. Apesar disso, usar a técnica
do micropasso suaviza e lineariza o movimento em praticamente todas as aplicações, e em
muitos casos ele sozinho pode proporcionar uma redução nítida das vibrações e dos ruídos e
satisfazer a aplicação.
Figura 35: Energia de excitação em função dos comprimentos de passo. Extraído de (Industrial Circuits
Application Note – Microstepping).
Aliado a um microprocessador– no caso de nosso estudo, o microcontrolador –, a
aplicação do micropasso pode ser feita com o auxílio de PWM (Pulse Width Modulation).
38
Pode ser introduzida também com conversores D/A (Digital/Analógico) dentro do próprio
microprocessador, a fim de baratear o máximo possível os custos de hardware, mas sem abrir
mão da qualidade da aplicação dentro do cluster.
3.4 Circuito PWM
O PWM (Pulse Width Modulation) é uma forma de controlar um nível de corrente
elétrica aplicada a uma carga modulando a largura do pulso do sinal. Para isto, mantém-se a
amplitude do sinal constante e rapidamente o mesmo é ligado e desligado, variando o tempo
que a carga recebe corrente elétrica e o tempo que não recebe, criando assim uma tensão
média entre os tempos “t1” (ligado) e “t2” (desligado), conforme ilustrado na Figura 36.
Figura 36: Sinal PWM. Extraído de (GHIRARDELLO, 2008).
A parte alta do sinal é chamada de “duty cycle” (ciclo ativo); ela define a potência
aplicada à carga, que corresponde ao tempo que a carga fica ligada. Ela é calculada dividindo
o ciclo ativo (t1) pela freqüência (t) e multiplicando por 100, o que é observado na figura 37.
Figura 37: Ciclo ativo. Extraído de (GHIRARDELLO, 2008).
A figura 38 mostra exemplos de variação da potência aplicada à carga.
39
Figura 38: Potência aplicada à carga. Extraído de (GHIRARDELLO, 2008).
40
4 EXPERIMENTOS
Foi desenvolvido um circuito para simular algumas funções do cluster de um veículo.
Para isto, utilizamos um microcontrolador PIC16F877A para gerenciar as informações
recebidas através do sensor de velocidade, do sensor do nível de combustível no tanque e da
chave de ignição, a fim de transmitir informações da velocidade atual do veículo, nível de
combustível e quilometragem total e parcial através de motores de passo e um display digital.
O protótipo do circuito montado pode ser observado na Figura 39.
Figura 39: Protótipo experimental.
4.1 Velocímetro
O sensor de velocidade - ou sensor de relutância variável - é montado de frente a uma
rodafônica com um número conhecido de dentes (Fig. 40) para que o deslocamento do carro
seja obtido em função da distância entre eles; foi ligado na entrada de captura de borda de
pulso do microcontrolador (CCP), através da qual medimos o tempo entre dois pulsos para
calcular a velocidade instantânea do veículo. Neste experimento, o sinal desse sensor foi
simulado por um gerador de funções.
41
Figura 40: Sensor de velocidade. Extraído de (BOSCH, 2005).
Para se obter o deslocamento do veículo é necessário calcular o perímetro da roda.
Utilizamos como base uma roda aro 13”. Como o diâmetro da roda está em polegadas,
primeiramente convertemos em milímetros e fizemos os seguintes cálculos:
D  13 25,4
D  330,2mm
Perímetro  2    raio
 330,2 
Perímetro  2    

 2 
Perímetro  1036,838mm
Convertendo em metros teremos:
Perímetro  1,037m
Para efeito de cálculos, consideramos o perímetro da roda igual a 1m, e que o sensor
gera um pulso a cada volta e montamos a Tabela 1:
42
1
10
100
200
240
km/h
km/h
km/h
km/h
km/h
1000
10000
100000
200000
240000
pulsos/h
pulsos/h
pulsos/h
pulsos/h
pulsos/h
1000
10000
100000
200000
240000
pulsos
pulsos
pulsos
pulsos
pulsos
3600
3600
3600
3600
3600
s
s
s
s
s
1 km/h
0,277778 m/s
10 km/h
2,777778 m/s
100 km/h
27,77778 m/s
200 km/h
55,55556 m/s
240 km/h
66,66667 m/s
Tabela 1: Relações entre velocidade, pulsos e período para se definir o deslocamento.
Utilizamos a constante 3600 para calcular a velocidade em função do intervalo entre
dois pulsos.
Tomando como exemplo um pulso com tempo de 360ms temos:
VelocidadeIns tan tânea 
VelocidadeIns tan tânea 
Constan teTempo  DeslocamentoPorPulso
TempoDoPulso
3600  0,001
0,36
VelocidadeIns tan tânea  10km / h
A partir destes dados, foi criada uma rotina de software para constantemente verificar
o tempo entre os pulsos, calcular a velocidade e mostrá-la através de uma escala graduada,
sendo atrelada a velocidade atual a um ponteiro. Este tem seu movimento angular gerado por
um motor de passo, que é controlado em função da velocidade atual.
O motor de passo utilizado tem 0,5º de deslocamento angular por passo mecânico, ou
ainda 2º de deslocamento angular por cada ciclo elétrico, o que corresponde a quatro passos
de deslocamento mecânico.
Foi verificado com testes que, para percorrer por toda a escala que compreende de 0 a
240km/h, foram necessários 560 passos do motor ou seja 140 ciclos elétricos.
Calculando o valor para cada 1km/h temos:
43
560 passos  240km / h
xpassos  1km / h
1 560
240
x  2,333...
x
Calculando em ciclos elétricos:
140ciclos  240km / h
xciclos  1km / h
1140
240
x  0,583
x
Primeiramente foi feito o controle do motor de passo utilizando passos completos,
tendo como base no desenvolvimento do nosso software de controle do motor os ciclos
elétricos. O esquema de controle do motor segue o fluxograma da Figura 41, que está
detalhado no Anexo V.
Figura 41: Fluxograma parcial de controle do motor.
44
4.2 Marcador de Combustível
O sensor de nível de combustível, um sensor resistivo com formato de boia (Fig. 42), é
utilizado para verificar a quantidade de combustível dentro do tanque de gasolina do veículo,
funciona como um potenciômetro; conforme o nível de combustível varia, ele retorna um
valor de resistência proporcional à posição da boia. O sinal deste sensor foi simulado por um
potenciômetro, que foi ligado à entrada analógica AN0 do microcontrolador. O esquema de
ligação pode ser observado na Figura 43.
Figura 42: Sensor de nível de combustível.
Figura 43: Esquema elétrico do sensor de combustível.
45
O conversor A/D (Analógico/Digital) utilizado foi configurado para trabalhar com oito
bits, e foi feita a Tabela 2 para estabelecer a relação do sinal com o número de bits.
Range de sinal do sensor = 0 – 5V
Resolução do conversor = 8 bits
Calculando o valor de tensão para um bit:
50
255
Vbit  0,019608V
Vbit 
Tensão (V) Valor Digital Nível Estimado
0
0
Vazio
2,5019
127
Metade
5
255
Cheio
Tabela 2: Relação para se encontrar o nível de combustível.
O deslocamento necessário para mover o ponteiro por toda a escala do marcador de
combustível (Fig. 44) é de 114º.
Figura 44: Marcador de combustível.
Como estamos utilizando como referência para deslocamento do motor de passo, que
move o ponteiro um ciclo elétrico, que neste caso gira o motor 2º, precisaremos de 57 ciclos
para deslocar o motor do ponto indicador de tanque vazio até o ponto indicador de nível
cheio.
4.2 Odômetro
46
Para calcular o deslocamento do veículo e atualizar o valor a ser mostrado no
odômetro, utilizamos o mesmo sinal do sensor de velocidade, já conhecendo o valor do
deslocamento por pulso. Foi criada uma rotina no software do microcontrolador para
incrementar uma variável a cada pulso do sensor, e escrever num display de LCD (Fig. 44) a
quilometragem atual a cada 0,1km. Com esta variável, foram feitos dois odômetros: um que
marca a quilometragem total e não pode ser apagado, e um parcial, que pode ser zerado ao
pressionar um botão, o qual está ligado à entrada digital C0.
Figura 45. Display LCD.
4.3 Micropassos
Após os testes de funcionamento controlando o motor de passos com full step (passo
completo), observamos que o ponteiro do mostrador quando movimentado em baixas
velocidades se deslocava de forma não linear, com precisão maior que 2 km/h, aparentando
que o motor estava com dificuldades de transmitir movimento. A fim de minimizar esse
efeito, alteramos a forma de controle do motor, criando subdivisões em cada passo fazendo
com que o ponteiro se movimentasse mais uniformemente.
Decidimos dividir um passo completo em oito micropassos e então fizemos o
levantamento das variáveis necessárias para utilizar no controle. Como o micropasso utiliza o
controle de corrente nas bobinas do motor, calculamos a quantidade de corrente necessária
para aplicar em cada passo, conforme descrito a seguir.
Cada passo completo desloca o motor por 90º elétricos. Dividindo em oito
micropassos, temos que:
90
 11,25º
8
47
Então cada 1/8 de passo vai deslocar o rotor por 11,25º, e o seno do ângulo de
deslocamento nos fornece a porcentagem de corrente que deve ser aplicada na Fase1.
Seno11,25º   0,19509
ou seja, 19,51% de corrente.
Para 2/8 temos:
90
 2  22,5º
8
Seno22,5º   0,382683
ou seja, 38,27% de corrente.
Seguindo este raciocínio, foi criada a Tabela 3.
Corrente aplicadaPasso Deslocamento seno(ºdeslocamento)
0
0
0,00%
1/8
11,25
19,51%
2/8
22,5
38,27%
3/8
33,75
55,56%
4/8
45
70,71%
5/8
56,25
83,15%
6/8
67,5
92,39%
7/8
78,75
98,08%
1
90
100,00%
Tabela 3: Porcentagem de corrente por deslocamento em função do seno do ângulo.
Como as duas bobinas precisam estar defasadas em 90º, para a segunda bobina,
teremos a mesma tabela, porém agora em função do cosseno, como mostra a Tabela 4.
Podemos observar nessa tabela que a porcentagem de corrente aplicada à bobina corresponde
aos pontos no gráfico da Figura 34.
48
Corrente aplicada Passo Deslocamento cos(ºdeslocamento)
0
0
100,00%
1/8
11,25
98,08%
2/8
22,5
92,39%
3/8
33,75
83,15%
4/8
45
70,71%
5/8
56,25
55,56%
6/8
67,5
38,27%
7/8
78,75
19,51%
1
90
0,00%
Tabela 4: Porcentagem de corrente por deslocamento em função do cosseno do ângulo.
Então modificamos nossa rotina de software de acionamento do motor, para controlar
a quantidade de corrente injetada nas bobinas, obedecendo a seqüência das Tabelas 3 e 4. Para
isto, utilizamos os PWM internos do microcontrolador, associados a uma ponte “H” e a uma
porta de controle, conforme a Figura 46, que também se encontra no Anexo IV deste trabalho.
Figura 46: Driver do motor de passo para micropassos.
49
Coletamos algumas amostras dos sinais de controle nas etapas de testes de
funcionamento do motor controlado com micropassos. A Figura 47 e a Figura 48 mostram o
comportamento da saída de PWM do microcontrolador utilizando a frequência de 1KHz,
fazendo o uso das tabelas (3) e (4).
Utilizamos um transistor bipolar BC548, pois, devido ao fato de que ele é de uso
comum e facilmente encontrado no mercado e também de que a corrente de acionamento das
bobinas do motor utilizado era baixa, ele atendia às necessidades do experimento prático.
Figura 47: Sinal de PWM no controle do micropasso.
Figura 48: Sinal de PWM no controle do micropasso.
O sinal após passar pela ponte “H” pode ser observado na Figura 49.
50
Figura 49: Sinal na ponte “H”.
Como citado no conteúdo teórico do capítulo 3, foi colocado um resistor como sensor
de corrente na saída da ponte “H” para coletar o sinal de corrente nas bobinas, que é mostrado
na Figura 50 e na Figura 51.
Figura 50: Forma de onda da corrente nas bobinas.
Figura 51: Forma de onda da corrente nas bobinas.
51
5 CONCLUSÕES E PROPOSTAS FUTURAS
Após os experimentos práticos terem sido finalizados e analisando os sinais colhidos
pelo osciloscópio, chegou-se à conclusão de que a aplicação da técnica de controle utilizando
micropassos em um motor de passo aumenta significativamente a precisão do motor quando
comparado ao controle passo completo. A velocidade quando utilizamos micropassos se
manteve a mesma em comparação ao passo completo, visto que foi criada uma relação para
manter a velocidade igual a do controle de passos completos. Quando utilizado 1/8 de passo,
aumentamos a velocidade do acionamento dos micropassos em oito vezes, mantendo a mesma
velocidade de percurso do ponteiro. Foi criado um algoritmo de testes do motor e
cronometrado o deslocamento do ponteiro durante o percurso, utilizando a técnica de controle
de micropassos. Com o acionamento de cada micropasso em 1ms, obtivemos 4,4 segundos no
cronômetro; já com o controle de passos completos, o acionamento de cada passo foi feito a
cada 8ms e cronometramos o tempo total de 4,54 segundos. Portanto, o micropasso se mostra
uma técnica de controle válida e eficaz, que possibilita um deslocamento nitidamente mais
suavizado do motor - como foi visto no protótipo -, ou seja, maior estabilidade quando ele se
encontra em situação de baixos níveis de rotação. Esse resultado pode se estender a outros
motores de passo utilizados no painel do veículo, visto que o mesmo, salvo as aquisições de
dados do automóvel, segue os princípios e características de funcionamento que foram
abordados no protótipo utilizado neste trabalho.
Como perspectiva de propostas futuras, sugerimos que essa técnica do micropasso seja
inserida à primeira parte do nosso projeto, ou seja, que possa ser executada dentro da
programação desenvolvida e descrita no Anexo I, e posteriormente adicionando os demais
componentes de um cluster, que possa ser prosseguida a montagem do mesmo.
Deve-se salientar que nosso hardware está limitado a utilizar um motor de passo com
a técnica de controle por micropassos, pois possui apenas duas saídas PWM; utilizando o
microcontrolador PIC 18F4520, é possível acionar dois motores ao mesmo tempo com essa
técnica.
REFERÊNCIAS
ALLAIN, Gildas. Microstepping: A Smoother Way of Life, Atmel Automotive Compilation,
Vol. 5, 2008, disponível em http://www.atmel.com/, acessado em 04/04/2012.
ASTARLOA, Armando, BIDARTE, Unai, ZULOAGA, Aitzol, ALEGRIA, Iñigo Mtz. De.
Reconfigurable Microstepping Control of Stepper Motors using FPGA embedded RAM,
Department of Electronics and Telecommunications, University of the Basque Country,
Bilbao, Spain, 2003.
BOSCH, Robert L.. Manual de Tecnologia Automotiva, 25ª Edição – Editora Edgard Blücher,
São Paulo, 2005.
BRITES, Felipe Gonçalves, SANTOS, Vinicius Puga de Almeida. Motor de Passo,
Universidade Federal Fluminense, Grupo PET-Tele, Niterói – RJ, 2008.
CONDIT, Reston, JONES, Dr. Douglas W., University of Iowa. AN 907 – Stepping Motor
Fundamentals, Microchip Technology Inc., 2004.
DING, Shoucheng. Design And Implementation of the Numeric Automobile Instrument,
LanzhouUniversity of Technology, China, 2008.
Fraen Corporation. Fraen6405-15xx – Standard Stepper Motors Datasheet.
Geo Storm Gsi, disponível em http://commons.wikimedia.org/, acessado em 03/04/2012.
GHIRARDELLO, Ariovaldo Prof., Apostila sobre Modulação PWM, Curso Técnico em
Eletrônica, Colégio Politec, 2008.
GRANT, Matthew. AN 2974 – Quick Start for Beginners to Drive a Stepper Motor, Freescale
Semiconductor, 2005.
GUIMARÃES, Alexandre de Almeida. Eletrônica Embarcada Automotiva, 1ª Edição –
Editora Érica, São Paulo, 2007.
Industrial
Circuits
Application
Note
–
Microstepping,
disponível
em
http://users.ece.utexas.edu/, acessado em 02/04/2012.
JONES, Douglas W.. Control of Stepping Motors, Department of Computer Science,
University of Iowa, 1995.
KENJO, Takashi. Stepping Motors And Their Microprocessor Controls, OxfordUniversity
Press, 1984.
LAIDMAN,
Russell.
Stepper
Motors
and
Control,
2001.
Disponível
em
http://www.stepperworld.com/, acessado em 05/04/2012.
MANEA, Sorin. AN 1307- Stepper Motor Control With dsPIC® DSCs, Microchip
Technology Inc., 2009.
MORAR, Alexandru. Microstepping Control Card, Department of Electrical Engineering,
“Petru Maior” University of Târgu-Mures, Romania, 2004.
Motor de Passo, disponível em http://pt.wikipedia.org/, acessado em 30/03/2012.
OFRIA, Charles. Understanding Your Dashboard Gauges, Smart Trac Computer Systems
Inc., 2007, disponível em http://www.familycar.com/, acessado em 30/03/2012.
YEDAMALE, Padmaraja, CHATTOPADHYAY, Sandip.AN 822 - Stepper Motor
Microstepping with PIC 18F452, Microchip Technology Inc., 2002.
ANEXO I
Programação do projeto inicial
/******************************************************************************/
/* Modulo: driverMotor.c
*/
/* Descrição: Modulo principal (main loop) .
*/
/* Projeto: Cluster
*/
/* Autores: Leone
*/
/*
: Vando
*/
/* Compilador/Assembler: CCS versao 3.43
*/
/* Hardware: Microchip PIC16F877A
*/
/* Data: <05/04/2012>
*/
/*
*/
/* Historico:
Iniciais
Motivo da Mudança
*/
/*
do Projetista
*/
/* 05/04/2012
LSILVA
Initial version.
*/
/*
VSOUSA
*/
/*
*/
/* 12/04/2012
LSILVA
Testes Drive do Motor
*/
/*
VSOUSA
*/
/*
*/
/* 19/04/2012
LSILVA
Testes Drive do Motor
*/
/*
VSOUSA
*/
/*
*/
/* 26/04/2012
LSILVA
Subrotinas
*/
/*
VSOUSA
*/
/*
*/
/* 03/05/2012
LSILVA
Loop Principal
*/
/*
VSOUSA
*/
/*
*/
/* 10/05/2012
LSILVA
Loop Principal
*/
/*
VSOUSA
*/
/*
*/
/* 17/05/2012
LSILVA
Ajustes
*/
/*
VSOUSA
*/
/*
*/
/******************************************************************************/
#include"16F877A.h"
#include"_lcd_1.c"
#use delay(clock=4000000)
#fuses XT,NOWDT,PUT,NOBROWNOUT,NOLVP
#zero_ram
/******************************************************************************/
/* Definição das Variáveis
/******************************************************************************/
*/
int timer;
//variável que temporiza intervalo entre as ações da subrotina do acionamento do motor do
mostrador de combustivel
long int segundo;
int combustivel;
//variavel para armazenar leitura analogica do sensor de combustivel
boolean bit;
//variavel utilizada para piscar um led como estatus de funcionamento do programa
boolean flag1;
//flag de passagem na subrotina do controle do motor do ponteiro combustivel
boolean flag2;
//flag de passagem na subrotina do controle do motor do ponteiro combustivel
boolean flag3 =;
//flag de passagem na subrotina do controle do motor do ponteiro combustivel
boolean flagAnalog;
//flag de passagem na subrotina do da leitura de combustivel
boolean flagAnalog2; //flag de passagem na subrotina do da leitura de combustivel
int memoria;
// tenta evitar ruidos nos extremos do potenciometro
signed int passos;
// indica o número de passos que o marcador deve andar
int posMotor;
// variavel que monitora a posição do marcador do combustivel
boolean flag1Vel;
//flag de passagem na subrotina do controle do motor do ponteiro da velocidade
boolean flag2Vel;
//flag de passagem na subrotina do controle do motor do ponteiro da velocidade
boolean flag3Vel;
//flag de passagem na subrotina do controle do motor do ponteiro da velocidade
signed int passosVel; // indica o número de passos que o marcador deve andar no motor do velocimetro
float aux2_vel;
//variavel para auxiliar nos calculos na subrotina da velocidade
int posMotorVel;
// variavel que monitora a posição do marcador do velocimetro
int timerVel;
//variável que temporiza intervalo entre as ações da subrotina do acionamento do motor do
mostrador de velocidade
int bounceVel;
//variavel utilizada no auxilio de retirar ruidos de acionamento na subrotina de leitura da
velocidade
boolean flagCCP1;
//flag de passagem na interrupção do ccp1
long int timerccp;
//variavel que ira contar o tempo entre dois pulsos do sensor da roda para calcular a
velocidade e a distancia percorrida
long int timerccp_2; //variavel utilizada para copiar o valor de tempo entre dois pulsos do sensor da roda para
calcular a velocidade e a distancia percorrida
long int timerLeVel; //variável que temporiza intervalo entre as leituras de velocidade instantanea
int unidadekm;
//
int dezenakm;
int centenakm;
long int odototal;
// variavel que armazena distancia percorrida no odometro total
long int odoparcial; // variavel que armazena distancia percorrida no odometro parcial
int auxOdototal;
// variavel auxiliar para odometro total
boolean inicializa;
// flag que marca que a inicialização foi feita
boolean desligado;
// flag que marca que o sistema foi desligado
int timerDesliga;
// variavel que temporiza a verificação se o sistema foi desligado
int timerOdo;
//variável que temporiza intervalo entre as ações da subrotina do odometro
boolean flagOdo1;
//flag de passagem na subrotina do odometro
boolean flagOdo2;
//flag de passagem na subrotina do odometro
boolean flagOdo3;
//flag de passagem na subrotina do odometro
boolean flagOdo4;
//flag de passagem na subrotina do odometro
/******************************************************************************/
/* Nome: TrataTimer
*/
/* Descrição: Realiza a interrupção do timer 0
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
#int_timer0
// trata interrupção do TIMER0
void tratat0 ()
{
set_timer0(131 + get_timer0 () ); // Carrega timer 0 com 131 para ter uma base de tempo de 1 ms ********
if (timer)
// Faz o decremento da variavel que faz os intervalos de acionamento das bobinas do motor
{
timer--; // do ponteiro do marcador de combustivel até que seja zero.*******
}
if (timerVel) // Faz o decremento da variavel que faz os intervalos de acionamento das bobinas do motor
{
timerVel--; // do ponteiro do marcador de Velocidade até que seja zero. *****
}
if (timerOdo) // Faz o decremento da variável que faz os intervalos de atualização
{
timerOdo--; // dos digitos do display até que seja zero.******
}
if (timerLeVel) // Faz o decremento da variavel que faz os intervalos de leitura da velocidade
{
timerLeVel--; // até que seja zero.******
}
if (timerDesliga) // Faz o decremento da variavel que faz os intervalos para poder verificar
{
timerDesliga--; // se o sistema foi desligado.*****
}
segundo ++;
// incrementa a variavel do sinalizador de status.*****
timerccp ++; // incrementa a variável que conta o intervlo entre os pulsos da roda.*****
if (500 == segundo) // A cada meio segundo inverte o estado do bit para atualizar o sinalizador de
status.*******
{
bit = !bit;
segundo = 0;
}
}
/******************************************************************************/
/* Nome: TrataCCP
*/
/* Descrição: Trata a interrupção do CCP1
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
#int_CCP1
// trata interrupção do CCP1
void trataCCP1 ()
{
if(input(pin_c0))
// Verifica se a chave de ignição (entrada C0) esta ligada (1)
{
odoparcial ++;
// Incrementa variável do odometro Parcial contando 1 metro******
auxOdototal ++;
// Incrementa variável auxiliar do odometro Total contando 1 metro
}
if (flagCCP1)
// Se flag CCP1 for um indica que primeira leitura já foi efetuada
{
timerccp_2 = timerccp; // copia valor do intervalo entre os pulsos
timerccp = 0;
// zera para medir novamente.****
}
if (!flagCCP1)
{
flagCCP1 = 1;
timerccp = 0;
}
// Se flag CCP1 for zero indica primeira leitura
// liga flag CCP1 para idicar que foi feita a primeira leitura
// zera variável que conta o intervalo entre os pulsos da roda
}
/******************************************************************************/
/* Nome: ContMotor
*/
/* Descrição: Controlar o motor de passo do combustivel
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void ContMotor(void)
{
if(0 > passos) // Avança sentido anti-horário
{
if ((!timer)&&(!flag1)&&(!flag2)&&(!flag3))
// Verifica se esta no tempo de acionar a bobina e se a flag
ja foi acionada
{
output_low(pin_b3);
// Desliga bobina acionada anteriormente
output_high(pin_b0);
// Liga próxima bobina da sequencia
flag1 = 1;
// Aciona flag de passagem
timer = 10;
// carrega tempo para próximo acionamento
}
if ((!timer)&&(flag1)&&(!flag2)&&(!flag3)) // Verifica se esta no tempo de acionar a bobina e se a flag ja
foi acionada
{
output_low(pin_b0);
// Desliga bobina acionada anteriormente
output_high(pin_b1);
// Liga próxima bobina da sequencia
flag2 = 1;
// Aciona flag de passagem
timer = 10;
// carrega tempo para próximo acionamento
}
if ((!timer)&&(flag1)&&(flag2)&&(!flag3)) // Verifica se esta no tempo de acionar a bobina e se a flag ja
foi acionada
{
output_low(pin_b1);
// Desliga bobina acionada anteriormente
output_high(pin_b2);
// Liga próxima bobina da sequencia
flag3 = 1;
// Aciona flag de passagem
timer = 10;
// carrega tempo para próximo acionamento
}
if ((!timer)&&(flag1)&&(flag2)&&(flag3)) // Verifica se esta no tempo de acionar a bobina e se a flag ja
foi acionada
{
output_low(pin_b2);
// Desliga bobina acionada anteriormente
output_high(pin_b3);
// Liga próxima bobina da sequencia
flag1 = 0;
// Zera flag de passagem para liberar proximo ciclo
flag2 = 0;
// Zera flag de passagem para liberar proximo ciclo
flag3 = 0;
// Zera flag de passagem para liberar proximo ciclo
posMotor --;
// Decrementa variável de posição atual do motor pois completou um passo (de
cada bobina)
timer = 10;
// carrega tempo para próximo acionamento
}
}
if(0 < passos) // Recua (sentido horário)
{
if ((!timer)&&(!flag1)&&(!flag2)&&(!flag3)) // Verifica se esta no tempo de acionar a bobina e se a flag ja
foi acionada
{
output_low(pin_b3);
// Desliga bobina acionada anteriormente
output_high(pin_b2);
// Liga próxima bobina da sequencia
flag1 = 1;
// Aciona flag de passagem
timer = 10;
// carrega tempo para próximo acionamento
}
if ((!timer)&&(flag1)&&(!flag2)&&(!flag3)) // Verifica se esta no tempo de acionar a bobina e se a flag ja
foi acionada
{
output_low(pin_b2);
// Desliga bobina acionada anteriormente
output_high(pin_b1);
// Liga próxima bobina da sequencia
flag2 = 1;
// Aciona flag de passagem
timer = 10;
// carrega tempo para próximo acionamento
}
if ((!timer)&&(flag1)&&(flag2)&&(!flag3)) // Verifica se esta no tempo de acionar a bobina e se a flag ja
foi acionada
{
output_low(pin_b1);
// Desliga bobina acionada anteriormente
output_high(pin_b0);
// Liga próxima bobina da sequencia
flag3 = 1;
// Aciona flag de passagem
timer = 10;
// carrega tempo para próximo acionamento
}
if ((!timer)&&(flag1)&&(flag2)&&(flag3)) // Verifica se esta no tempo de acionar a bobina e se a flag ja
foi acionada
{
output_low(pin_b0);
// Desliga bobina acionada anteriormente
output_high(pin_b3);
// Liga próxima bobina da sequencia
flag1 = 0;
// Zera flag de passagem para liberar proximo ciclo
flag2 = 0;
// Zera flag de passagem para liberar proximo ciclo
flag3 = 0;
// Zera flag de passagem para liberar proximo ciclo
posMotor ++;
// Incrementa variável de posição atual do motor pois completou um passo (de
cada bobina)
timer = 10;
// carrega tempo para próximo acionamento
}
}
}
/******************************************************************************/
/* Nome: ContMotorVel
*/
/* Descrição: Controlar o motor de passo da velocidade
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void ContMotorVel(void)
{
if(0 > passosVel) // Avança sentido anti-horário
{
if ((!timerVel)&&(!flag1Vel)&&(!flag2Vel)&&(!flag3Vel)) // Verifica se esta no tempo de acionar a
bobina e se a flag ja foi acionada
{
output_low(pin_c7);
// Desliga bobina acionada anteriormente
output_high(pin_c4);
// Liga próxima bobina da sequencia
flag1Vel = 1;
// Aciona flag de passagem
timerVel = 10;
// carrega tempo para próximo acionamento
}
if ((!timerVel)&&(flag1Vel)&&(!flag2Vel)&&(!flag3Vel)) // Verifica se esta no tempo de acionar a bobina
e se a flag ja foi acionada
{
output_low(pin_c4);
// Desliga bobina acionada anteriormente
output_high(pin_c5);
// Liga próxima bobina da sequencia
flag2Vel = 1;
// Aciona flag de passagem
timerVel = 10;
// carrega tempo para próximo acionamento
}
if ((!timerVel)&&(flag1Vel)&&(flag2Vel)&&(!flag3Vel)) // Verifica se esta no tempo de acionar a bobina
e se a flag ja foi acionada
{
output_low(pin_c5);
// Desliga bobina acionada anteriormente
output_high(pin_c6);
// Liga próxima bobina da sequencia
flag3Vel = 1;
// Aciona flag de passagem
timerVel = 10;
// carrega tempo para próximo acionamento
}
if ((!timerVel)&&(flag1Vel)&&(flag2Vel)&&(flag3Vel)) // Verifica se esta no tempo de acionar a bobina e
se a flag ja foi acionada
{
output_low(pin_c6);
// Desliga bobina acionada anteriormente
output_high(pin_c7);
// Liga próxima bobina da sequencia
flag1Vel = 0;
// Zera flag de passagem para liberar proximo ciclo
flag2Vel = 0;
// Zera flag de passagem para liberar proximo ciclo
flag3Vel = 0;
// Zera flag de passagem para liberar proximo ciclo
posMotorVel --;
// Decrementa variável de posição atual do motor pois completou um
passo (de cada bobina)
timerVel = 10;
// carrega tempo para próximo acionamento
}
}
if(0 < passosVel) // Recua (sentido horário)
{
if ((!timerVel)&&(!flag1Vel)&&(!flag2Vel)&&(!flag3Vel)) // Verifica se esta no tempo de acionar a
bobina e se a flag ja foi acionada
{
output_low(pin_c7);
// Desliga bobina acionada anteriormente
output_high(pin_c6);
// Liga próxima bobina da sequencia
flag1Vel = 1;
// Aciona flag de passagem
timerVel = 10;
// carrega tempo para próximo acionamento
}
if ((!timerVel)&&(flag1Vel)&&(!flag2Vel)&&(!flag3Vel)) // Verifica se esta no tempo de acionar a bobina
e se a flag ja foi acionada
{
output_low(pin_c6);
// Desliga bobina acionada anteriormente
output_high(pin_c5);
// Liga próxima bobina da sequencia
flag2Vel = 1;
// Aciona flag de passagem
timerVel = 10;
// carrega tempo para próximo acionamento
}
if ((!timerVel)&&(flag1Vel)&&(flag2Vel)&&(!flag3Vel)) // Verifica se esta no tempo de acionar a bobina
e se a flag ja foi acionada
{
output_low(pin_c5);
// Desliga bobina acionada anteriormente
output_high(pin_c4);
// Liga próxima bobina da sequencia
flag3Vel = 1;
// Aciona flag de passagem
timerVel = 10;
// carrega tempo para próximo acionamento
}
if ((!timerVel)&&(flag1Vel)&&(flag2Vel)&&(flag3Vel)) // Verifica se esta no tempo de acionar a bobina e
se a flag ja foi acionada
{
output_low(pin_c4);
// Desliga bobina acionada anteriormente
output_high(pin_c7);
// Liga próxima bobina da sequencia
flag1Vel = 0;
// Zera flag de passagem para liberar proximo ciclo
flag2Vel = 0;
// Zera flag de passagem para liberar proximo ciclo
flag3Vel = 0;
// Zera flag de passagem para liberar proximo ciclo
posMotorVel ++;
// Incrementa variável de posição atual do motor pois completou um
passo (de cada bobina)
timerVel = 10;
// carrega tempo para próximo acionamento
}
}
}
/******************************************************************************/
/* Nome: PiscaLed
*/
/* Descrição: Pisca um Led
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void PiscaLed(void)
{
output_bit(pin_c3,bit);
// Atualiza estado do led de status ***** pisca com frequencia de(1 Hz)*** para
auxiliar se o programa travou
}
/******************************************************************************/
/* Nome: Analogica
*/
/* Descrição: Faz a leitura do nivel de combustivel
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Analogica(void)
{
if ((!flagAnalog) && (!timer) && (!flagAnalog2)) // Verifica se esta no tempo de ler o sinal da boia de
combustivel e se a flag de leitura ja foi acionada
{
flagAnalog = 1;
// Aciona a flag de leitura
combustivel = read_adc();
// le o sinal analógico da boia de nivel de combustivel
}
if ((flagAnalog) && (!timer) &&(!flagAnalog2))
combustivel e se a flag de leitura ja foi acionada
{
// Verifica se esta no tempo de ler o sinal da boia de
memoria = ((combustivel / 4.5) - posMotor);
// Faz o calculo do numero de passos necessários para
colocar o ponteiro na posição
// referente ao valor lido anteriormente. obs: 4.5 é uma constante obtida com testes de
deslocamento
if (memoria >= 250)
// Verifica se esta próximo a extremidade do sensor
{
memoria = 255;
// força para valor maximo para evitar ruidos
}
if (memoria <= 10)
{
memoria = 0;
}
passos = memoria;
flagAnalog2 = 1;
// Verifica se esta próximo a extremidade do sensor
// força para valor minimo para evitar ruidos
// Numero de passos para o motor do combustivel
// Aciona marcador de passagem
}
if ((flagAnalog) && (!timer) &&(flagAnalog2))
// Verifica se passou o tempo e se as flags foram acionadas
{
flagAnalog = 0;
// Zera flag de passagem para liberar proximo ciclo
flagAnalog2 = 0;
// Zera flag de passagem para liberar proximo ciclo
}
}
/******************************************************************************/
/* Nome: Velocimetro
*/
/* Descrição: Faz a leitura da velocidade
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Velocimetro(void)
{
if(!timerLeVel)
// Verifica se ja passou o tempo para efetuar a leitura
{
aux2_vel = ( 3600 / timerccp_2) ;
// Utiliza constante (3600) para calcular a velocidade em função
do intervalo entre 2 pulsos.
if(aux2_vel > 255)
{
aux2_vel = 255;
}
if(aux2_vel < 5)
{
aux2_vel = 0;
}
// Faz ajuste para evitar ruidos nos valores das extremidades
// Força para valor máximo
// Faz ajuste para evitar ruidos nos valores das extremidades
// Força para valor mínimo
passosVel = ((aux2_vel / 2) - posMotorVel); // Calcula o deslocamento necessário (numero de passos) para
colocar ponteiro na posição futura
bounceVel = passosVel;
cosidera os sinais (+ -)
// Copia numero de passos necessários para um variavel que não
if(3 > bounceVel)
ponteiro
{
passosVel = 0;
alterar a posição
bounceVel = 0;
}
timerLeVel = 100;
// Verifica uma diferença minima de tres passos para evitar ruidos no
// Se a diferença não atingiu o valor minimo, carrega com zero para não
// Carrega variavel de tempo para próxima leitura
}
}
/******************************************************************************/
/* Nome: Odometro
*/
/* Descrição: Atualiza Odometro
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Odometro(void)
{
if(auxOdototal >=100)
// Verifica se atingiu 100 pulsos ( 1 pulso = 1 metro)
{
odototal ++;
// Se atingiu os 100 metros incrementa variavel do odometro total
auxOdototal = 0;
// e zera a variavel auxiliar para iniciar novamente.
}
if(!timerOdo && !flagOdo1 && !flagOdo2 && !flagOdo3 && !flagOdo4 )
{
output_D(0xC8);
comando ();
output_D(((odototal / 10000) % 10)+0x30);
escreve();
flagOdo1 = 1;
timerOdo = 100;
}
if(!timerOdo && flagOdo1 && !flagOdo2 && !flagOdo3 && !flagOdo4 )
{
output_D(0xC9);
comando ();
output_D(((odototal / 1000) % 10)+0x30);
escreve();
output_D(0x89);
comando ();
output_D('0');
escreve();
flagOdo2 = 1;
timerOdo = 100;
}
if(!timerOdo && flagOdo1 && flagOdo2 && !flagOdo3 && !flagOdo4 )
{
output_D(0xCA);
comando ();
output_D(((odototal / 100) % 10)+0x30);
escreve();
output_D(0x8A);
comando ();
output_D(centenakm+0x30);
escreve();
flagOdo3 = 1;
timerOdo = 100;
}
if(!timerOdo && flagOdo1 && flagOdo2 && flagOdo3 && !flagOdo4 )
{
output_D(0xCB);
comando ();
output_D(((odototal / 10) % 10)+0x30);
escreve();
output_D(0x8B);
comando ();
output_D(dezenakm+0x30);
escreve();
flagOdo4 = 1;
timerOdo = 100;
}
if(!timerOdo && flagOdo1 && flagOdo2 && flagOdo3 && flagOdo4 )
{
output_D(0xCC);
comando ();
output_D('.');
escreve();
output_D(0xCD);
comando ();
output_D((odototal % 10)+0x30);
escreve();
output_D(0x8C);
comando ();
output_D('.');
escreve();
output_D(0x8D);
comando ();
output_D(unidadekm+0x30);
escreve();
flagOdo1 = 0;
flagOdo2 = 0;
flagOdo3 = 0;
flagOdo4 = 0;
timerOdo = 100;
}
}
/******************************************************************************/
/* Nome: Contador
*/
/* Descrição: Atualiza Contador
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Contador(void)
{
if(odoparcial >=100)
{
unidadekm ++;
odoparcial = 0;
}
if(unidadekm>9)
{
unidadekm = 0;
dezenakm ++;
}
if(dezenakm>9)
{
dezenakm = 0;
centenakm ++;
}
if(centenakm>9)
{
unidadekm = 0;
dezenakm = 0;
centenakm =0;
}
if(!input(pin_C1))
{
unidadekm = 0;
dezenakm = 0;
centenakm =0;
}
}
/******************************************************************************/
/* Nome: Inicializacao
*/
/* Descrição: Inicializa e faz as definições de hardware
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Inicializacao(void)
{
setup_adc_ports(RA0_analog);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
set_tris_a(0x01);
set_tris_b(0x00);
set_tris_c(0x07);
set_tris_d(0x00);
set_tris_e(0x00);
preparacao();
}
/******************************************************************************/
/* Nome: Init_Var
*/
/* Descrição: Atribui valores iniciais as variáveis
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Init_Var(void)
{
int timer = 0;
long int segundo;
int combustivel =0;
boolean bit = 0;
boolean flag1 = 0;
boolean flag2 = 0;
boolean flag3 = 0;
boolean flagAnalog = 0;
boolean flagAnalog2 = 0;
int memoria = 0;
signed int passos = 0;
int posMotor = 0;
boolean flag1Vel = 0;
boolean flag2Vel = 0;
boolean flag3Vel = 0;
signed int passosVel = 0;
float aux2_vel = 0;
int posMotorVel = 0;
int timerVel = 0;
int bounceVel = 0;
boolean flagCCP1 = 0;
long int timerccp = 0;
long int timerccp_2 = 0
timerLeVel = 0unidadekm = 0;
dezenakm = 0;
centenakm = 0;
odototal = 0;
odoparcial = 0;
auxOdototal = 0;
inicializa = 0;
desligado = 0;
timerDesliga = 0;
timerOdo = 0;
bflagOdo1 = 0;
flagOdo2 = 0;
flagOdo3 = 0;
flagOdo4 = 0;
}
/******************************************************************************/
/* Nome: InicializaLCD
*/
/* Descrição: Inicializa o LCD
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void InicializaLCD(void)
{
output_D('C');
escreve();
output_D('L');
escreve();
output_D('U');
escreve();
output_D('S');
escreve();
output_D('T');
escreve();
output_D('E');
escreve();
output_D('R');
escreve();
output_D(0xCE);
comando();
output_D('k');
escreve();
output_D('m');
escreve();
output_D(0x8E);
comando();
output_D('k');
escreve();
output_D('m');
escreve();
inicializa = 1;
}
/******************************************************************************/
/* Nome: Desliga
*/
/* Descrição: Desliaga o LCD e coloca os ponteiros na posição inicial
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Desliga(void)
{
if(!timerDesliga)
{
if(!desligado)
{
preparacao();
inicializa = 0;
desligado = 1;
}
if(posMotorVel)
{
passosVel = (0 - posMotorVel);
ContMotorVel();
}
if(posMotor)
{
passos = (0 - posMotor);
ContMotor();
}
timerDesliga = 10;
}
}
/******************************************************************************/
/* Nome: main
*/
/* Descrição: Executa o programa principal
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void main(void)
{
Inicializacao();
Init_Var();
timerOdo = 100;
timerDesliga = 10;
while(1)
{
PiscaLed();
while(input(pin_c0))
{
if(!inicializa)
{
InicializaLCD();
desligado = 0;
}
ContMotor();
ContMotorVel();
PiscaLed();
esta rodando)
Analogica();
// Chama subrotina de controle do motor do mostrador de combustivel
// Chama subrotina de controle do motor do mostrador de velocidade
// Chama subrotina de status do programa ( piscando led enquanto o programa
// Chama subrotina de leitura do nivel de combustivel
Velocimetro();
// Chama subrotina de leitura de velocidade
Odometro();
// Chama subrotina de atualização do odometro
Contador();
// Chama subrotina que conta o odometro parcial
}
Desliga();
desligado
//Chama subrotina que posiciona os ponteiros e desliga o LCD quando o painel é
}
}
output_D('0');
escreve();
flagOdo2 = 1;
timerOdo = 100;
}
if(!timerOdo && flagOdo1 && flagOdo2 && !flagOdo3 && !flagOdo4 )
{
output_D(0xCA);
comando ();
output_D(((odototal / 100) % 10)+0x30);
escreve();
output_D(0x8A);
comando ();
output_D(centenakm+0x30);
escreve();
flagOdo3 = 1;
timerOdo = 100;
}
if(!timerOdo && flagOdo1 && flagOdo2 && flagOdo3 && !flagOdo4 )
{
output_D(0xCB);
comando ();
output_D(((odototal / 10) % 10)+0x30);
escreve();
output_D(0x8B);
comando ();
output_D(dezenakm+0x30);
escreve();
flagOdo4 = 1;
timerOdo = 100;
}
if(!timerOdo && flagOdo1 && flagOdo2 && flagOdo3 && flagOdo4 )
{
output_D(0xCC);
comando ();
output_D('.');
escreve();
output_D(0xCD);
comando ();
output_D((odototal % 10)+0x30);
escreve();
output_D(0x8C);
comando ();
output_D('.');
escreve();
output_D(0x8D);
comando ();
output_D(unidadekm+0x30);
escreve();
flagOdo1 = 0;
flagOdo2 = 0;
flagOdo3 = 0;
flagOdo4 = 0;
timerOdo = 100;
}
}
/******************************************************************************/
/* Nome: Contador
*/
/* Descrição: Atualiza Contador
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Contador(void)
{
if(odoparcial >=100)
{
unidadekm ++;
odoparcial = 0;
}
if(unidadekm>9)
{
unidadekm = 0;
dezenakm ++;
}
if(dezenakm>9)
{
dezenakm = 0;
centenakm ++;
}
if(centenakm>9)
{
unidadekm = 0;
dezenakm = 0;
centenakm =0;
}
if(!input(pin_C1))
{
unidadekm = 0;
dezenakm = 0;
centenakm =0;
}
}
/******************************************************************************/
/* Nome: Inicializacao
*/
/* Descrição: Inicializa e faz as definições de hardware
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Inicializacao(void)
{
setup_adc_ports(RA0_analog);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
set_tris_a(0x01);
set_tris_b(0x00);
set_tris_c(0x07);
set_tris_d(0x00);
set_tris_e(0x00);
preparacao();
}
/******************************************************************************/
/* Nome: Init_Var
*/
/* Descrição: Atribui valores iniciais as variáveis
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Init_Var(void)
{
}
/******************************************************************************/
/* Nome: InicializaLCD
*/
/* Descrição: Inicializa o LCD
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void InicializaLCD(void)
{
output_D('C');
escreve();
output_D('L');
escreve();
output_D('U');
escreve();
output_D('S');
escreve();
output_D('T');
escreve();
output_D('E');
escreve();
output_D('R');
escreve();
output_D(0xCE);
comando();
output_D('k');
escreve();
output_D('m');
escreve();
output_D(0x8E);
comando();
output_D('k');
escreve();
output_D('m');
escreve();
inicializa = 1;
}
/******************************************************************************/
/* Nome: Desliga
*/
/* Descrição: Desliga o LCD e coloca os ponteiros na posição inicial
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void Desliga(void)
{
if(!timerDesliga)
{
if(!desligado)
{
preparacao();
inicializa = 0;
desligado = 1;
}
if(posMotorVel)
{
passosVel = (0 - posMotorVel);
ContMotorVel();
}
if(posMotor)
{
passos = (0 - posMotor);
ContMotor();
}
timerDesliga = 10;
}
}
/******************************************************************************/
/* Nome: Main
*/
/* Descrição: Executa o programa principal
*/
/* Entrada: Nenhum
*/
/* Retorno: Nenhum
*/
/******************************************************************************/
void main(void)
{
Inicializacao();
timerOdo = 100;
timerDesliga = 10;
while(1)
{
PiscaLed();
while(input(pin_c0))
{
if(!inicializa)
{
InicializaLCD();
desligado = 0;
}
ContMotor();
ContMotorVel();
PiscaLed();
esta rodando)
Analogica();
// Chama subrotina de controle do motor do mostrador de combustivel
// Chama subrotina de controle do motor do mostrador de velocidade
// Chama subrotina de status do programa ( piscando led enquanto o programa
// Chama subrotina de leitura do nivel de combustivel
Velocimetro();
// Chama subrotina de leitura de velocidade
Odometro();
// Chama subrotina de atualização do odometro
Contador();
// Chama subrotina que conta o odometro parcial
}
Desliga();
desligado
}
}
//Chama subrotina que posiciona os ponteiros e desliga o LCD quando o painel é
ANEXO II
Hardware do projeto inicial
ANEXO III
Atualiza posição do ponteiro de velocidade
MotorVel
tempo2
== 0?
não
sim
sim
passos_vel
passos_vel
>0
não
não
tempo2 =
intervalo_tempo2
Retorna
sim
Passo
MotorVel
Sent. Ant-Horario
Passo
MotorVel
Sent. Horario
passos_vel ++
passos_vel - -
Faz Leitura do nível do combustível
Analógica
tempo3
== 0?
não
sim
leitura
==1?
sim
não
Lê entrada
analógica
calcula
passos_c
leitura = 1
tempo3 =
intervalo_tempo3
Retorna
Faz leitura da velocidade
Velocímetro
tempo4
== 0?
não
sim
calcula
velocidade
com intervalo
de tempo entre
dois pulsos do
ccp1
calcula
passos_vel
leitura = 1
tempo4 =
intervalo_tempo4
Retorna
Atualiza odômetro
Odômetro
tempo5
== 0
não
sim
odo_
alterou?
sim
não
Atualiza odômetro
no display LCD
tempo5 =
intervalo_tempo5
Retorna
Interrupção Timer 0
#int_timer0
tempo1
tempo1--
tempo2
tempo2--
tempo3
tempo3--
tempo4
tempo4--
tempo5
tempo5--
timerccp++
Retorna
Interrupção CCP1
#int_CCP1
odômetro_++
auxtimerccp = timerccp
timerccp = 0
Retorna
ANEXO IV
Hardware do micropasso
ANEXO V
Fluxograma do micropasso
Início
Define variáveis
Configura Timers
Configura PWM
Habilita
Interrupções
Define I/O
Aciona Bobina 4
A
1
sim
passos
>140?
sim
não
!tempo
sim
flag1 ==
0?
sim
Desaciona Bobina 3
não
não
Aciona Bobina 1
set_pwm1_duty(255);
set_pwm2_duty(0);
flag1 = 1
tempo = valor_tempo
1
1
!tempo
sim
flag1 ==
1?
sim
set_pwm1_duty(250);
não
não
set_pwm2_duty(50);
flag1 = 2
tempo = valor_tempo
sim
!tempo
flag1 ==
2?
sim
set_pwm1_duty(236);
não
não
set_pwm2_duty(98);
flag1 = 3
tempo = valor_tempo
!tempo
sim
flag1 ==
3?
não
não
sim
set_pwm1_duty(212);
set_pwm2_duty(142);
flag1 = 4
tempo = valor_tempo
2
2
!tempo
sim
flag1 ==
4?
sim
set_pwm1_duty(180);
não
não
set_pwm2_duty(180);
flag1 = 5
tempo = valor_tempo
sim
!tempo
flag1 ==
5?
sim
set_pwm1_duty(142);
não
não
set_pwm2_duty(212);
flag1 = 6
tempo = valor_tempo
sim
!tempo
flag1 ==
6?
não
não
sim
set_pwm1_duty(98);
set_pwm2_duty(236);
flag1 = 7
tempo = valor_tempo
3
3
!tempo
sim
flag1 ==
7?
sim
set_pwm1_duty(50);
não
não
set_pwm2_duty(250);
flag1 = 8
tempo = valor_tempo
passos ++
sim
flag1 ==
8?
!tempo
sim
set_pwm1_duty(0);
não
não
set_pwm2_duty(255);
flag1 = 9
tempo = valor_tempo
passos ++
!tempo
sim
flag1 ==
9?
sim
set_pwm1_duty(0);
não
não
set_pwm2_duty(255);
Desaciona Bobina 4
Aciona Bobina 2
flag1 = 10
tempo = valor_tempo
4
4
sim
!tempo
flag1
== 10?
sim
set_pwm1_duty(50);
não
não
set_pwm2_duty(250);
flag1 = 11
tempo = valor_tempo
!tempo
sim
flag1
== 11?
sim
set_pwm1_duty(98);
não
não
set_pwm2_duty(236);
flag1 = 12
tempo = valor_tempo
!tempo
sim
flag1
== 12?
não
não
sim
set_pwm1_duty(142);
set_pwm2_duty(212);
flag1 = 13
tempo = valor_tempo
5
5
!tempo
sim
flag1 ==
13?
sim
set_pwm1_duty(180);
não
não
set_pwm2_duty(180);
flag1 = 14
tempo = valor_tempo
sim
!tempo
flag1 ==
14?
sim
set_pwm1_duty(212);
não
não
set_pwm2_duty(142);
flag1 = 15
tempo = valor_tempo
!tempo
sim
flag1 ==
15?
não
não
sim
set_pwm1_duty(236);
set_pwm2_duty(98);
flag1 = 16
tempo = valor_tempo
6
6
!tempo
sim
flag1 ==
16?
sim
set_pwm1_duty(250);
não
não
set_pwm2_duty(50);
flag1 = 17
tempo = valor_tempo
passos ++
!tempo
sim
sim
flag1 ==
17?
set_pwm1_duty(255);
não
não
set_pwm2_duty(0);
flag1 = 18
tempo = valor_tempo
passos ++
!tempo
sim
flag1
== 18?
não
não
sim
set_pwm1_duty(255);
set_pwm2_duty(0);
Desaciona Bobina 2
Aciona Bobina 3
flag1 = 19
tempo = valor_tempo
7
7
0
!tempo
sim
flag1
== 19?
sim
set_pwm1_duty(250);
não
não
set_pwm2_duty(50);
flag1 = 20
tempo = valor_tempo
!tempo
sim
flag1
== 20?
sim
set_pwm1_duty(236);
não
não
set_pwm2_duty(98);
flag1 = 21
tempo = valor_tempo
!tempo
sim
flag1
== 21?
não
não
sim
set_pwm1_duty(212);
set_pwm2_duty(142);
flag1 = 22
tempo = valor_tempo
8
8
!tempo
sim
flag1 ==
22?
sim
set_pwm1_duty(180);
não
não
set_pwm2_duty(180);
flag1 = 23
tempo = valor_tempo
sim
!tempo
flag1 ==
23?
sim
set_pwm1_duty(142);
não
não
set_pwm2_duty(212);
flag1 = 24
tempo = valor_tempo
!tempo
sim
flag1 ==
24?
não
não
sim
set_pwm1_duty(98);
set_pwm2_duty(236);
flag1 = 25
tempo = valor_tempo
9
9
sim
flag1 ==
25?
!tempo
sim
set_pwm1_duty(50);
não
não
set_pwm2_duty(250);
flag1 = 26
tempo = valor_tempo
passos ++
sim
flag1 ==
26?
!tempo
sim
set_pwm1_duty(0);
não
não
set_pwm2_duty(255);
flag1 = 27
tempo = valor_tempo
passos ++
!tempo
sim
flag1
== 27?
sim
set_pwm1_duty(0);
não
não
set_pwm2_duty(255);
Desaciona Bobina 3
Aciona Bobina 4
flag1 = 28
tempo = valor_tempo
10
10
sim
!tempo
flag1
== 28?
sim
set_pwm1_duty(50);
não
não
set_pwm2_duty(250);
flag1 = 29
tempo = valor_tempo
!tempo
sim
flag1
== 29?
sim
set_pwm1_duty(98);
não
não
set_pwm2_duty(236);
flag1 = 30
tempo = valor_tempo
!tempo
sim
flag1
== 30?
não
não
sim
set_pwm1_duty(142);
set_pwm2_duty(212);
flag1 = 31
tempo = valor_tempo
11
11
sim
!tempo
flag1 ==
31?
sim
set_pwm1_duty(180);
não
não
set_pwm2_duty(180);
flag1 = 32
tempo = valor_tempo
!tempo
sim
flag1 ==
32?
sim
set_pwm1_duty(212);
não
não
set_pwm2_duty(142);
flag1 = 33
tempo = valor_tempo
sim
!tempo
flag1 ==
33?
não
não
sim
set_pwm1_duty(236);
set_pwm2_duty(98);
flag1 = 34
tempo = valor_tempo
12
12
!tempo
sim
flag1 ==
34?
sim
set_pwm1_duty(250);
não
não
set_pwm2_duty(50);
flag1 = 35
tempo = valor_tempo
passos ++
sim
!tempo
flag1 ==
35?
não
não
sim
set_pwm1_duty(255);
set_pwm2_duty(0);
flag1 = 0
tempo = valor_tempo
passos ++
Desaciona Bobina 3
A
ANEXO VI
Programação do micropasso
/*************************************************************************/
/* Modulo: Micropassos.c
*/
/* Descrição: Controle do motor de passo utilizando micropasso com uma
*/
/*rotina de testes
*/
/* Projeto: TCC Cluster controlando o motor de passo com Micropassos
*/
/* Autores: Leone
*/
/*
: Vando
*/
/* Compilador/Assembler: CCS versao 3.43
*/
/* Hardware: Microchip PIC16F877A*/
/* Data: <24/05/2012>*/
/*************************************************************************/
#include<16f877A.h>// Inclui o arquivo padrão do pic 16f877A
#use delay(clock=4000000)// Utiliza clock de 4MHz para gerar delay
#fuses XT,NOWDT,PUT,NOBROWNOUT
/*************************************************************************/
/*Definição das Variáveis*/
/*************************************************************************/
long int segundo = 0;
long int tempo = 500;
long int a = 0;
int b;
long int passos = 0;
boolean led = 1;
int flag1 = 0;
/*************************************************************************/
/*Interrupção Timer0 */
/*************************************************************************/
#int_timer0
void trata_t0 ()
{
set_timer0(131 + get_timer0 () ); // Carrega timer 0 com 131 para ter uma base de tempo de 1 ms ********
segundo ++;
if(tempo)
{
tempo--;
}
if(segundo > 1000)
{
segundo =0;
led = !led;
}
}
/*************************************************************************/
/*Programa Principal */
/*************************************************************************/
void main()
{
/*************************************************************************/
/*Inicialização do hardware*/
/*************************************************************************/
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_timer_2(T2_div_by_4,248,1);
//timer2 = 1,004 khz
setup_timer_2(T2_div_by_4,248,1);
setup_ccp2(ccp_pwm);
//ativa pwm
setup_ccp1(ccp_pwm);
//ativa pwm
set_pwm2_duty (0);
//configura ciclo ativo em 0
set_pwm1_duty (0);
//configura ciclo ativo em 0
setup_vref(FALSE);
set_tris_a (0x00);
set_tris_b (0x00);
set_tris_c (0x00);
set_tris_d (0x00);
set_tris_e (0x00);
set_adc_channel (10);
delay_ms (15);
enable_interrupts (global | int_timer0);
set_pwm2_duty(0);
output_d (0b00000001);
output_c (0b00000001);
output_high(pin_c5);
delay_ms(1000);
a = 40;
b = 1;
tempo = a;
//255
//250
//236
//212
//180
//142
//98
//50
//0
/*************************************************************************/
/*Loop de Teste da Tecnica de Micropassos utilizando 1/8 passo*/
/*************************************************************************/
while(1)
{
output_bit(pin_d1, led);
if(passos<124)
{
if((!tempo) && (flag1 ==0) )
{
output_bit(pin_d2, 0);
output_bit(pin_d3, 0);
output_bit(pin_c4, 0);
//
Aciona BOBINA Sequencia 1
if((!tempo) && (flag1 ==1) )
{
set_pwm2_duty(50);
set_pwm1_duty(250);
flag1 = 2;
tempo = a;
}
//
1/8 Passo
if((!tempo) && (flag1 ==2) )
{
set_pwm2_duty(98);
set_pwm1_duty(136);
flag1 = 3;
tempo = a;
}
//
2/8 Passo
if((!tempo) && (flag1 ==3) )
{
set_pwm2_duty(142);
set_pwm1_duty(212);
flag1 = 4;
tempo = a;
}
//
3/8 Passo
if((!tempo) && (flag1 ==4) )
{
set_pwm2_duty(180);
set_pwm1_duty(180);
flag1 = 5;
tempo = a;
}
//
4/8 Passo
set_pwm2_duty(0);
set_pwm1_duty(255);
flag1 = 1;
tempo = a;
output_bit(pin_d2, 1);
output_bit(pin_c5, 1);
}
if((!tempo) && (flag1 ==5) )
{
set_pwm2_duty(212);
set_pwm1_duty(142);
flag1 = 6;
tempo = a;
}
//
5/8 Passo
if((!tempo) && (flag1 ==6) )
{
set_pwm2_duty(236);
set_pwm1_duty(98);
flag1 = 7;
tempo = a;
}
//
6/8 Passo
if((!tempo) && (flag1 ==7) )
{
set_pwm2_duty(250);
set_pwm1_duty(50);
flag1 = 8;
tempo = a;
}
//
7/8 Passo
if((!tempo) && (flag1 ==8) )
{
set_pwm2_duty(255);
set_pwm1_duty(0);
flag1 = 9;
tempo = a;
}
//
8/8 Passo
if((!tempo) && (flag1==9 ) )
{
output_bit(pin_c4, 0);
output_bit(pin_c5, 0);
// Aciona BOBINA Sequencia 2
set_pwm1_duty(0);
set_pwm2_duty(255);
flag1 = 10;
tempo = a;
output_bit(pin_d3, 1);
}
if((!tempo) && (flag1 ==10) )
{
set_pwm2_duty(250);
set_pwm1_duty(50);
flag1 = 11;
tempo = a;
}
//
1/8 Passo
if((!tempo) && (flag1 ==11) )
{
set_pwm2_duty(236);
set_pwm1_duty(98);
flag1 = 12;
tempo = a;
//
2/8 Passo
}
if((!tempo) && (flag1 ==12) )
{
set_pwm2_duty(212);
set_pwm1_duty(142);
flag1 = 13;
tempo = a;
}
//
3/8 Passo
if((!tempo) && (flag1 ==13) )
{
set_pwm2_duty(180);
set_pwm1_duty(180);
flag1 = 14;
tempo = a;
}
//
4/8 Passo
if((!tempo) && (flag1 ==14) )
{
set_pwm2_duty(142);
set_pwm1_duty(212);
flag1 = 15;
tempo = a;
}
//
5/8 Passo
if((!tempo) && (flag1 ==15) )
{
set_pwm2_duty(98);
set_pwm1_duty(236);
flag1 = 16;
tempo = a;
}
//
6/8 Passo
if((!tempo) && (flag1 ==16) )
{
set_pwm2_duty(50);
set_pwm1_duty(250);
flag1 = 17;
tempo = a;
}
//
7/8 Passo
if((!tempo) && (flag1 ==17) )
{
set_pwm2_duty(0);
set_pwm1_duty(255);
flag1 = 18;
tempo = a;
}
//
8/8 Passo
if((!tempo) && (flag1==18) )
{
output_bit(pin_d2, 0);
output_bit(pin_c5, 0);
//Aciona BOBINA Sequencia 3
set_pwm2_duty(0);
set_pwm1_duty(255);
flag1 = 19;
tempo = a;
output_bit(pin_c4, 1);
}
if((!tempo) && (flag1 ==19) )
{
set_pwm2_duty(50);
set_pwm1_duty(250);
flag1 = 20;
tempo = a;
}
//
1/8 Passo
if((!tempo) && (flag1 ==20) )
{
set_pwm2_duty(98);
set_pwm1_duty(236);
flag1 = 21;
tempo = a;
}
//
2/8 Passo
if((!tempo) && (flag1 ==21) )
{
set_pwm2_duty(142);
set_pwm1_duty(212);
flag1 = 22;
tempo = a;
}
//
3/8 Passo
if((!tempo) && (flag1 ==22) )
{
set_pwm2_duty(180);
set_pwm1_duty(180);
flag1 = 23;
tempo = a;
}
//
4/8 Passo
if((!tempo) && (flag1 ==23) )
{
set_pwm2_duty(212);
set_pwm1_duty(142);
flag1 = 24;
tempo = a;
}
//
5/8 Passo
if((!tempo) && (flag1 ==24) )
{
set_pwm2_duty(236);
set_pwm1_duty(98);
flag1 = 25;
tempo = a;
}
//
6/8 Passo
if((!tempo) && (flag1 ==25) )
{
set_pwm2_duty(250);
set_pwm1_duty(50);
flag1 = 26;
tempo = a;
}
//
7/8 Passo
if((!tempo) && (flag1 ==26) )
{
set_pwm2_duty(255);
set_pwm1_duty(0);
flag1 = 27;
tempo = a;
}
//
8/8 Passo
if((!tempo) && (flag1 ==27) )
{
output_bit(pin_d2, 0);
output_bit(pin_d3, 0);
//Aciona BOBINA Sequencia 4
set_pwm2_duty(255);
set_pwm1_duty(0);
flag1 = 28;
tempo = a;
output_bit(pin_c5, 1);
}
if((!tempo) && (flag1 ==28) )
{
set_pwm2_duty(250);
set_pwm1_duty(50);
flag1 = 29;
tempo = a;
}
//
1/8 Passo
if((!tempo) && (flag1 ==29) )
{
set_pwm2_duty(236);
set_pwm1_duty(98);
flag1 = 30;
tempo = a;
}
//
2/8 Passo
if((!tempo) && (flag1 ==30) )
{
set_pwm2_duty(212);
set_pwm1_duty(142);
flag1 = 31;
tempo = a;
}
//
3/8 Passo
if((!tempo) && (flag1 ==31) )
{
set_pwm2_duty(180);
set_pwm1_duty(180);
flag1 = 32;
tempo = a;
}
//
4/8 Passo
if((!tempo) && (flag1 ==32) )
{
set_pwm2_duty(142);
set_pwm1_duty(212);
flag1 = 33;
//
5/8 Passo
tempo = a;
}
}
}
}
if((!tempo) && (flag1 ==33) )
{
set_pwm2_duty(98);
set_pwm1_duty(236);
flag1 = 34;
tempo = a;
}
//
6/8 Passo
if((!tempo) && (flag1 ==34) )
{
set_pwm2_duty(50);
set_pwm1_duty(250);
flag1 = 35;
tempo = a;
}
//
7/8 Passo
if((!tempo) && (flag1 ==35) )
{
set_pwm2_duty(0);
set_pwm1_duty(255);
flag1 = 0;
tempo = a;
passos ++;
}
//
8/8 Passo
Download

aplicação do micropasso no motor de passo do painel de