Может ли 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 и контроллера).
Заранее благодарю за вашу помощь
@czar1249, 👍2
1 ответ
Лучший ответ:
Я ценю голоса за разоблачение! Вот ответ, который я получил от Майка, самого создателя AccelStepper: ссылка
Короткий ответ: нет!
Я опубликовал программу, которую я использую сейчас, которая ускоряется нелинейно, используя изменение синхронизации импульсов, в связанном потоке.
Счастливого шага!
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Запустить два степпера одновременно
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
- Питание двух шаговых двигателей с драйверами A4988
- Управление функцией включения на драйвере микрошагового устройства
- Шаговый двигатель с датчиком HCSR-04
- Шаговый двигатель не работает с платой A4988
- Nema 17, Arduino Uno и шаговый двигатель ~2H42B