Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print

ELETRÔNICA / ELÉTRICA => Eletrônica Básica => Programação => Tópico iniciado por: JoãoFDS em 15 de Dezembro de 2011, 20:25

Título: Programa para Motor de Passo
Enviado por: JoãoFDS em 15 de Dezembro de 2011, 20:25
Boa noite a todos.
Ja faz um tempo que visito o site, mas só agora resolvi me cadastrar.
sou novo aqui no site, se estiver postando no lugar errado peço desculpas.

Bom, la vai a duvida.
  estou tentando controlar um motor de passo nema23 (6 fios) pela porta paralela.
como é só um motor estou a usar o ULN2003 com um TIP122 e sua saída pois o motor é de 2A.

  A questão é... no script de programação (DEV C++) eu preciso enviar um pulso por vez para o CI ou posso enviar os 4 pulsos de uma só vez? (no caso... D0; D1; D2; D3 simultaneamente).
  Sendo pulsos alternados com um determinado intervalo de tempo, como ficaria com um laço for ou while, também poderia ser sem laços, contudo que tivesse como aumentar ou diminuir a RPM.

fiz esse mas ele só ativa uma porta.

    unsigned char valor=8;
    while(valor>=0){
                   outportb (0x378, 2);
                   cout << valor;
                   _sleep(500); //meio segundo
                   }

Obrigado e aguardo soluções inteligentes.
Título: Re:Programa para Motor de Passo
Enviado por: minilathe em 15 de Dezembro de 2011, 22:19
Se cada bit da porta estiver associado a uma fase do motor, mais de uma fase pode ser acionada simultaneamente, exemplo:

unsigned char i, valor[]={0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09};

while (1){
    for (i = 0; i < 8; i++){
        outportb (0x378, valor);
        printf( "%d - %d\n", i, valor);
        _sleep(500); //meio segundo
   }
}
Título: Re:Programa para Motor de Passo
Enviado por: JoãoFDS em 15 de Dezembro de 2011, 22:49
 :-\
Desculpe mas não sou um expert em Motor de Passo...
quando você fala "cada bit da porta estiver associado a uma fase do motor", você fala do que exatamente? fase = corrente?

e o seu script não compilou aqui. Obrigado pela ajuda.
Título: Re:Programa para Motor de Passo
Enviado por: minilathe em 15 de Dezembro de 2011, 23:10

Se você quer comandar um motor de passo, sugiro antes dar uma lida no funcionamento do mesmo. Um motor de passo possui várias fases, enrolamentos.
Título: Re:Programa para Motor de Passo
Enviado por: C N C N o w ! em 15 de Dezembro de 2011, 23:20
quando você fala "cada bit da porta estiver associado a uma fase do motor", você fala do que exatamente? fase = corrente?

João, cada enrolamento do motor é denominado fase. A estrutura de um motor unipolar de seis fios é assim:


         +---/\/\/\---0 A1
         |  *
COM1 0---+
         |         *
         +---/\/\/\---0 A2


         +---/\/\/\---0 B1
         |  *
COM2 0---+
         |         *
         +---/\/\/\---0 B2


Observe que há dois pares de bobinas, A1/A2 e B1/B2. Os enrolamentos de um mesmo par nunca são energizados concomitantemente, mas de pares diferentes sim.

Para operação do motor em passo cheio no modo padrão, duas fases energizadas, uma possível sequência ( representando fases energizadas por 1 e desenergizadas por 0 ):


A1 A2 B1 B2
 0  1  0  1  -  1
 0  1  1  0  -  2
 1  0  1  0  -  3
 1  0  0  1  -  4


Com esta sequência [ 1, 2, 3, 4 ] o motor gira para um lado, invertendo-se a sequencia o motor gira para o lado oposto.

Para quem queira familiarizar-se com motores de passo costumo indicar :

http://www.divms.uiowa.edu/~jones/step/ (http://www.divms.uiowa.edu/~jones/step/)

Citar
aguardo soluções inteligentes.

Nós tb ... ;D
Título: Re:Programa para Motor de Passo
Enviado por: JoãoFDS em 16 de Dezembro de 2011, 00:02
C N C N o w !

Muito obrigado pelo esclarecimento...
pouco depois do comentário do minilathe, lí algumas coisas referente e descobrí
parte do que  você deixou no post. Enfim ficou claro sobre as fases.

Aproveitando para responder a questão do minilathe sobre cada bit em cada fase.... cada bit esta sim
associado a uma cada fase do motor, porem seu script que seria minha solução não compilou aqui.

