I am currently working on a project which runs 2 steppermotors and relies on (at least nearly) precise timing. I am using a AFMS V2 and the AccelStepper lib, running on an Atmega328 mounted on the shield. Here's the code before the loop:
Code: Select all
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include <AccelStepper.h>
#include <VirtualWire.h>
byte circles = 20; // number of rotor rotations
byte orbTime = 20; // overall time in seconds
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();
}
Code: Select all
void loop(){
getMotorValues();
setMotorValues();
while (rotoMotor.distanceToGo() > 0){
rotoMotor.runSpeed();
// baseMotor.runSpeed();
}
releaseMotors();
while(1);
}
Code: Select all
start - 18ms
finish - 20032ms
But if I let the second stepper run as well
Code: Select all
void loop(){
getMotorValues();
setMotorValues();
while (rotoMotor.distanceToGo() > 0){
rotoMotor.runSpeed();
baseMotor.runSpeed();
}
releaseMotors();
while(1);
}
Code: Select all
start - 18ms
finish - 20326ms
I'm not even sure where the problem really comes from - is it the library, is it some error in my code, something wrong with my concept?
Any help would be much appreciated!