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)
1 Comentários
Fernando, será que não tem um erro nessa frase:
ResponderExcluir"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.