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?