minha intenção é faze-lo girar e controlar sua RPM atravez de _sleep()
qualquer ajuda é bem vinda..

Obrigado a todos.
Título: Re:Programa para Motor de Passo
Enviado por: minilathe em 16 de Dezembro de 2011, 00:12
Qual comando não compilou? Ou deu erro?

Título: Re:Programa para Motor de Passo
Enviado por: JoãoFDS em 16 de Dezembro de 2011, 00:23
#include <iostream>
#include <stdio.h>
using namespace std;

int main(){
   
unsigned char i, valor[]={0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09};

while (1){
    for (i = 0; i < 8; i++){
        outportb (0x378, valor);
        printf( "%d - %d\n", i, valor);
        _sleep(500); //meio segundo
   }                   
  }                system("pause > null");
                   return 0;
                   }


Aqui deu outporb undeclared.
Título: Re:Programa para Motor de Passo
Enviado por: rymaeda em 16 de Dezembro de 2011, 01:08
Bom dia a todos.

Faz tempo que não programo nada mas vou arriscar um pitaco.

DevC++ é um ambiente de desenvolvimento para Windows e o Windows em suas últimas encarnações restringe o acesso às suas portas de comunicações como a que pretende em seus experimentos.

Outport pelo pouco que me lembro pertence à biblioteca do TurboC/C++ para DOS e há uns 12 anos atrás as bibliotecas para controle da porta paralela para Windows eram pagas uma rápida pesquisa na Rede parece indicar que ainda seja assim.

Alternativamente pode baixar os compiladores TurboC gratuitamente no museu da Borland e fazer a sua pesquisa em ambiente DOS...

/pitaco

Boa sorte,

Ricardo
Título: Re:Programa para Motor de Passo
Enviado por: JoãoFDS em 16 de Dezembro de 2011, 01:36
Muito obrigado pelo "Pitaco" Ricardo....rs

   Embora concorde com você, que existam outros compiladores que desemprenham o mesmo
papel que o Dev C++ e tals... Porém, para os fins que utilizo a programação, ao meu ver ainda não preciso de um outro compilador.

   Com relação ao modo de acessar a porta paralela, já fiz alguns projetos com motor DC e
felizmente ocorreu tudo bem, utilizo uma DLL (inpout32.dll) que carrega os modulos necessários para obter acesso a ela.

Desde já agradeço o interesse, Grande abraço.
Título: Re:Programa para Motor de Passo
Enviado por: minilathe em 16 de Dezembro de 2011, 08:20
Acho que o DEV C++ não é adequado para comandar um motor de passo, principalmente em altas velocidades. Testei o programa a seguir no BC 3.0 com Windows Vista e funcionou. O editor de mensagens do forum interpretou alguns carcteres, alterando o código visualizado, acho que agora vai aparecer corretamente.

outportb e sleeep são defindos na biblioteca DOS

======================================================
#include<stdio.h>
#include<dos.h>

main(){

unsigned char i, valor[]={0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09};

while (1){
   for (i = 0; i < 8; i++){
      outportb (0x378, valor[ i ] );
      printf( "%d - %d\n", i, valor[ i ] );
      sleep(500); //meio segundo
   }
}
}
Título: Re:Programa para Motor de Passo
Enviado por: JoãoFDS em 16 de Dezembro de 2011, 15:37
Muito obrigado a todos, em especial ao minilathe pela atenção e dicas.

Após bater a cabeça na parede, surgiu uma luz... consegui fazer o script.
fiz um laço para delay e outro para os pulsos, vou postar caso haja outros interessados.

//   ===============================================  //

#include <stdio.h>
#include <iostream>

//laço de delay

void espera(int tempo) {
     double i;
    for (i=1; i<=tempo; i++) {
    }
}

//laço de pulsos

int main()
{
    cin >> i;   
    while(i==1||i==0){
                           
              if(i==0){
              outportb (0x378, 0);} 
                           
              if(i==1){
                      outportb (0x378,1);
                      espera(1000000);
                      outportb (0x378,2);
                      espera(1000000);
                      outportb (0x378,4);
                      espera(1000000);
                      outportb (0x378,8);
                      espera(1000000);
                      }
                      }

return 0;
}
//   ===============================================  //

lembrando que meu sistema é WinXp então utilizei uma DLL (inpout32.dll) para obter acesso a porta.
mais informações ON Google.

Obrigado a todos.