Влияние тактовой частоты 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?

, 👍1

Обсуждение

Устанавливаете ли вы максимальную скорость с помощью setMaxSpeed()?, @Craig


2 ответа


0

Почему тактовая частота меняется при одновременном управлении несколькими двигателями?

Как вы питаете двигатели и Arduino?

Я подозреваю, что проблема в вашем блоке питания. Запуск 2 двигателей, вероятно, удваивает потребление тока. Попробуйте измерить входное напряжение, падает ли оно при запуске обоих двигателей?

Вам следует проверить ток, который могут потреблять ваши двигатели, и сравнить его с тем, что может обеспечить ваш источник питания. (Также помните об ограничении драйвера в 1 А)

,

Я не думаю, что это будет проблемой для шаговых двигателей. Поскольку они перемещаются на фиксированное расстояние с каждым шагом, они должны двигаться только с той скоростью, с которой поступают импульсы от ардуино., @Craig

он питается от источника постоянного тока 30 В 2 А. При работе заметных падений напряжения нет. Максимальный ток каждого шагового двигателя составляет 1 А, но я думаю, что оба вместе я не вижу ничего выше 1 А в сумме (работает около 12 В)., @MJ2507


2

Не видя остальной части вашего кода, лучшее предположение — и я думаю, что это вполне вероятно — это использование 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