Timing Probleme mit Adafruit MotorShield V2, AccelStepper und 2 Schrittmotoren

Hallo zusammen,

ich sitze gerade an einem Projekt, bei dem ich zwei Schrittmotoren gleichzeitig betreiben will und bei dem es auf relativ genaues Timing ankommt. Ich nutze dazu neben der Adafruit MotorShield-Library die AccelStepper-Library. Hier zunächst mal der aufs nötigste reduzierte Code vor dem Loop:

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include <AccelStepper.h>
#include <VirtualWire.h>

byte circles = 20; // Anzahl der Rotor-Umdrehungen
byte orbTime = 20; // Gesamtzeit in Sekunden
byte circlesPerTurn = 40;


Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
Adafruit_StepperMotor *stepper1 = AFMS.getStepper(200, 1);
Adafruit_StepperMotor *stepper2 = AFMS.getStepper(200, 2);

unsigned long time = 0;

int rotoSteps;
float rotoSpeed;
float baseSteps;
float baseSpeed;

void forwardstep1(){
  stepper1->onestep(FORWARD, DOUBLE);
}

void backwardstep1(){
  stepper1->onestep(FORWARD, DOUBLE);
}

void forwardstep2(){
  stepper2->onestep(FORWARD, SINGLE);
}

void backwardstep2(){
  stepper2->onestep(FORWARD, SINGLE);
}

void releaseMotors(){
  stepper1->release();
  stepper2->release();
}

AccelStepper baseMotor(forwardstep1, backwardstep1);
AccelStepper rotoMotor(forwardstep2, backwardstep2);

void getMotorValues(){
  
  rotoSteps = circles * 200;
  rotoSpeed = rotoSteps / orbTime;

  baseSteps = rotoSteps / circlesPerTurn  ;
  baseSpeed = baseSteps / orbTime;
  
}

void setMotorValues(){

  baseMotor.setMaxSpeed(400);
  baseMotor.moveTo(baseSteps);
  baseMotor.setSpeed(baseSpeed);

  rotoMotor.setMaxSpeed(400);
  rotoMotor.moveTo(rotoSteps);
  rotoMotor.setSpeed(rotoSpeed);  
  
}

void setup(){
  AFMS.begin();
}

Führe ich den Loop nun folgendermaßen aus:

void loop(){

  getMotorValues();
  setMotorValues();
  
  while (rotoMotor.distanceToGo() > 0){

    rotoMotor.runSpeed(); 
 //   baseMotor.runSpeed();
    
  }
  
  releaseMotors();
  while(1);

}

und lasse mir vor und nach der while-Schleife die Zeiten ausgeben, komme ich zu folgendem Ergebnis:

start - 18ms
fertig - 20032ms

Eine Abweichung von 14ms über 20 Umdrehungen ist für mich noch im akzeptablen Bereich.

Lasse ich den zweiten Motor allerdings mitlaufen

void loop(){

  getMotorValues();
  setMotorValues();
  
  while (rotoMotor.distanceToGo() > 0){

    rotoMotor.runSpeed(); 
    baseMotor.runSpeed();
    
  }
  
  releaseMotors();
  while(1);

}

sieht die Sache leider schon ganz anders aus:

start - 18ms
fertig - 20326ms

Was kann ich gegen diese ~300ms Verzögerung tun?

Ich hatte ein bisschen Hoffnung, dass es vielleicht an den unterschiedlichen Schrittmodi liegen könnte - leider ist es das auch nicht.
Hier mal noch ein paar Zeitmessungen mit unterschiedlichen Modi (wobei die Zeiten jeweils identisch sind, daher in der gleichen Zeile mit +) und mit unterschiedlichen Bedingungen für die while-Schleife:

Beide Motoren (double/single + single/single), rotoMotor.distanceToGo:

start - 18ms
fertig - 20326ms

Beide Motoren (double/single), baseMotor.distanceToGo:

start - 18ms
fertig - 20312ms


rotoMotor (single):

start - 18ms
fertig - 20032ms

baseMotor (double + single):

start - 18ms
fertig - 20003ms

Hat jemand vielleicht zumindest eine Idee, woran es liegen könnte, damit ich mich an einer Lösung versuchen kann? Momentan bin ich völlig ratlos...

Zuerstmal ist
loat baseSteps;
als Float meines erachtens falsch benutzt. Du mußt ein INT oder eine LONG Typ nehmen.

Die Zeitunterschiede ergeben sich aus der Logik der Bibliothek die Du benutzt.
Analysiere mal wie die Bibliotek die Zeiten festlegt.

Es kann aber auch nur ein Fehler in der Zeitmessung sein.
Wie lange braucht die Schleife ohne Motoransteuerung?

Grüße Uwe

Danke für den Hinweis auf die falschen Typen, das ist wohl im Zuge des "Bastelns" irgendwo mal verloren gegangen...

Ich habe das Problem inzwischen drastisch reduzieren können, indem ich die Frequenz des i2c erhöht habe, wie hier in der letzten Antwort beschrieben: FAQ | Adafruit Motor Shield V2 | Adafruit Learning System