首页 > 解决方案 > 多个具有相同执行时间的滚珠丝锥联动步进电机的并行访问

问题描述

我正在尝试编写一个 3 轴运动步进连杆滚珠丝杠设置,我的输入是 xdistance to move、ydistance to move、z distance to move、持续时间和执行循环时间。我需要将具有相同开始时间和停止时间的 3axis 移动在一起。

我写了下面的代码

x移动距离= 40mm

y移动距离= 10mm

z 移动距离 = 5mm

持续时间 = 4 秒

执行的循环时间数 = 2

我面临一个问题,即所有三个步进电机的启动和停止时间都相同,而所有的移动距离都不同。但是根据我的代码,它应该同时启动和停止,如果距离不同,则移动速度会相应变化。

int t = 4;
int xDist = 40;
const int xPitch = 5;
const int xStepsPerRevolution = 200;
float x_STEP_PERIOD_MS, x_STEP_PERIOD_MS1;
int x_STEPS_NOS = 0;
int x_STEPS_NOS1 = 0;
const int x_STEP_PIN = 5;
const int x_DIR_PIN = 3;
unsigned long xNextStepTime, xNextStepTime1;
volatile int xflag = 1;
volatile int xbackward_finished = 0;
int yDist = 10;
const int yPitch = 5;
const int yStepsPerRevolution = 200;
float y_STEP_PERIOD_MS, y_STEP_PERIOD_MS1;
int y_STEPS_NOS = 0;
int y_STEPS_NOS1 = 0;
const int y_STEP_PIN = 9;
const int y_DIR_PIN = 7;
unsigned long yNextStepTime, yNextStepTime1;
volatile int yflag = 1;
volatile int ybackward_finished = 0;
int zDist = 5;
const int zPitch = 10;
const int zStepsPerRevolution = 400;
float z_STEP_PERIOD_MS, z_STEP_PERIOD_MS1;
int z_STEPS_NOS = 0;
int z_STEPS_NOS1 = 0;
const int z_STEP_PIN = 11;
const int z_DIR_PIN = 13;
unsigned long zNextStepTime, zNextStepTime1;
volatile int zflag = 1;
volatile int zbackward_finished = 0;
int no_of_times=2;
void setup()
{
  pinMode(x_STEP_PIN, OUTPUT);
  digitalWrite(x_STEP_PIN, LOW);
  pinMode(x_DIR_PIN, OUTPUT);
  pinMode(A1, INPUT_PULLUP);
  pinMode(A2, INPUT_PULLUP);
  xNextStepTime = millis();
  xNextStepTime1 = millis();
  pinMode(y_STEP_PIN, OUTPUT);
  digitalWrite(y_STEP_PIN, LOW);
  pinMode(y_DIR_PIN, OUTPUT);
  pinMode(A3, INPUT_PULLUP);
  pinMode(A4, INPUT_PULLUP);
  yNextStepTime = millis();
  yNextStepTime1 = millis();
  pinMode(z_STEP_PIN, OUTPUT);
  digitalWrite(z_STEP_PIN, LOW);
  pinMode(z_DIR_PIN, OUTPUT);
  pinMode(A5, INPUT_PULLUP);
  pinMode(A6, INPUT_PULLUP);
  zNextStepTime = millis();
  zNextStepTime1 = millis();
  Serial.begin(9600);
}
void moveforward()
{
  x_STEP_PERIOD_MS = ((1000 * t) / ((xStepsPerRevolution / xPitch) * xDist));
  unsigned long xtime0 = millis();
  if ( (xflag == 1) && ((long)(xNextStepTime - xtime0) < 0) && (x_STEPS_NOS < ((xStepsPerRevolution / xPitch) * xDist)) && ((digitalRead(A1)*digitalRead(A2)) == 1))
  {{
      digitalWrite(x_DIR_PIN, LOW);
      xNextStepTime = xtime0 + x_STEP_PERIOD_MS;
      digitalWrite(x_STEP_PIN, HIGH);
      delayMicroseconds(2);
      digitalWrite(x_STEP_PIN, LOW);
      x_STEPS_NOS = x_STEPS_NOS + 1;
    }
    if (((long)(xNextStepTime - xtime0) == 0) || (x_STEPS_NOS == ((xStepsPerRevolution / xPitch) * xDist)))
    {
      xflag = 0; xtime0 = 0; x_STEPS_NOS = 0;
    }
  }

   y_STEP_PERIOD_MS = ((1000 * t) / ((yStepsPerRevolution / yPitch) * yDist));
  unsigned long ytime0 = millis();
  if ( (yflag == 1) && ((long)(yNextStepTime - ytime0) < 0) && (y_STEPS_NOS < ((yStepsPerRevolution / yPitch) * yDist)) && ((digitalRead(A3)*digitalRead(A4)) == 1))
  {{
      digitalWrite(y_DIR_PIN, HIGH);
      yNextStepTime = ytime0 + y_STEP_PERIOD_MS;
      digitalWrite(y_STEP_PIN, HIGH);
      delayMicroseconds(2);
      digitalWrite(y_STEP_PIN, LOW);
      y_STEPS_NOS = y_STEPS_NOS + 1;
    }
    if (((long)(yNextStepTime - ytime0) == 0) || (y_STEPS_NOS == ((yStepsPerRevolution / yPitch) * yDist)))
    {
      yflag = 0; ytime0 = 0; y_STEPS_NOS = 0;
    }
  }

   z_STEP_PERIOD_MS = ((1000 * t) / ((zStepsPerRevolution / zPitch) * zDist));
  unsigned long ztime0 = millis();
  if ( (zflag == 1) && ((long)(zNextStepTime - ztime0) < 0) && (z_STEPS_NOS < ((zStepsPerRevolution / zPitch) * zDist)) && ((digitalRead(A5)*digitalRead(A6)) == 1))
  {{
      digitalWrite(z_DIR_PIN, LOW);
      zNextStepTime = ztime0 + z_STEP_PERIOD_MS;
      digitalWrite(z_STEP_PIN, HIGH);
      delayMicroseconds(2);
      digitalWrite(z_STEP_PIN, LOW);
      z_STEPS_NOS = z_STEPS_NOS + 1;
    }
    if (((long)(zNextStepTime - ztime0) == 0) || (z_STEPS_NOS == ((zStepsPerRevolution / zPitch) * zDist)))
    {
      zflag = 0; ztime0 = 0; z_STEPS_NOS = 0;
    }
  }
}
void movebackward()
{
  x_STEP_PERIOD_MS1 = ((1000 * t) / ((xStepsPerRevolution / xPitch) * xDist));
  unsigned long xtime1 = millis();
  if ( (xflag == 0) && ((long)(xNextStepTime1 - xtime1) < 0) && (x_STEPS_NOS1 < ((xStepsPerRevolution / xPitch) * xDist)) && ((digitalRead(A1)*digitalRead(A2)) == 1))
  {{
      digitalWrite(x_DIR_PIN, HIGH);
      xNextStepTime1 = xtime1 + x_STEP_PERIOD_MS1;
      digitalWrite(x_STEP_PIN, HIGH);
      delayMicroseconds(2);
      digitalWrite(x_STEP_PIN, LOW);
      x_STEPS_NOS1 = x_STEPS_NOS1 + 1;
    }
    if (((long)(xNextStepTime1 - xtime1) == 0) || (x_STEPS_NOS1 == ((xStepsPerRevolution / xPitch) * xDist)))
    {
      xflag = 1; xtime1 = 0; x_STEPS_NOS1 = 0;
      xbackward_finished = xbackward_finished + 1;
    }
  }

    y_STEP_PERIOD_MS1 = ((1000 * t) / ((yStepsPerRevolution / yPitch) * yDist));
  unsigned long ytime1 = millis();
  if ( (yflag == 0) && ((long)(yNextStepTime1 - ytime1) < 0) && (y_STEPS_NOS1 < ((yStepsPerRevolution / yPitch) * yDist)) && ((digitalRead(A3)*digitalRead(A4)) == 1))
  {{
      digitalWrite(y_DIR_PIN, LOW);
      yNextStepTime1 = ytime1 + y_STEP_PERIOD_MS1;
      digitalWrite(y_STEP_PIN, HIGH);
      delayMicroseconds(2);
      digitalWrite(y_STEP_PIN, LOW);
      y_STEPS_NOS1 = y_STEPS_NOS1 + 1;
    }
    if (((long)(yNextStepTime1 - ytime1) == 0) || (y_STEPS_NOS1 == ((yStepsPerRevolution / yPitch) * yDist)))
    {
      yflag = 1; ytime1 = 0; y_STEPS_NOS1 = 0;
      ybackward_finished = ybackward_finished + 1;
    }
  }

     z_STEP_PERIOD_MS1 = ((1000 * t) / ((zStepsPerRevolution / zPitch) * zDist));
  unsigned long ztime1 = millis();
  if ( (zflag == 0) && ((long)(zNextStepTime1 - ztime1) < 0) && (z_STEPS_NOS1 < ((zStepsPerRevolution / zPitch) * zDist)) && ((digitalRead(A5)*digitalRead(A6)) == 1))
  {{
      digitalWrite(z_DIR_PIN, HIGH);
      zNextStepTime1 = ztime1 + z_STEP_PERIOD_MS1;
      digitalWrite(z_STEP_PIN, HIGH);
      delayMicroseconds(2);
      digitalWrite(z_STEP_PIN, LOW);
      z_STEPS_NOS1 = z_STEPS_NOS1 + 1;
    }
    if (((long)(zNextStepTime1 - ztime1) == 0) || (z_STEPS_NOS1 == ((zStepsPerRevolution / zPitch) * zDist)))
    {
      zflag = 1; ztime1 = 0; z_STEPS_NOS1 = 0;
      zbackward_finished = zbackward_finished + 1;
    }
  }
}
void loop()
{
  moveforward();
  movebackward();
  if (xbackward_finished == no_of_times) {
    while (1) {

    }
  }
}

如果有人用不同的编码方法解决了类似类型的问题,请与我分享。

我也尝试使用 Arduino due 的调度程序库包,但由于多个 LED 示例代码工作正常,但多个电机无法正常工作。

标签: arduinoarduino-uno

解决方案


推荐阅读