Fork me on GitHub

23/06/13

PIC: Motor de Passo

PIC: Motor de Passo



Os Motores de Passo são dispositivos eletromecânicos que convertem pulsos elétricos em movimentos mecânicos que geram variações angulares discretas.

O rotor ou eixo de um motor de passo é rotacionado em pequenos incrementos angulares, denominados “passos”, quando pulsos elétricos são aplicados em uma determinada sequência nos terminais deste.

A rotação de tais motores é diretamente relacionada aos impulsos elétricos que são recebidos, bem como a sequência a qual tais pulsos são aplicados reflete diretamente na direção a qual o motor gira.

A velocidade que o rotor gira é dada pela frequência de pulsos recebidos e o tamanho do ângulo rotacionado é diretamente relacionado com o número de pulsos aplicados.

Existem dois tipos básicos de motores de passo: bipolar e unipolar. Eles podem ter 4, 5, 6 ou 8 fios.

UNIPOLAR
Possui uma derivação entre o enrolamento de duas bobinas. É mais fácil de ser controlado, porém, possui menor torque do que o motor de passo bipolar. Podem ter 5 ou 6 fios.




Utiliza-se o driver ULN2003 para controlar este motor de passo. Uma característica importante do ULN2003 é que seu uso se restringe a motores de passo unipolares.



Motores de passo unipolares possuem um ou dois fios de derivação, que devem ser conectados a fonte de tensão. Os demais fios devem ser conectados às saídas do ULN2003.



BIPOLAR
Os motores bipolares são constituídos por bobinas sem derivação central. Por este fato, estas bobinas devem ser energizadas de tal forma que a corrente elétrica flua na direção inversa a cada dois passos para permitir o movimento contínuo do rotor, ou seja, a polaridade deve ser invertida durante o funcionamento do motor.

Possuem excelente relação tamanho/torque: eles proporcionam um maior torque, cerca de 40% a mais, comparativamente a um motor unipolar do mesmo tamanho. Isto se deve ao fato de que quando se energiza uma fase, se magnetiza ambos os polos da bobina. Assim, o rotor sofre a ação de forças magnéticas de ambos os polos, ao invés de apenas um, como acontece no motor unipolar.
O L293D é um circuito integrado de ponte-H. Com ele é possível controlar motores DC e motores de passo. Com o L293D você pode utilizar um motor de passo de no máximo 600mA e 36V de alimentação.

Os pinos EN1 e EN2 do L293D, tem a função de habilitar as saídas. Quando em nível lógico alto, mantém as saídas ativas, quando em nível lógico baixo, as saídas possuem alta impedância. É conectado no PIC.

Existem 3 sequências para fazer o controle, e que podem ser usadas tanto para o motor de passo unipolar, quanto para o bipolar:

Wave Step: Consome o mínimo de energia. Apenas uma das fases é energizado de cada vez. Garante precisão posicional independentemente de qualquer desequilíbrio do enrolamento do motor.
Full Step: Esta sequência energiza duas fases adjacentes, que oferece um melhor relação torque-velocidade.
Half Step: Duplica efetivamente a resolução do motor. Esta sequência reduz a ressonância do motor, que pode às vezes causar um motor a parar em uma frequência de ressonância particular. Note-se que esta sequência é de 8 etapas.

BIBLIOTECA: 

Stepper_setSequence( type ) - Define uma sequencia;


Stepper_Speed(  nSteps, rpm ) - Define a velocidade do motor;

nSteps - é o numero de passos necessário para q o motor possa dar um giro completo. Pode-se calcular dividindo 360 pela precisão do motor;


Stepper_Step( direcao ) - Move um passo para a direita ou esquerda.

MikroC PRO PIC
char WaveStep[] = {4, 0b0001, 0b0010, 0b0100, 0b1000};
char FullStep[] = {4, 0b0011, 0b0110, 0b1100, 0b1001};
char HalfStep[] = {8, 0b0001, 0b0011, 0b0010, 0b0110, 0b00100, 0b1100, 0b1000, 0b1001};

