Quadstepmotor-Treiber von Sparkfun und unterschiedliche Geschwindigkeit: Parallelitätsproblem?

Ich verwende ein Quadstepper-Motorboard von Sparkfun :

Geben Sie hier die Bildbeschreibung ein

mit Arduino Uno / Leonardo. Ich kann derzeit Motoren gleichzeitig ansteuern, aber ich kann die Geschwindigkeit nicht separat ändern.

Ich verwende diesen Code zum Antreiben von Motoren:

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

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

Aber wenn ich in meiner Hauptschleife so etwas habe:

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

Die Motoren laufen mit der gleichen Geschwindigkeit.

Ich denke, dies könnte sinnvoll sein, da delayMicrosecondsdie Funktion blockiert ist. IMHO sollte der Weg, sie mit unterschiedlicher Geschwindigkeit laufen zu lassen, über eine gleichzeitige Funktion nachdenken, aber ich bin kein Guru mit Mikrocontrollern, daher weiß ich nicht sehr gut, wie ich damit umgehen soll . Etwas Hilfe?

Antworten (1)

Sie haben Recht; ein Aufruf oneStepmuss vollständig abgeschlossen sein, bevor der andere ausgeführt wird. Sie können hier nicht so einfach Parallelität erreichen, da Sie kein Multitasking-Betriebssystem zur Verfügung haben. Sie müssen darüber nachdenken, wie Sie die Blockierung berücksichtigen und Ihren Code darum herum schreiben. Zustandsmaschinen sind hier normalerweise nützlich. Beispielsweise können Sie eine Funktion haben, die jeweils 100 Mikrosekunden zählt und Pin 6 jedes Mal umschaltet, aber Pin 8 jedes 6. Mal umschaltet. Das würde jedem Motor die Timings geben, die Sie loop()oben geschrieben haben. Es gibt viele Möglichkeiten, dies zu schreiben, je nachdem, wie die Dinge in den Rest Ihres Codes passen sollen. Nehmen wir an, Sie tun Folgendes:

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

Dann vielleicht:

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;
    }
}

Hier zählt die updateMotors-Funktion, wie viele 100-Mikrosekunden-Intervalle verstrichen sind, und ändert die Motoren entsprechend.