Autor Tópico: Programa para Motor de Passo  (Lida 9298 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline JoãoFDS

  • Novato
  • *
  • Posts: 9
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Palmas/TO
  • Nome:: João Ferreira
  • Profissão: Técnico Mecatrônico/Informática
Programa para Motor de Passo
« Online: 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.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Programa para Motor de Passo
« Resposta #1 Online: 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
   }
}

Offline JoãoFDS

  • Novato
  • *
  • Posts: 9
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Palmas/TO
  • Nome:: João Ferreira
  • Profissão: Técnico Mecatrônico/Informática
Re:Programa para Motor de Passo
« Resposta #2 Online: 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.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Programa para Motor de Passo
« Resposta #3 Online: 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.

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re:Programa para Motor de Passo
« Resposta #4 Online: 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/

Citar
aguardo soluções inteligentes.

Nós tb ... ;D
« Última modificação: 15 de Dezembro de 2011, 23:23 por C N C N o w ! »

Offline JoãoFDS

  • Novato
  • *
  • Posts: 9
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Palmas/TO
  • Nome:: João Ferreira
  • Profissão: Técnico Mecatrônico/Informática
Re:Programa para Motor de Passo
« Resposta #5 Online: 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.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Programa para Motor de Passo
« Resposta #6 Online: 16 de Dezembro de 2011, 00:12 »
Qual comando não compilou? Ou deu erro?


Offline JoãoFDS

  • Novato
  • *
  • Posts: 9
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Palmas/TO
  • Nome:: João Ferreira
  • Profissão: Técnico Mecatrônico/Informática
Re:Programa para Motor de Passo
« Resposta #7 Online: 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.

Offline rymaeda

  • Fuso
  • **
  • Posts: 238
  • Sexo: Masculino
  • Inkscape-Cambam-KiCAD-LibreCAD-LinuxCNC-ViaCAD
Re:Programa para Motor de Passo
« Resposta #8 Online: 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

Offline JoãoFDS

  • Novato
  • *
  • Posts: 9
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Palmas/TO
  • Nome:: João Ferreira
  • Profissão: Técnico Mecatrônico/Informática
Re:Programa para Motor de Passo
« Resposta #9 Online: 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.

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:Programa para Motor de Passo
« Resposta #10 Online: 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
   }
}
}
« Última modificação: 16 de Dezembro de 2011, 08:22 por minilathe »

Offline JoãoFDS

  • Novato
  • *
  • Posts: 9
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Palmas/TO
  • Nome:: João Ferreira
  • Profissão: Técnico Mecatrônico/Informática
Re:Programa para Motor de Passo
« Resposta #11 Online: 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.

 

/** * */