//configuração do Motor de passo
//Configura os pinos de saida
sbit Pin1 at RB0_bit;
sbit Pin2 at RB1_bit;
sbit Pin3 at RB2_bit;
sbit Pin4 at RB3_bit;
//Configura a direção dos pinos
sbit Pin1_Direction at TRISB0_bit;
sbit Pin2_Direction at TRISB1_bit;
sbit Pin3_Direction at TRISB2_bit;
sbit Pin4_Direction at TRISB3_bit;

unsigned int delay = 0;
char *type;
#define LEFT 1
#define RIGHT 0

void Stepper_setSequence(char *type_)
{
 Pin1_Direction = 0;
 Pin2_Direction = 0;
 Pin3_Direction = 0;
 Pin4_Direction = 0;
 type = type_;
}

void Stepper_Speed(unsigned nSteps, char rpm)
{
   delay = 60000 / (nSteps * rpm);
}

void Stepper_Step(char direcao)
{
static unsigned stepCount = 0;
char len = type[0];
char val = type[(stepCount % len) + 1];

    if(direcao== 0)
     stepCount++;
    else
     stepCount--;

    Pin4 = val.F3;
    Pin3 = val.F2;
    Pin2 = val.F1;
    Pin1 = val.F0;
    
    VDelay_ms(delay);
}

EXEMPLO:
//Copie e cole o código da biblioteca aqui!!!

void main()
{
//nSteps = 360/precisão(°)
Stepper_Speed(72, 2);
Stepper_setSequence(WaveStep);
   
   while(1)
   {
      Stepper_Step(LEFT); //move um passo para a direita
   }
}

DOWNLOAD:
Projeto: Motor-de-passo.rar

15 comentários:

  1. Ótimos posts. Uma outra sugestão seria um projetinho com PIC(16F628A), Sensor Ultrasonico (HC-SR04) e um display LCD. Ate que tem material na net, mas é muito para arduino e poucos explicam como você detalha as coisas.

    Valeu!!!

    ResponderExcluir
  2. Ótimo posts. mas você saber como utilizar as instruções "sbit" pois fique na duvida, quando utilizo a função LCD ela montar os pinos para função sem eu ter que abri o .h da biblioteca mas no caso da suas funções tenho que modificar os pino no .h mesmo você utilizado ele??

    ResponderExcluir
    Respostas
    1. Voce pode colocar na biblioteca assim:
      extern sfr sbit Pin1;

      Depois no código você coloca:
      sbit Pin1 at RB0_Bit;

      Excluir
  3. ola
    qual circuito integrado eu poderia usar para um motor de passo de oito fios e dois amperes?
    obrigado.

    ResponderExcluir
  4. Ola, e se eu quisesse fazer ele rodar para o outro lado, como ficaria a programação ?

    ResponderExcluir
    Respostas
    1. while(1)
      {
      Stepper_Step(RIGHT); //move um passo para a esquerda
      }

      Excluir
  5. Boa tarde, fui tentar compilar o mesmo programa baixado e deu erro na linha 3 o que fazer?

    ResponderExcluir
  6. Bom dia amigo, há tempos eu acompanho seu blog, quero parabeniza-lo pelo belo trabalho, gostaria de saber qual compilador amigo usa para seus projetos ?

    ResponderExcluir
  7. da para controla dois motor de passo com esse esquema?

    ResponderExcluir
  8. O tipo de instrução (type=type_ ) o que faz?

    ResponderExcluir
  9. Por favor, oque estes comandos fazem ?????????

    Pin4 = val.F3;
    Pin3 = val.F2;
    Pin2 = val.F1;
    Pin1 = val.F0;

    ResponderExcluir
    Respostas
    1. "Pin4 = val.F3;" copia o valor do bit 3 da variavel "val" para Pin4.

      Excluir
  10. Como fazer para que fique parado no passo desejado ???
    Quero que no passo 128 ele pare ?

    ResponderExcluir

Postagens Relacionadas!!