Двигатель не вращается плавно (даже на высокой скорости)

Я бханука, новичок в шаговых двигателях и в этой библиотеке.

Я пытаюсь управлять 4 двигателями NEMA 17 (с разными скоростями одновременно), используя 4 (четыре) шаговых драйвера DM320t. На самом деле я хочу переместить робота (робот имеет всенаправленные колеса) по координатам в соответствии с Gcode. Кажется, что код в порядке, но когда я ввожу G-код, двигатели начинают вращаться в правильном направлении, но они не дают плавного вращения (я слышу щелкающий звук, двигатель кажется прыгающим от шага к шагу, и двигатель тоже нагревается). много).

Я думаю, что проблема в этом случае заключается в том, что двигатель пропускает некоторые шаги. здесь я прикрепил код. Может ли кто-нибудь помочь мне преодолеть эту проблему. Спасибо.

#include <AccelStepper.h>
#include <math.h>

int Gval;
int Xval, Yval, Zval;
int Fval;
int Ival, Jval;
String Gvalstr, Xvalstr, Yvalstr, Zvalstr, Fvalstr, Ivalstr, Jvalstr;
char Key;
String code; // параметры транслятора G-кода, он выполнит код
String ab; // Пара транслятора G-кода, для перехода к функции Gcode

AccelStepper w1(1, 2, 3); // контакт 3 = шаг, контакт 6 = направление
AccelStepper w2(1, 49, 51); // контакт 4 = шаг, контакт 7 = направление
AccelStepper w3(1, 5, 6); // контакт 3 = шаг, контакт 6 = направление
AccelStepper w4(1, 8, 9); // контакт 4 = шаг, контакт 7 = направление

int w1_enb = 4;
int w2_enb = 53;
int w3_enb = 7;
int w4_enb = 10;
char x ; // координата х
char y ; // координата х
char command; // случай вари.
char com;



String inString = "";


void setup() {
  digitalWrite(w1_enb, HIGH);
  digitalWrite(w2_enb, HIGH);
  digitalWrite(w3_enb, HIGH);
  digitalWrite(w4_enb, HIGH);

  Serial.begin(9600);
  Serial.println("G code");

}

void loop() {
  Gvalstr = "";
  Xvalstr = "";
  Yvalstr = "";
  Zvalstr = "";
  Fvalstr = "";
  Ivalstr = "";
  Jvalstr = "";

  String code;
  if (Serial.available() > 0 ) {
    ab = Serial.readString();
    Gcode();
  }
  else {}

}

void Gcode () {
  code = ab;
  Serial.println("code is " + ab);
  //Serial.println(код);
  //Код строки = "G01 X1 Y1 F200 T01 M03 S500";
  int len = code.length();
  for (int i = 0; i < len; i++) {

    if (code[i] == 'G')Key = 'G';
    else if (code[i] == 'X')Key = 'X';
    else if (code[i] == 'Y')Key = 'Y';
    else if (code[i] == 'Z')Key = 'Z';
    else if (code[i] == 'F')Key = 'F';
    else if (code[i] == 'i')Key = 'i';
    else if (code[i] == 'j')Key = 'j';
    else if (isdigit(code[i]) || code[i] == '-') {
      if (Key == 'G') {
        Gvalstr += code[i];
      }
      else if (Key == 'X') {
        Xvalstr += code[i];
      }
      else if (Key == 'Y') {
        Yvalstr += code[i];
      }
      else if (Key == 'Z') {
        Zvalstr += code[i];
      }
      else if (Key == 'F') {
        Fvalstr += code[i];
      }
      else if (Key == 'i') {
        Ivalstr += code[i];
      }
      else if (Key == 'j') {
        Jvalstr += code[i];
      }

    }
    else
    {
      Key = '-1';
    }

  }


  Gval = Gvalstr.toInt();
  Xval = Xvalstr.toInt();
  Yval = Yvalstr.toInt();
  Fval = Fvalstr.toInt();


  Serial.println( Gval);
  Serial.println (Xval);
  Serial.println (Yval);
  Serial.println (Fval);



  switch (Gval) {

    case 0:
      motor_setup(Xval, Yval);
      //Serial.println("************");
      break;
    case 1:
      motor_setup(Xval, Yval);
      //Serial.println("**-------");
      break;

    case 2:
      motor_setup(Xval, Yval);
      break;

    case 3:
      motor_setup(Xval, Yval);
      break;

    case 90:
      motor_setup(Xval, Yval);
      break;

    case 91:
      motor_setup(Xval, Yval);
      break;

    case 92:
      motor_setup(Xval, Yval);
      break;

  }
}


void motor_setup (int Xval , int Yval) {

  double Xprojection;
  double Yprojection;

  if (Yval == 0 ) {

    if (Xval > 0) {
      Xprojection = '1';
    }

    else if (Xval == 0) {
      Xprojection = 0;

    }

    else {

      Xprojection = -1;
    }
    Serial.println("Xprojection in if ");
    Serial.println(Xprojection);

    Yprojection = 0;

  }
  else {
    float alpha = Yval / Xval;
    Serial.println("CALCULATING");
    Serial.println(alpha);

    double atanval = atan(alpha);
    Xprojection = cos(atanval);
    Yprojection = sin(atanval);

    Serial.println("X_projection : ");
    Serial.println(Xprojection);

    Serial.println("Y_projection : ");
    Serial.println(Yprojection);
  }


  float W1, W2, W3, W4;  // Радиальная скорость, необходимая для перемещения в положение

  W1 = float ( -0.35 * Xprojection + 0.35 * Yprojection) ;   
  W2 = float (-0.35 * Xprojection - 0.35 * Yprojection );
  W3 = float ( 0.35 * Xprojection - 0.35 * Yprojection );
  W4 = float (0.35 * Xprojection + 0.35 * Yprojection );

  Serial.println ("Velocity components ");
  Serial.println (W1);
  Serial.println (W2);
  Serial.println (W3);
  Serial.println (W4);
  Serial.println('\n');

  long c = 20;    // эти значения для тестирования
  long d = 20;
  long e = 20;
  long f = 20;

  w1.setMaxSpeed(2);
  w1.setAcceleration(12);
  w1.moveTo( Xval );

  w2.setMaxSpeed(2);
  w2.setAcceleration(12);
  w2.moveTo( Yval);

  w3.setMaxSpeed(2);
  w3.setAcceleration(12);
  w3.moveTo( -Xval);

  w4.setMaxSpeed(2);
  w4.setAcceleration(12);
  w4.moveTo( -Yval );

  while (w1.distanceToGo() != 0 || w2.distanceToGo() != 0 || w3.distanceToGo() != 0 || w4.distanceToGo() != 0) {
    w1.run();
    w2.run();
    w3.run();
    w4.run();





  }

  Serial.println("Executed");
  Serial.println("Next GCODE");
  Serial.flush();



}

, 👍-1

Обсуждение

уменьшите свой код, чтобы управлять только одним двигателем... удалите все остальные коды... запустите двигатель на 2 секунды и остановитесь... обновите свой пост с результатами, @jsotola


1 ответ


0

Проблема заключалась в напряжении питания. Я подключил его к 24 В постоянного тока. Когда я подключил его к 12 В, проблема была решена.

,

Кажется, вы видите слишком большой ток у драйвера. Вы всегда должны использовать минимальный ток, который плавно перемещает ваше устройство. Попробуйте уменьшить ток, тогда он будет работать при более низких напряжениях., @Zhenek

Можно принять свой собственный ответ как решение проблемы., @VE7JRO