Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Motor de passo com aceleração suave


Já tem um tempo que não falo de motor de passo, então, hoje vamos tratar de algo importantíssimo para a vida útil da máquina que você vai fazer: o funcionamento de uma aceleração Sigmoidal para motores de passo. Confira!


 

 

RECURSOS USADOS

  • 1x Arduino Uno.
  • 1x Driver de Motor de Passo DRV8825
  • 1x Motor de Passo Nema 17
  • 1x Fonte Chaveada 12V (de pelo menos 5A).

 

 

O QUE É UMA CURVA SIGMOIDAL?

Função Sigmoide

A curva sigmoidal é o resultado da função Sigmoide, uma função matemática de amplo uso em campos como a economia e computação.

Usaremos essa função para criar uma aceleração variável durante o movimento. A aceleração começará baixa no início, chegando na máxima no meio do movimento e terminando baixa no fim.


 

 

MONTAGEM


 

 

FUNÇÃO SIGMÓIDE

Explicando o código:

#include <math.h>

#define EN 2
#define STP 3
#define DIR 4

#define E 2.71828182845904523536 //numero de Euler

//Período máximo do passo do motor
double p_maximo = 600;
//Período mínimo do passo do motor
double p_minimo = 100;
//define a direção do motor
int direcao = 1;
//determina se a curva será de aceleração (1) ou desaceleração (-1)
double vetor_aceleracao = 1;
//amplitude usada na equação de aceleração
double amplitude = p_maximo - p_minimo;
//determina a inclinação da curva de aceleração, o quão rápido o motor irá acelerar
double declividade =  0.1;
//Metade do número de passos (iterações) que o motor precisará para acelerar
double x_medio = 0;



  //Equação usada para determinar a metade do número total de passos (iterações) necessários para o movimento de aceleração
  x_medio = ((-1)*log( amplitude / ((p_maximo*0.99999) - p_minimo) -1)) / declividade;
  //É necessário recalcular a cada mudança de parâmetros de aceleração, como velocidade máxima, minima e/ou declividade
  



//Função necessária para calcular o período do passo do motor a cada iteração do loop (for)
double calculo_do_instante(int i){
  
  double instante = ( amplitude / ( 1 + pow( E , (vetor_aceleracao * (declividade * (i - x_medio) ) ) ) ) ) + p_minimo;
  return instante;
  
}



Loop de Aceleração:

void loop(){

   vetor_aceleracao = 1;

  //Loop da aceleração, onde será gerado os pulsos para o driver DRV8825
  //Acelera o motor com período de 600 microssegundos para 100 microssegundos usando a curva sigmoidal
  for(int i=0;i<(x_medio*2);i++)
  {
    digitalWrite(STP, 1);
    delayMicroseconds(4);
    digitalWrite(STP, 0);
    delayMicroseconds(calculo_do_instante(i));
    
  }


 

Loop de Desaceleração:

  vetor_aceleracao = -1;

  //Desacelera o motor com período de 100 microssegundos para 600 microssegundos usando a curva sigmoidal
  for(int i=0;i<(x_medio*2);i++)
  {
    digitalWrite(STP, 1);
    delayMicroseconds(4);
    digitalWrite(STP, 0);
    delayMicroseconds(calculo_do_instante(i));
    
  }


 

Resultado:

(Valores retirados da serial do Arduino)


 


FAÇA O DOWNLOAD DOS ARQUIVOS:

 

 

 


Postar um comentário

1 Comentários

  1. Fernando, será que não tem um erro nessa frase:
    "aceleração começará baixa no início, chegando na máxima no meio do movimento e terminando baixa no fim." ?
    Vendo o resto do texto e o código dá pra ver que a aceleração é somente até chegar na velocidade final.
    Achei estranho a parte em que fala que ao fim do movimento a aceleracao termina baixa.
    Deveria ser aceleracao baixa no inicio do movimento até chegar na velocidade máxima, depois mantém na velocidade máxima (e nesse ponto a aceleração é zero) e perto do fim do movimento a aceleracao é negativa, ou seja, a velocidade vai diminuindo... gradativamente para evitar uma parada brusca.

    ResponderExcluir