domingo, 24 de fevereiro de 2013

Como calcular o tempo para gerar passos em motores de passo

A biblioteca do motor de passo do Arduino apresenta o passo completo 2 conforme abaixo:
Passo completo 1 (Full-step)
-Somente uma bobina é energizada a cada passo;
-Menor torque;
-Pouco consumo de energia;
-Maior velocidade.
Passo completo 2 (Full-step)
-Duas bobinas são energizadas a cada passo;
-Maior torque;
-Consome mais energia que o Passo completo 1;
-Maior velocidade.
Meio passo (Half-step)
-A combinação do passo completo1 e do passo completo 2  gera um efeito de meio passo;
-Consome mais energia que os passo anteriores;
-É muito mais preciso que os passos anteriores;
-O torque é próximo ao do Passo completo 2;
-A velocidade é menor que as dos passos anteriores.
Fonte: http://www.rogercom.com/pparalela/IntroMotorPasso.htm

Ou seja, apresenta a seguinte sequência para os passos:


Step C0 C1 C2 C3
     1  1  0  1  0
     2  0  1  1  0
     3  0  1  0  1
     4  1  0  0  1

Fonte: Biblioteca Stepper Motor do Arduino

Neste caso temos sempre 2 bobinas acionadas, o que consome mais energia durante o funcionamento. Para evitar este consumo é preciso reduzir os passos ao passo completo 1:

Step C0 C1 C2 C3
     1  1  0  0  0
     2  0  1  0  0
     3  0  0  1  0
     4  0  0  0  1

Mas para isso se faz necessário a criação de um programa de passos para acionamento do motor, conforme modelo abaixo:

/* Este código permite o passo de 1 motor - PASSO 1*/
//motor direito
int motorPin1 = 7;
int motorPin2 = 8;
int motorPin3 = 3;
int motorPin4 = 4;

int tempopasso = 3000;

void setup() {
  //configura os pinos digitais do motor direito
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  
}

void loop() {
//motor direito
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay (tempopasso);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay (tempopasso);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay (tempopasso);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay (tempopasso);
  } 

O problema está no cálculo do tempo de passo, que não pode ser menor que 10ms. Sabendo os valores máximos de RPM e step do motor, que podem ser obtidos usando o programa stepper_oneStepAtATime (examples - stepper) basta usar a fórmula abaixo para o cálculo:

Exemplo:
RPM = 100
Passos = 48 (Step 7,5º)
Para tanto pode-se construir uma função:
int rpm = 100;
int passos = 48;
int tempo;
tempo passo = rpm/(passos*60)

Com essa função podemos usar todos os tipos de passo (passo 1, 2 e meio passo, basta modificar os HIGH e LOW dos pinos abaixo. O código final fica assim:

/* Este código permite o passo de 1 motor - PASSO 1*/
//motor direito
int motorPin1 = 7;
int motorPin2 = 8;
int motorPin3 = 3;
int motorPin4 = 4;

void setup() {
  //configura os pinos digitais do motor direito
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  
}

void loop() {
//insere a função
int rpm = 100;
int passos = 48;
int tempopasso = rpm/(passos*60);

  //motor direito
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay (tempopasso);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay (tempopasso);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay (tempopasso);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay (tempopasso);
  } 




Um comentário:

  1. Voltei a escola ao 58 anos de idade ,fiz varios cursos ao 63 anos me formei Técnico Mecatrônica. Ao 64 anos terminei a Faculdade Cursos de Tecnologia de Fabricação Mecanica. Imagine depois de 40 anos cem frequentar escola , o que eu deixei de aprender, quantas coisas ficou para traz. Procurando este assunto no dia 21/01/2021 muito interessante
    e era o que preciso para eu aprender mais algumas sobre motor de passo e arduino. EU Teria muito coisas a dizer mas terminarei agradecendo por ter deixado ate hoje na Internet .
    MEU MUITO OBRIGADO

    ResponderExcluir