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 1140 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: 50 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. Seno11,25º 0,19509 ou seja, 19,51% de corrente. Para 2/8 temos: 90 2 22,5º 8 Seno22,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