Двигатель не вращается плавно (даже на высокой скорости)
Я бханука, новичок в шаговых двигателях и в этой библиотеке.
Я пытаюсь управлять 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();
}
@life style, 👍-1
Обсуждение1 ответ
Проблема заключалась в напряжении питания. Я подключил его к 24 В постоянного тока. Когда я подключил его к 12 В, проблема была решена.
Кажется, вы видите слишком большой ток у драйвера. Вы всегда должны использовать минимальный ток, который плавно перемещает ваше устройство. Попробуйте уменьшить ток, тогда он будет работать при более низких напряжениях., @Zhenek
Можно принять свой собственный ответ как решение проблемы., @VE7JRO
- Шаговый двигатель не работает с платой A4988
- Шаговый двигатель работает медленно при чтении с датчика MPU 6050
- Справка по библиотеке AccelStepper - Одновременное управление двигателем
- Как позволить шаговому двигателю вращаться постоянно?
- Неодновременное управление несколькими шаговыми двигателями
- Как правильно использовать микрошаговый драйвер с шаговым двигателем более низкого напряжения
- arduino 28BYJ-48 stepper только жужжит, не вращается
- Шаговый двигатель не изменяет направления движения!
уменьшите свой код, чтобы управлять только одним двигателем... удалите все остальные коды... запустите двигатель на 2 секунды и остановитесь... обновите свой пост с результатами, @jsotola