Влияние тактовой частоты Arduino на скорость шагового двигателя
Я использую драйвер шагового двигателя Pololu A4988 с двумя (скоро их будет три) шаговыми двигателями, используя библиотеку AccelStepper
. Я подключил микрошаг 1/8 на обоих, так как важна плавность хода.
Двигатели работают нормально, однако при одновременной работе, если шаговый двигатель 1 заканчивает движение раньше шагового двигателя 2, наблюдается заметное увеличение скорости шагового двигателя 2 (что заметно на слух и визуально).
Код, который я использую для управления двигателями:
void MoveAccelXY(int Xm, int Ym) // function 6
{
X_Axis.moveTo(Xm);
Y_Axis.moveTo(Ym);
while(X_Axis.distanceToGo() !=0 || Y_Axis.distanceToGo() !=0)
{
X_Axis.run();
Y_Axis.run();
}
Xpos = X_Axis.currentPosition();
Ypos = Y_Axis.currentPosition();
Serial.print("X" + Xpos);
delay(50);
Serial.print("Y" + Ypos);
delay(50);
Serial.print("C");
}
Я бы хотел, чтобы не было падения скорости на любых шаговых двигателях. Увеличение входного напряжения не дает эффекта.
Виновата ли тактовая частота Arduino?
@MJ2507, 👍1
Обсуждение2 ответа
Почему тактовая частота меняется при одновременном управлении несколькими двигателями?
Как вы питаете двигатели и Arduino?
Я подозреваю, что проблема в вашем блоке питания. Запуск 2 двигателей, вероятно, удваивает потребление тока. Попробуйте измерить входное напряжение, падает ли оно при запуске обоих двигателей?
Вам следует проверить ток, который могут потреблять ваши двигатели, и сравнить его с тем, что может обеспечить ваш источник питания. (Также помните об ограничении драйвера в 1 А)
Я не думаю, что это будет проблемой для шаговых двигателей. Поскольку они перемещаются на фиксированное расстояние с каждым шагом, они должны двигаться только с той скоростью, с которой поступают импульсы от ардуино., @Craig
он питается от источника постоянного тока 30 В 2 А. При работе заметных падений напряжения нет. Максимальный ток каждого шагового двигателя составляет 1 А, но я думаю, что оба вместе я не вижу ничего выше 1 А в сумме (работает около 12 В)., @MJ2507
Не видя остальной части вашего кода, лучшее предположение — и я думаю, что это вполне вероятно — это использование delay()
и печать внутри функции шагового двигателя. При работе 2 двигателей, и даже игнорируя время печати, задержки займут в общей сложности 200 мс. Это означает, что каждый двигатель обслуживается максимум 5 раз в секунду. Остановите один двигатель, и другой может удвоить это до 10 раз в секунду.
Посмотрите на пример Blink Without Delay, чтобы узнать об одном из способов управления событиями по времени без вызова delay()
. Библиотека SimpleTimer предоставляет другой.
Обновление:
...события run() запускаются в цикле while() ...
А, да, я это понимаю. Похоже, что одновременно может работать только один мотор — цикл while() выполняется до тех пор, пока этот мотор не достигнет своей цели. Но вы сказали, что запускаете два мотора одновременно. Так что да, я думаю, что понимание остальной части кода поможет.
Это кажется наиболее вероятным. Смотрите документацию для run()
https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#a608b2395b64ac15451d16d0371fe13ce, @Craig
Спасибо за отзыв. Сама функция вызывается из функции void loop()
, когда через последовательный порт принимается правильный формат байтов. Фактические события run()
запускаются в цикле while()
, поэтому функции delay
запускаются только после того, как двигатели начнут двигаться. Могу выложить остальную часть кода, если вы думаете, что это поможет?, @MJ2507
@MJ2507 Возможно, у вас слишком высокая максимальная скорость (максимальное количество шагов в секунду). Если она слишком высокая, она будет ограничена тактовой частотой микроконтроллера. Вы можете попробовать уменьшить максимальную скорость до тех пор, пока второй двигатель не перестанет ускоряться после остановки первого., @Craig
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Что такое контакты XTAL1 и XTAL2 в Arduino Uno/Nano?
- Запустить два степпера одновременно
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
- Питание двух шаговых двигателей с драйверами A4988
- Управление функцией включения на драйвере микрошагового устройства
- Заменить предохранители Arduino Uno (может ли Arduino Uno заменить свои собственные предохранители?)
- Шаговый двигатель с датчиком HCSR-04
Устанавливаете ли вы максимальную скорость с помощью
setMaxSpeed()
?, @Craig