Motores de passo
Existe uma grande variedades de motores, diferenciando-se em formatos e capacidades, assim como os motores bipolares e os motores de 6 fios, observe a figura 1.

Para controlar um motor de passo é necessário gerar uma lógica de controle, está lógica consiste em enviar sinais (pulsos elétricos) para cada uma das bobinas de forma sequenciada e sincronizada, colocando assim o motor em movimento. É preciso saber o tempo certo, ou a sincronia em que os sinais ou pulsos elétricos serão enviados para as bobinas do motor. Pode parecer complicado, mas o procedimento é simples.
Para desenvolver uma placa que controle um motor de passo é bem fácil, e os componentes utilizados são bem simples e facilmente encontrados. Existe também a possibilidade de usar CIs dedicados, tais como o L297/298 e o SAA1027, entre outros.
Voltando à figura 1, podemos notar que um motor possui 6 fios e o outro 5, a diferença é que no motor de 6 fios temos 2 fios para a alimentação, enquanto no de 5 fios apenas 1 serve de alimentação, pois os outros já estão conectados a ela.
Se tirarmos os fios de alimentação em qualquer um dos tipos de motores, sobram 4 fios, e é sobre esses 4 fios que iremos chaveá-los com a lógica eletrônica para a geração de pulsos.
Referente ao tipo de chaveamento empregado no motor, ele pode ser classificado como Full-Step (Passo normal) ou Half-Step (Meio passo). No motor Full-Step é gerada uma sequência equivalente a 4 pulsos de uma única vez, já no Half-Step os 4 pulsos também são enviados mas com um intervalo de tempo entre eles.
Vale lembrar também que podemos ter vários sinais de controle num circuito driver de motor de passo, o qual varia de modelo para modelo de driver. No nosso caso iremos nos fixar somente na sequência LÓGICA.
Vejamos a sequência de bits abaixo:
1000
0100
0010
0001
Se gerarmos esta sequência estaremos energizando as bobinas do motor de forma a movimentá-lo, se convertemos estes bits que estão na forma binária para a forma decimal teremos 0001 correspondendo ao 1, 0010 correspondendo ao 2, 0100 correspondendo ao 4 e finalmente o 1000 correspondendo ao 8. Então para acionarmos um motor de passo utilizando números decimais, teremos que enviar 1,2,4 e 8 para o motor girar. Se precisarmos inverter a rotação do motor é só inverter a ordem e enviar 8, 4, 2 e 1 para isto.
Porém só enviar os pulsos pelas bobinas não é garantia de fazer o motor rodar, uma outra variável é importante para isto, e esta variável é o tempo. Se você enviar o sinal 0001 e em seguida 0010, sem dar tempo para o motor girar entre a primeira e segunda bobina ele ficará vibrando, pois a bobina 2 nem esperou o giro para repelir novamente o eixo. Então é preciso ter em mente que o driver deverá enviar a primeira sequência e,depois de um determinado tempo, ele enviará a segunda sequência. O mesmo funciona quando desejarmos inverter o sentido do motor.
Para resolver este problema da vibração e fazer o motor rodar é preciso ajustar o tempo do intervalo de cada sequência, lembrando que cada motor tem seu tempo padrão especificado pelo fabricante.
O tempo de intervalo entre as sequências também determina a velocidade em que o motor irá girar, quanto menor for o tempo de intervalo, mais rápido ele irá girar, quanto maior este tempo mais lento , porém com uma força maior de torque. Um exemplo dessa operação está nas impressoras matriciais, onde se segurarmos por um breve momento o carro de impressão, notaremos que ela fica desregulada, pois em alta velocidade o motor não tem torque para superar o freio causado por nós.
Circuitos Geradores de Sequências de Fase
Na figura 2 temos um diagrama eletrônico bem antigo, com cerca de 18 anos, que foi extraído do manual de um Driver da Elebra, mostrando que o conceito não mudou.
Ao observar bem essa figura uma questão pode ser levantada: como podemos gerar 4 bits se utilizamos apenas 2 saídas do 74LS191?
A resposta é simples e interessante, imagine um projeto onde um microcontrolador ou outra interface de 8 bits de saída precise controlar dois motores de passo, 4 bits controla um motor, até aqui sem problemas, mas se ao invés de dois precisássemos controlar quatro motores?
A resposta novamente é simples, usamos a lógica da figura 2, desta forma teremos 2 bits controlando cada motor.
Agora vamos analisar o mesmo circuito da figura 2, porém removendo o CI 74LS191 que é um contador e o 7408, teremos as saídas mostradas na tabela 1 (tabela-verdade) do CI 7486, que é uma porta XOR.
Veja que se aplicarmos os sinais 00, 01, 10 e 11 ao circuito da figura 2, teremos na saída exatamente a sequência necessária para a rotação do motor.
Nos esquemas das figuras 3, 4 e 5 são de 2 bits com a lógica para gerar os 4 bits necessários para o funcionamento do mo- tor. Note que temos opções diversas e com a utilização de CLs de fácil obtenção para esta finalidade. Nos esquemas das figuras 3 e 4 utilizamos o transistor TIP122 como etapa de potência, no esquema da figura 5 utilizamos o ULN2803, que tem um custo mais elevado e uma carga de corrente menor que o TIP122. Porém estes circuitos foram apresentados para mostrar como funciona a lógica do controle, pois o intuito deste artigo é utilizar a placa de Interface LPT, que poderá controlar até oito motores de passo, útil para o nosso outro projeto que é o controle de um braço robótico.
Cada módulo de potência deve ser conectado às portas de saída da placa Interface LPT , sendo que o primeiro motor deverá ser conectado nas saída SV3 da placa, nos pinos 7 e 8. O segundo módulo deverá ser conectado na mesma saída SV3, porém nos pinos 5 e 6, o terceiro nos pinos 3 e 4 e finalmente o quarto módulo nos pinos 1 e 2, todos na saída SV3 que corresponde à porta A. Os outros quatro motores podem ser conectados através dos seus módulos de potência pela porta B saída SV2, não se esquecendo de ligar o TERRA na saída SV4.
Na figura 6a temos o circuito de controle sem a lógica que gera os 4 bits, pois este trabalho será da placa de Interface LPT controlada pelo computador. Como a placa tem 8 bits de saída só poderemos controlar quatro motores sem que tenhamos que utilizar um driver de controle, conforme mostra a figura 6b. Para aperfeiçoarmos o projeto e controlar oito motores utilizando a placa Interface LPT, conforme a figura 6c, deveremos recorrer aos drivers apresentados nas figuras 3, 4 ou 5.
É bom começar o projeto utilizando apenas quatro motores, depois aprimore o seu projeto com mais quatro. Para conectar os 4 módulos de potência na placa Interface LTP, você deverá conectar os 4 fios do primeiro módulo à saída SV3 nos pinos 5, 6, 7 e 8, e os 4 fios do segundo módulo na mesma saída SV3 nos pinos 1, 2, 3 e 4. Agora os outros dois módulos na porta SV2 repetindo a mesma sequência, pinos 5, 6, 7 e 8 para um módulo e 1, 2, 3 e 4 para o outro módulo de potência. Caso o leitor tenha alguma dúvida sobre os conectores da placa Interface LTP, recomendamos a leitura da edição 437 da página 41.
A Programação
A lógica de programação que iremos utilizar não altera muito do que já vimos até o momento, para o controle utilizando 4 bits iremos dar a saída na sequência 1, 2, 4, e 8, agora quando tivermos oito motores onde a lógica se dá na saída de 2 bits iremos gerar a sequência 1, 2 e 3, e o driver fará o resto do serviço, lembrando que os números aqui apresentados estão em decimal.
Agora para o segundo motor? Qual é a sequência que deverá ser gerada?
Vejamos o exemplo abaixo, imaginemos a porta A da interface LPT da seguinte forma:
D7 D6 D5 D4 D3 D2 D1 D0 (porta A)
Para o modo de 4 bits, as saídas seriam D0, D1, D2 e D3 para o motor de passo 1. Para o motor de passo 2 ficariam as saídas D4, D5, D6 e D7.
Na porta B seria a mesma coisa, D0, D1, D2 e D3 para o terceiro motor e D4,D5,D6,D7 para o quarto motor.
No caso de estarmos utilizando 2 bits, a distribuição ficaria assim, na porta A reservamos os pinos D0 e D1 para o motor 1, D2 e D3 para o motor 2, D4 e D5 para o motor 3, D6 e D7 para o motor 4. Na porta B da interface LPT teríamos em D0 e D1 o motor 5, D2 e D3 motor 6, D4 e D5 motor 7 e finalmente o motor 8 em D6 e D7.
Para tornar as sequências que acionam os motores, tanto em Binário como em Decimal, apresentamos a tabela 2 com as sequências e as saídas correspondentes, como também o resultado esperado.
Para acionarmos as saídas D0, D1, D2 e D3 (primeiro motor – porta A), teríamos que enviar as sequências 1, 2, 4 e 8. Para acionarmos as saídas D4, D5, D6 e D7 (segundo motor – porta B), teríamos que enviar as sequências 16, 32, 48 e 128. Para a porta B o processo é o mesmo.
Para o caso de usarmos oito motores, a sequência de saída na porta A teria o primeiro driver controlador ligado ao D0 e D1 seria 1, 2 e 3, na saída D2 e D3 (no driver do segundo motor) seria 4, 8 e 12, na saída D4 e D5 (driver do terceiro motor) e finalmente na saída D6 e D7 (driver do quarto motor) seria 64, 128, 192. Para os outros quatro motores conectados na porta B o procedimento é o mesmo. Veja na tabela 3 a sequência de saídas no formatos binário e decimal.
Analisando as duas tabelas de sequ- ências fica claro o porquê e como gerar as fases num motor de passo, nas tabelas removemos o ZERO inicial de todas as fases, porém para a seqüência ficar correta elas devem existir.
O que acontece com o motor de passo caso a seqüência esteja errada ou faltando uma delas? Simples, o eixo do motor irá girar de forma incorreta, o que é facilmente perceptível.
A interface
Como fazer um procedimento para dar a saída para um circuito de 4 bits ou de 2 dependerá do valor da variável responsável pela saída, onde podemos ver pelas tabelas 2 e 3 , iremos partir diretamente para o controle de oito motores (2 bits), onde se faz necessário um driver de controle igual ao da figura 5.
Baixe o arquivo stpMlpt.arj no portal Saber Eletrônica e instale-o no seu micro. A tela do programa é mostrada na figura 7.
Depois de instalado, abra o arquivo e uma tela igual à da figura 7 aparecerá em seu computador, lembre-se de fazer as devidas configurações dadas na edição 437 – Junho/2009. Nesta tela você encontra os seguintes comandos:
Caixa BASE DE TEMPO – Controla a base de tempo entre a geração das fases, para os botões de controle;
Botões M1 a M4 – Controla os motores manualmente;
Caixa Steper 1 até Steper 8 – Controla o sentido de rotação e a velocidade de geração das fases. Funciona como um acelerador.
No código a seguir podemos observar a rotina de acionamento da interface, onde selecionamos o endereço da porta paralela disponível no computador em que a placa Interface LPT está conectada.
Private Sub Seleciona_Click()
dados = Val(Text1.Text)
Status = dados + 1
Control = dados + 2
Out Control, 228
Out dados, 0
Out dados, 255
Out dados, 0
End Sub
Uma vez selecionado o endereço da porta de controle da interface LPT, observamos no código a seguir a rotina que gera a base de tempo para os botões de controle dos motores.
Private Sub tm1_Change()
tm1x.Caption = tm1
tm1temp = tm1
tm1temp = tm1temp * 1000
End Sub
Após selecionar o endereço da porta, ativamos um determinado TEMPO para a geração dos PULSOS e, depois, o envio do dado para a saída da porta LPT. Repare que demos dois exemplos (Box 1 e 2) diferentes para fazer a mesma coisa.
Observe no primeiro exemplo em que geramos os códigos 0, 1, 2 e 3, e efetuamos um laço de tempo FOR...NEXT....com a variável tm1temp já descrito anteriormente. Nesse ponto é que o programa controla o tempo de geração das fases do qual tratamos no inicio do artigo. Através desse laço de tempo é possível determinar a velocidade com que os bits de controle serão enviados para a saída da interface LPT, e depois ao circuito driver do motor de passo.
No exemplo 2 temos o procedimento feito no exemplo 1, porém utilizamos um laço de contagem FOR...NEXT... para gerar a sequência.
Aperfeiçoando o programa
Observe a tela do programa de controle, temos a sequência STEPER 01 até 08, cada uma com três botões e uma barra de rolagem. A barra de rolagem é responsável pela geração de tempo entre as sequências, conforme exemplo a seguir:
Private Sub step1_Change()
step1y.Caption = step1
step1x = step1
step1x = step1x * 5000
End Sub
No código é possível ver a existência de 16 Timers do Visual Basic 6 conforme mostra a figura 8.
A quantidade de diversos Timers tem como objetivo o controle dos motores com acionamento contínuo. Nos botões temos os exemplos de como acionar o motor, cada click no botão fará o motor girar numa sequência de passos em modo FULL, ou seja, gera a sequência 0001, 0010, 0100, 1000 em 4 bits ou 00, 01, 10, 11 para 2 bits de controle.
Quando for preciso girar o motor constantemente, será preciso ficar pressionando o botão, mas é possível através do código criar uma rotina liga-desliga, como o caso dos 16 timers que estão no exemplo. Vemos o código- fonte de todos os botões no Box 3.
Podemos notar que para cada motor utilizamos dois timers, um deles gera a sequência do motor “PARA FRENTE” e o outro timer gera a sequência “PARA TRÁS”, ou seja inverte. Quando acionamos o BOTÃO ( SH – Sentido Horário ), ativamos o TIMER 1 e desativamos o TIMER2; ao acionarmos o TIMER1 o programa executa a rotina contida em TIMER 1 que é:
Private Sub Timer1_Timer()
Out Control, 236
For x = 0 To 3: Out dados, x: For t = 1
To step1x: Next t: Next x
End Sub
Neste ponto o motor fica acionado continuamente, ele pode estar vibrando, ao invés de girar, isso se deve à frequência de vibração ou ressonância, a qual atingimos e isso não nos interessa, então acione a barra deslizante com a rotina abaixo:
Private Sub step1_Change()
step1y.Caption = step1
step1x = step1
End Sub
Instantaneamente, o motor sai do estado de vibração e começa a girar. Quando acionamos o botão (SHA – Sentido Anti-Horário) onde o código contido nele é:
Private Sub Command25_Click()
Timer1.Enabled = False
Timer2.Enabled = True
End Sub
Desligamos o TIMER1, o qual estava fazendo o motor girar no sentido horário, e ligamos o TIMER2 que fará o motor girar em sentido anti-horário. A seguir, temos as linhas de programa contidas em TIMER2:
Private Sub Timer2_Timer()
Out Control, 236
For x = 3 To 0 Step -1: Out dados, x: For t = 1 To step1x: Next t: Next x
End Sub
Para parar o motor basta clicar sobre o botão X seu código é apresentado abaixo.
Private Sub Command27_Click()
Timer1.Enabled = False
Timer2.Enabled = False
End Sub
Para desligarmos o motor, simplesmente colocamos os dois timers em falso ou desativado e o motor para.
Ainda sobre a rotina contida no TIMER2, perceba que efetuamos a contagem do 3 para o 0 com passo -1, ou seja iremos tirar de 3 até chegar em zero e começar tudo novamente.
Essa rotina é idêntica para todos os outros sete motores, salvo é claro a palavra de controle que é de acordo com a tabela de controle e a porta equivalente.
Para acionarmos a Porta A da interface enviamos OUT control,236; para controlar a Porta B enviamos OUT Control, 224.
Considerações importantes
Não espere de circuitos simples uma alta eficiência, pois é importante observar que para os devidos fins uma série de configurações devem ser adotadas, cabe ao leitor desenvolver a solução ideal para o seu tipo de problema. Esperamos que este artigo sirva de base para auxiliar o leitor que deseja aprender mais a desenvolver soluções mais abrangentes e robustas, e aguardamos receber mensagens de que o projeto foi montado e nele o leitor fez tal modificação, para que possamos repassar a todos os técnicos que leem a revista e estes possam apreciar a solução dada.
Sempre que preciso de circuitos eficientes, recorro aos diagramas de fabricantes de produtos e manuais de componentes. É nestas documentações que eu encontro a solução de forma prática e ágil, assim como há mais de 15 anos eu fiz um motor de passo girar gastando pouco, pois o CI SAA1027 (muito comentado em artigos técnicos) eu nunca consegui comprar no Brasil.
Conclusão
Apresentei neste artigo duas soluções para controlar motores de passo, uma com auxílio de circuitos e outra usando o processamento do computador através da placa de Interface LPT, qualquer dúvida sobre a placa pedimos que revejam o artigo da edição 437 ( junho – 2009) ou entrem em contato com o autor através de e-mail.
Nas próximas edições apresentarei outras aplicações para a placa Interface LPT, onde o objetivo final é montar um sistema automatizado com braço robótico, esteira e sensores. Ate breve!
*Originalmente publicado na revista Saber Eletrônica Nº440  |