As I mentioned in #2 AccelStepper has two modes which are easy to confuse. AccelStepper tries to detect internally which mode is in use. If you call moveTo() it thinks you are in position mode, and calling runSpeed() gives incorrect results (wrong speed).
Inside AccelStepper, run() calls runSpeed() to do the stepping; calling runSpeed() directly bypasses the acceleration calculation.
Internally, MultiStepper just calls runSpeed() for each stepper.
distanceToGo() can go negative if you keep calling runSpeed();
So anyway, I tested the following code and I believe it does what you want. Each stepper moves at the programmed speed, and for only the number of steps required. I made an assumption that all the steppers are moving in a positive direction.
#include <AccelStepper.h>
#define HAVE_X
#define HAVE_Y
#define HAVE_Z
// For Arduino Uno + CNC shield V3
#define MOTOR_X_ENABLE_PIN 8
#define MOTOR_X_STEP_PIN 2
#define MOTOR_X_DIR_PIN 5
#define MOTOR_Y_ENABLE_PIN 8
#define MOTOR_Y_STEP_PIN 3
#define MOTOR_Y_DIR_PIN 6
#define MOTOR_Z_ENABLE_PIN 8
#define MOTOR_Z_STEP_PIN 4
#define MOTOR_Z_DIR_PIN 7
#define MOTOR_A_ENABLE_PIN 8
#define MOTOR_A_STEP_PIN 12
#define MOTOR_A_DIR_PIN 13
AccelStepper motorX(AccelStepper::DRIVER, MOTOR_X_STEP_PIN, MOTOR_X_DIR_PIN);
AccelStepper motorY(AccelStepper::DRIVER, MOTOR_Y_STEP_PIN, MOTOR_Y_DIR_PIN);
AccelStepper motorZ(AccelStepper::DRIVER, MOTOR_Z_STEP_PIN, MOTOR_Z_DIR_PIN);
float max_accel = 1e6f;
float max_speed = 1e9f; // steps per sec
float speed = 500.0f;
void run_steppers(AccelStepper stepper_a1 , AccelStepper stepper_a2, AccelStepper stepper_a3, int steps[3])
{
Serial.print("Called!");
//digitalWrite(dir1, LOW);
//digitalWrite(dir2, LOW);
//digitalWrite(dir3, LOW);
stepper_a1.setSpeed(speed);
stepper_a2.setSpeed(speed);
stepper_a3.setSpeed(speed);
Serial.println(steps[0]);
Serial.println(steps[1]);
Serial.println(steps[2]);
int running = 7;
while (running != 0)
{
if (stepper_a1.currentPosition () == steps[0])
running &= ~1;
else
stepper_a1.runSpeed();
if (stepper_a2.currentPosition () == steps[1])
running &= ~2;
else
stepper_a2.runSpeed();
if (stepper_a3.currentPosition () == steps[2])
running &= ~4;
else
stepper_a3.runSpeed();
}
stepper_a1.setCurrentPosition(0);
stepper_a2.setCurrentPosition(0);
stepper_a3.setCurrentPosition(0);
}
void setup()
{
Serial.begin(115200);
Serial.println("CNC shield test");
#ifdef HAVE_X
pinMode(MOTOR_X_ENABLE_PIN, OUTPUT);
motorX.setEnablePin(MOTOR_X_ENABLE_PIN);
motorX.setPinsInverted(false, false, true);
motorX.setAcceleration(max_accel);
motorX.setMaxSpeed(max_speed);
motorX.setSpeed(max_speed);
motorX.enableOutputs();
#endif
#ifdef HAVE_Y
pinMode(MOTOR_Y_ENABLE_PIN, OUTPUT);
motorY.setEnablePin(MOTOR_Y_ENABLE_PIN);
motorY.setPinsInverted(false, false, true);
motorY.setAcceleration(max_accel);
motorY.setMaxSpeed(max_speed);
motorY.enableOutputs();
#endif
#ifdef HAVE_Z
pinMode(MOTOR_Z_ENABLE_PIN, OUTPUT);
motorZ.setEnablePin(MOTOR_Z_ENABLE_PIN);
motorZ.setPinsInverted(false, false, true);
motorZ.setAcceleration(max_accel);
motorZ.setMaxSpeed(max_speed);
motorZ.enableOutputs();
#endif
}
void loop()
{
int steps[3];
steps[0] = 100;
steps[1] = 200;
steps[2] = 300;
run_steppers (motorX, motorY, motorZ, steps);
delay (500);
}