Arduino como controlador de motor paso a paso Deja un comentario

Este enfoque es un poco diferente. Aquí es posible hacer funcionar el motor una cantidad infinita en ambos sentidos. El potenciómetro controla la velocidad de marcha del motor y en qué dirección. Cuando el pote está centrado, el motor no se mueve.

#define DRIVER_STEP_PIN   10

#define DRIVER_DIR_PIN    9

#define DRIVER_EN_PIN     8

#define POT_PIN           A0

#define DEADZONE 50

#define MIN_DRIVER_PULSE_PERIOD_US  1000 //max speed

#define MAX_DRIVER_PULSE_PERIOD_US  3000 //min speed

enum Driver_pulse_state_enum {PULSE_IDLE, PULSE_HIGH, PULSE_LOW};

unsigned long time_now = 0;

uint16_t driver_pulse_hold_time_us = MIN_DRIVER_PULSE_PERIOD_US/2;

uint8_t driver_pulse_state = PULSE_IDLE;

int normalized_analog_value = 0;

uint8_t idle_flag = 1;

void setup() {

    pinMode(DRIVER_STEP_PIN, OUTPUT);

    pinMode(DRIVER_DIR_PIN, OUTPUT);

    pinMode(DRIVER_EN_PIN, OUTPUT);

    digitalWrite(DRIVER_EN_PIN, HIGH);

}

void loop() {

    normalized_analog_value = analogRead(POT_PIN) - 512;

    if(abs(normalized_analog_value)-DEADZONE < 0){

        idle_flag = 1;

    }

    else{

        idle_flag = 0;

    }

    driver_pulse_hold_time_us = map(abs(normalized_analog_value), DEADZONE, 512, MAX_DRIVER_PULSE_PERIOD_US, MIN_DRIVER_PULSE_PERIOD_US)/2;

    if(!idle_flag && driver_pulse_state == PULSE_IDLE){

        write_pulse_high();

    }

    if((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_LOW)){

        write_pulse_high();

    }

    if((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_HIGH)){

        write_pulse_low();

    }

}

void write_pulse_high(void){

    driver_pulse_state = PULSE_HIGH;

    if(normalized_analog_value > 0){

        digitalWrite(DRIVER_DIR_PIN, HIGH);

    }

    else if(normalized_analog_value < 0){

        digitalWrite(DRIVER_DIR_PIN, LOW);

    }

    digitalWrite(DRIVER_STEP_PIN, HIGH);

    time_now = micros();

}

void write_pulse_low(void){

    digitalWrite(DRIVER_STEP_PIN, LOW);

    time_now = micros();

    if(!idle_flag){

        driver_pulse_state = PULSE_LOW;

    }

    else{

        driver_pulse_state = PULSE_IDLE;

    }

}

Conclusiones

El filtrado de paso bajo de la señal analógica es casi crucial en este tipo de configuración, especialmente para el código de control de posición. Esto puede hacerse en hardware o en firmware (por ejemplo, utilizando un filtro de media móvil exponencial). Todavía no tenemos ninguna forma de aceleración en nuestro control de movimiento, por lo que los cambios de velocidad demasiado altos provocarán la pérdida de pasos.

El propósito de estos ejemplos de código es servir de inspiración para otros que están haciendo un proyecto que involucra el control de motores paso a paso. Hay muchas maneras de hacer esto, y probablemente sería mejor usar librerías de control de paso a paso y/o shields o módulos para un movimiento y control más seguro, más robusto y suave.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?