Как увеличить скорость отклика/скорость шагового двигателя?
Я пытаюсь управлять положением биполярного шагового двигателя 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 мс.
Есть идеи? Заранее спасибо!
@ArcGhost, 👍1
1 ответ
Ваша проблема в том, что вы хотите мгновенно разогнаться до полной скорости. Этого просто не произойдет. Как вы уже видели, существует предел скорости, с которой вы можете уйти с места.
Если вы хотите двигаться быстрее, вам придется разогнаться до этой скорости.
Самый простой способ сделать это — использовать специально предназначенную для этого библиотеку, например популярную . Библиотека AccelStepper.h.
- Управление направлением шагового двигателя с помощью кнопок.
- Шаговый двигатель не работает с платой A4988
- Grbl на Arduino Uno (Elegoo) с неработающим шаговым двигателем DM542 + nema24
- Кнопка сброса не работает + не могу загрузить код, что не так?
- Принципиальная схема для работы биполярного шагового двигателя с использованием LDR
- Непрерывное обнаружение кнопок для шагового управления
- Справка по библиотеке AccelStepper - Одновременное управление двигателем
- Как позволить шаговому двигателю вращаться постоянно?