collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Motores de Passo  (Lida 8598 vezes)

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

Offline fabio.sales

  • Mini Robot
  • *
  • Mensagens: 36
Re: Motores de Passo
« Responder #15 em: 02 de Junho de 2011, 19:52 »
Acho que esta errado!Pelo que eu entendi a primeira declaração no vetor é para indicar quantos fios ou pinos será usado nesse motor:
AccelStepper stepper1; // Defaults to 4 pins on 2, 3, 4, 5
AccelStepper stepper2(4, 6, 7, 8, 9);
AccelStepper stepper3(2, 10, 11);

motor 1 usara 4 pinos são eles(2,3,4,5)
motor 2 usara 4 pinos são eles(6,7,8,9)
motor 3 usara 2 pinos são eles(10,11)
  ;)

StarRider

  • Visitante
Re: Motores de Passo
« Responder #16 em: 11 de Junho de 2011, 02:55 »
Bom dia pessoal sou novo aq no forum, então me ajudem a resolver essa.
Minha intenção é controlar 2 motores de passo simultaneamente, pois usarei em um robo controlado por controle remoto(TV).
Uso a biblioteca #include <Stepper.h> padrão do arduino, mas o problema é que ela só controla um motor por vez e não os dois ao mesmo tempo. ALGUEM TEM A SOLUÇÂO?!!!

Boas,

Sabes qual é a melhor solução ? ESQUECER esse tal arduino e manipular o uC usando os registos do mesmo !!!!

Ok, sei que não contribui em nada para resolver o teu problema ... mas hoje apeteceu-me bater no arduino ;)

Mover um stepper com o ULN 2803 é estupidamente fácil, basta meia dúzia de linhas de código ... aqui fica um exemplo
que serve para controlar 4 motores usando duas portas (16 pins), mas que pode ser facilmente encurtado para usar
somente uma porta e controlar 2 steppers.


Código: [Seleccione]
/*===================================================================================
Project : FFBox
Date    : 16-01-2003
Author  : Paulo d'Almeida
Comments: Stepper driver for AVR
====================================================================================*/

//----- Local vars
//
char Seqindex0=0,Seqindex1=0,Seqindex2=0,Seqindex3=0;
unsigned char SeqMaskLOW[4] = {0b00001001 ,0b00001010 ,0b00000110 ,0b00000101};
unsigned char SeqMaskHI[4] = {0b10010000 ,0b10100000 ,0b01100000 ,0b01010000};

//==============================================================================
//----- Funcs

//------------------------------------------------------------------------------
//
// Stepper 0 - PORTC - LOW_NIBLE
// Stepper 1 - PORTC - HI_NIBLE
// Stepper 2 - PORTA - HI_NIBLE
// Stepper 3 - PORTA - LOW_NIBLE
//
void Stepper_Step(char astepper,unsigned char dir)
{
   if (astepper==0)         
      Stepper0_Step(dir);
   else if (astepper==1)
      Stepper1_Step(dir);
   else if (astepper==2)
      Stepper2_Step(dir);
   else if (astepper==3)
      Stepper3_Step(dir);
}
//------------------------------------------------------------------------------
void Stepper0_Step(unsigned char dir)
{
   if (dir)   // DIR_CW > 0
   Seqindex0++;
else
   Seqindex0--;

if (Seqindex0<0)
   Seqindex0=3;
else if (Seqindex0>3)
   Seqindex0=0;                                                 

   PORTC = (PORTC & 0xf0) | SeqMaskLOW[Seqindex0];

}
//------------------------------------------------------------------------------
void Stepper1_Step(unsigned char dir)
{
   if (dir)   // DIR_CW > 0
   Seqindex1++;
else
   Seqindex1--;

if (Seqindex1<0)
   Seqindex1=3;
else if (Seqindex1>3)
   Seqindex1=0;                                                 

   PORTC = (PORTC & 0x0f) | SeqMaskHI[Seqindex1];
}
//------------------------------------------------------------------------------
void Stepper2_Step(unsigned char dir)
{
   if (dir) //DIR_CW > 0
   Seqindex2++;
else
   Seqindex2--;

if (Seqindex2<0)
   Seqindex2=3;
else if (Seqindex2>3)
   Seqindex2=0;                                                 

   PORTA = (PORTA & 0x0f) | SeqMaskHI[Seqindex2];
}
//------------------------------------------------------------------------------
void Stepper3_Step(unsigned char dir)
{
   if (dir) //DIR_CW > 0
   Seqindex3++;
else
   Seqindex3--;

if (Seqindex3<0)
   Seqindex3=3;
else if (Seqindex3>3)
   Seqindex3=0;                                                 

   PORTA = (PORTA & 0xf0) | SeqMaskLOW[Seqindex3];
}
//------------------------------------------------------------------------------
//
void Steppers_Unenergize(void)
{
/*
   PORTC = (PORTC & 0xf0);
   PORTC = (PORTC & 0x0f);
   PORTA = (PORTA & 0x0f);
   PORTA = (PORTA & 0xf0);
*/
   PORTC = 0x00;
   PORTA = 0x00;
}       
//------------------------------------------------------------------------------
//
void Stepper_BatchStep(char astepper,char dir, int steps)
{     
char acel=50;

while(steps && acel) {
    steps--;                         
    Stepper_Step(astepper,dir);
           delay_ms(4);
            acel--;
}
while(steps) {
steps--;                         
Stepper_Step(astepper,dir);
                delay_ms(2);
}
}
//------------------------------------------------------------------------------



Abraços,
PA

« Última modificação: 11 de Junho de 2011, 03:22 por StarRider »

Offline fabio.sales

  • Mini Robot
  • *
  • Mensagens: 36
Re: Motores de Passo
« Responder #17 em: 14 de Junho de 2011, 12:53 »
Bom dia.
Realmente é facil controlar o Motor usando o ULN 2803. Vlw pelo codigo, mas manipular é dos menores problemas, o meu maior problema é controlar a velocidade de um motor sem afetar a velocidade de um outro motor. Essa parte do meu projeto sera aplicada ao movimento de um carro, que apenas usara dois motores de passo para isso. Grato pela a ajuda.

StarRider

  • Visitante
Re: Motores de Passo
« Responder #18 em: 20 de Junho de 2011, 13:12 »
Bom dia.
Realmente é facil controlar o Motor usando o ULN 2803. Vlw pelo codigo, mas manipular é dos menores problemas, o meu maior problema é controlar a velocidade de um motor sem afetar a velocidade de um outro motor. Essa parte do meu projeto sera aplicada ao movimento de um carro, que apenas usara dois motores de passo para isso. Grato pela a ajuda.

Boas fabio,

Para controlar a velocidade tens que usar um temporizador e avançar um passo a uma determina frequência,  frequência essa que
controlas manipulando o duty de um timer.

Ou seja, configuras um timer e usar o interrupt da comparação para fazer avançar um passo do motor, se a velocidade de
cada motor for diferente entre si tens que usar dois comparadores.

O código para fazer avançar um passo que vais usar dentro do interrupt deve ser compacto e directo, por isso o melhor é
mesmo manipular as portas (como no meu exemplo) em vez de usar a lib do arduino.

Mesmo usando o arduino podes sempre usar código de mais baixo nível para controlar e manipular os registos do AVR

Abraços,
PA
« Última modificação: 22 de Junho de 2011, 02:51 por StarRider »

Offline fabio.sales

  • Mini Robot
  • *
  • Mensagens: 36
Re: Motores de Passo
« Responder #19 em: 27 de Junho de 2011, 19:40 »
vou tentar fazer isso. vlw. ;)