Может ли AccelStepper ускоряться нелинейно?

Я использую двигатель Nema 23 с Arduino Uno и микростепенным драйвером. Я делаю демонстрацию крутильных колебаний, в которой используется ряд пружин, соединенных с приводным валом двигателя, для вращения шестерен. Эти шестерни при изменении частоты вращения вала должны начать вращаться по фазе друг с другом. В моем конкретном случае я использую три потенциометра, которые показывают 0-1023, для считывания скорости, амплитуды и частоты. Изменения в скорости двигателя - вот где я сталкиваюсь со своими проблемами. Мне нужно, чтобы скорость степпера была синусоидальной функцией - вида "Скорость - амплитуда x sin (частота x время)".

Ниже приведен некоторый элементарный код, который я собрал вместе с библиотекой AccelStepper, которая не работает:

#include <AccelStepper.h>

/* Используя шаговый двигатель,
вращайте вибрационную модель с помощью шестеренок, соединенных пружинами
  таким образом, чтобы вызвать крутильные колебания, которые должны быть видны при сравнении
  движение расположенных рядом вращающихся шестеренок с нанесенными на них маркерами. */

AccelStepper stepper(AccelStepper::DRIVER);
void setEnablePin(int enablePin = 8);

int Microstepping = 8; /* Коэффициент микрошагов, установленный на плате управления ST-M5045.
                          Умножает количество шагов на оборот шагового двигателя.
                          Обратитесь к руководству контроллера для настройки этого числа. */
int Steps = 200; /* Количество ступеней на вашем шаговом двигателе. */
int SPS;
int Amp;
int Freq;
// int SC;
int n = 2;
int i;
int totalSteps = Microstepping * Steps;
int currentPosition();

/* Следует отметить, что коэффициенты микрошагов и шагов не являются необходимыми, и корректировка коэффициента микрошагов
    на лету код не будет взломан. Однако имейте в виду, что изменение коэффициента микрошагов более чем на один интервал
    это может привести к тому, что двигатель не справится с резкими изменениями, т.е. потеряет крутящий момент или начнет вибрировать / заикаться. */

void setup() {               // ВЫПОЛНЯЕТСЯ ОДИН РАЗ //

  Serial.begin(9600);

  // считывание потенциометров; необработанные входные сигналы от 0 до 1023 //
  SPS = analogRead(0) * 0.5; // МАКСИМАЛЬНОЕ количество шагов в секунду должно быть <1000. Скорости выше 1000 ненадежны, согласно документам AccelStepper.//
  Amp = analogRead(1) / 20;   // МАКСИМАЛЬНЫЙ УСИЛИТЕЛЬ ~ 51//
  Freq = analogRead(2) / 170; // МАКСИМАЛЬНАЯ ЧАСТОТА ~ 12 Гц//

  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(SPS / 1.5);

  int nextStop = totalSteps / Freq;

  stepper.moveTo(nextStop);
  stepper.run();
  Serial.println("INITIALIZED");
}

void loop() {
  SPS = analogRead(0) * 0.95;
  Amp = analogRead(1) / 20;
  Freq = analogRead(2) / 170;

  float spd = SPS + (Amp*sin(Freq*millis()));
  stepper.setSpeed(spd);
  stepper.run();
  Serial.print("speed:  ");
  Serial.println(spd);
}

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

А теперь, ребята, то, чего вы все так долго ждали: Суть дела.

Действительно ли AccelStepper поддерживает нелинейные ускорения не в результате ошибки? Я привожу следующий отрывок из документации AccelStepper,

 /// Устанавливает максимально допустимую скорость. Функция run() ускорит
 /// до скорости, установленной этой функцией.
 /// Внимание: максимальная достижимая скорость зависит от вашего процессора и тактовой частоты.
 /// Максимальная скорость по умолчанию составляет 1,0 шага в секунду.
 /// \param[in] скорость Желаемая максимальная скорость в шагах в секунду. Должен
 /// be> 0. Внимание: скорости, превышающие максимальную скорость, поддерживаемую процессором, могут
 /// Приводит к нелинейным ускорениям и замедлениям.
 void    setMaxSpeed(float speed);

что делает единственное упоминание о нелинейном ускорении во всей документации - в контексте ошибки переполнения.

Я подумал о возможном использовании модифицированной версии программы easydriver example из ответа № 3 на этот пост, если AccelStepper не способен делать то, что мне нужно. В комплект входит также изображение системы (за вычетом arduino и контроллера).

Заранее благодарю за вашу помощь

, 👍2


1 ответ


Лучший ответ:

1

Я ценю голоса за разоблачение! Вот ответ, который я получил от Майка, самого создателя AccelStepper: ссылка

Короткий ответ: нет!

Я опубликовал программу, которую я использую сейчас, которая ускоряется нелинейно, используя изменение синхронизации импульсов, в связанном потоке.

Счастливого шага!

,