• Welcome to LusoRobótica - Robótica em Português.
 

Motores de Passo

Started by fabio.sales, 02 de June de 2011, 13:36

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

fabio.sales

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

#16
Quote from: fabio.sales on 02 de June de 2011, 13:36
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.


/*===================================================================================
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


fabio.sales

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

#18
Quote from: fabio.sales on 14 de June 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.

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

fabio.sales

vou tentar fazer isso. vlw. ;)