Controlador de Quadstepmotor de Sparkfun y velocidad diferente: ¿problema de concurrencia?

1

Estoy usando placa de motor quadstepper de Sparkfun :

con Arduino Uno / Leonardo. Actualmente puedo manejar motores al mismo tiempo, pero no puedo cambiar la velocidad por separado.

Uso este código para los motores de accionamiento:

void oneStep(int STEP_PIN, int delay_velocity) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(delay_velocity); 

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(delay_velocity);
}

Pero si en mi bucle principal tengo algo como:

void loop() {
    oneStep(6, 100);
    oneStep(8, 600);
} 

los motores funcionan con la misma velocidad.

Creo que esto podría tener sentido porque delayMicroseconds está bloqueando la función, por lo que, en mi humilde opinión, la manera de hacer que funcionen con diferente velocidad debería estar pensando en alguna función concurrente, pero no soy un gurú con microcontroladores, así que no sé Muy bien como manejar esto. ¿Alguna ayuda?

    
pregunta nkint

1 respuesta

2

Tienes razón; una llamada a oneStep debe completarse completamente antes de que la otra se ejecute. No puede obtener la concurrencia muy fácilmente aquí, ya que no tiene un sistema operativo multitarea disponible. Tendrá que pensar en cómo explicar el bloqueo y escribir su código alrededor de eso. Las máquinas de estado suelen ser útiles aquí. Por ejemplo, puede tener una función que cuenta 100 microsegundos a la vez, y alternar el pin 6 cada vez, pero alternar el pin 8 cada 6ª vez. Eso le daría a cada motor los tiempos que escribiste en loop() arriba. Hay muchas maneras de escribir esto, dependiendo de cómo necesite que las cosas encajen en el resto de su código. Digamos que haces algo como:

while (1) {
    loop();  /* call loop forever */
}

Entonces tal vez:

void loop(void) {
    delayMicroseconds(100);
    updateMotors();
}

void updateMotors(void) {
    static int motorA_count = 0;
    static int motorB_count = 0;

    motorA_count++;
    if (motorA_count == 1) {
        digitalWrite(6, HIGH);
    }
    if (motorA_count == 2) {
        digitalWrite(6, LOW);
        motorA_count = 0;
    }

    motorB_count++;
    if (motorB_count == 6) {
        digitalWrite(8, HIGH);
    }
    if (motorB_count == 12) {
        digitalWrite(8, LOW);
        motorB_count = 0;
    }
}

Aquí, la función updateMotors es mantener un conteo de los intervalos de 100 microsegundos y cambiar los motores en consecuencia.

    
respondido por el Jim Paris

Lea otras preguntas en las etiquetas