Как увеличить скорость отклика/скорость шагового двигателя?

Я пытаюсь управлять положением биполярного шагового двигателя NEMA17, поворачивая ручку потенциометра с помощью платы EasyDriver. Контрольная часть решена. Моя проблема в том, что если я быстро поворачиваю ручку до одного конца диапазона, а затем обратно, шаговый двигатель отстает примерно на 1/5 секунды.

Во всех спецификациях двигателя говорится, что я могу ожидать гораздо большей отзывчивости (на основе максимальных оборотов, ускорения и т. д.). Я хотел бы ускорить реакцию двигателя, чтобы сократить отставание. Мой код выглядит следующим образом:

//Объявить функции выводов на Arduino
#define stp 2
#define dir 3  //НИЗКИЙ => вперед, ВЫСОКИЙ => назад
#define MS1 4
#define MS2 5
#define EN  6

//Объявить переменные для функций
int x;
int const potPin = A0;
long potval; // текущее аналоговое чтение напряжения A0
int potrotsteps = 166; //количество шагов шагового двигателя для поворота на 300 градусов
int cur_step_pos = 0; //текущая позиция в шагах шагового двигателя
long cmd_step_pos = 0; //шаговая позиция для управления шаговым двигателем
int tomove; //количество шагов для перемещения

void setup() { 
  //настройка шагового двигателя
  pinMode(stp, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(EN, OUTPUT);
  resetEDPins(); //Установить шаг, направление, микрошаг и включить выводы в состояния по умолчанию
  Serial.begin(9600); // инициализируем последовательную связь со скоростью 9600 бит в секунду
  Serial.println("\n\n\n#################    setup completed     #################");
}

void loop() { 

  //сопоставить аналоговое напряжение, считанное с потенциометра, с позицией шага (0-166) шагового двигателя
  potval = analogRead(potPin);
  cmd_step_pos = potval * potrotsteps / 1023; // найти, где должен быть шаговый двигатель с точки зрения положения шага
  tomove = abs(cur_step_pos - cmd_step_pos);

  if (cmd_step_pos > cur_step_pos) { // если позиция должна быть больше текущей позиции
    digitalWrite(dir, LOW); // двигаться вперед
    CommandStepperMotor(tomove); //движемся вперед на разницу в позиции
  } else { //если должна быть позиция ниже
    digitalWrite(dir, HIGH); //двигаться назад
    CommandStepperMotor(tomove); //движемся назад на разницу в позиции
  }
  cur_step_pos = cmd_step_pos; //текущая позиция теперь прежняя позиция

}

//ГЛОБАЛЬНЫЕ ФУНКЦИИ

// Сброс выводов Easy Driver в состояние по умолчанию
void resetEDPins() {
  digitalWrite(stp, LOW);
  digitalWrite(dir, LOW);  //по умолчанию движение "вперед"
  digitalWrite(MS1, LOW); // ЛЛ => полные шаги, HL => 1/2 шага
  digitalWrite(MS2, LOW); // левый => 1/4 шага, ЧЧ => 1/8 шага
  digitalWrite(EN, LOW); //Включить управление двигателем
}

void CommandStepperMotor(int numsteps) {
  for (x = 0; x < numsteps; x++) {
    digitalWrite(stp, HIGH); //Активировать на один шаг вперед
    delay(1);
    digitalWrite(stp, LOW); // Потяните ступенчатый штифт в низкий уровень, чтобы его можно было запустить снова
    delay(1);
  }
}

Я понимаю, что изменение delay(1) на delayMicroseconds(100) в функции CommandStepperMotor должно помочь, но, как оказалось, задержка менее 1 миллисекунды останавливает двигатель. Я пытался поискать в Google другие решения проблемы, но, похоже, у них не возникло никаких проблем с уменьшением задержки при отправке сигналов HIGH/LOW на контакт шагового двигателя до <1 мс.

Есть идеи? Заранее спасибо!

, 👍1


1 ответ


1

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

Если вы хотите двигаться быстрее, вам придется разогнаться до этой скорости.

Самый простой способ сделать это — использовать специально предназначенную для этого библиотеку, например популярную . Библиотека AccelStepper.h.

,