Как заставить скорость шагового двигателя следовать синусоиде

Я пытаюсь сделать так, чтобы скорость вращения шагового двигателя соответствовала скорости синусоиды с периодом x секунд. Так что она начинается со скорости 0 при 0°, набирает обороты и достигает пика при 90°, замедляется до 0 при 180°, снова достигает пиковой скорости при 270° и снова до 0 при 360°, если это имеет смысл. Я пытаюсь также настроить период вращения.

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

Я использую уравнение (topSpeed) * sin((pi * time) / period) для волны.

#include <Stepper.h>

const int stepsPerRevolution = 200.000;
const float pi = 3.14159265358979;
const int period = 5; // Секунды
const int topSpeed = 100; // ОБОРОТЫ В МИНУТУ

Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
    
void setup() {
  Serial.begin(9600);
}
    
void loop() {
  for (int tStart = millis(); (millis()-tStart) < period;) {
    float speed = topSpeed * (sin((pi * (millis() / 1000.000)) / period));
    
    if (speed = 0) {
      myStepper.setSpeed(1);
      myStepper.step(1);
    } else {
      myStepper.setSpeed(speed);
      myStepper.step(1);
    }
  }
}

, 👍0

Обсуждение

Для проверки равенства в операторе if требуется ==, а не =, что является присваиванием., @chrisl


1 ответ


1

Отказ от ответственности: это не полный ответ, это всего лишь призван помочь вам с математикой.

Я нахожу противоречие в условии задачи:

начинается со скорости 0 при 0°, набирает скорость и достигает пика при 90°, замедляется обратно до 0 при 180° [...]

Если скорость — синусоидальная функция, то в этой точке вы имеете завершили положительную часть периода. Скорость теперь станет отрицательным (т.е. шаговый двигатель будет двигаться назад), и оставаться отрицательным в течение вторая половина периода.

возврат к максимальной скорости при 270° и обратно к 0 при 360°

Нет. Он достигнет пиковой (отрицательной) скорости при 90° и вернется к нулевой скорости. при 0°.

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

На графике ниже представлена скорость как функция времени. Первая кривая («синус») — это колебательное движение вперед и назад, например: 0° → 90° → 180° → 90° → 0°. Кривая «смещенного синуса» представляет собой непрерывное вращение, совершающее полный вращение со скоростью, которая всегда неотрицательна.

Скорость шагового двигателя

Если вы хотите правильно описать движение, вы должны интегрировать скорость, чтобы найти (угловое) положение как функцию времени. Вы найдет непрерывный пандус (из-за изменения скорости) накладывается синусоидальное движение, как на этом графике:

Угол шагового двигателя

Если это может помочь, я выполнил для вас интегрирование и нашел эту формулу:

угол = 360° × (t/T − sin(4πt/T)/(4π))

где t — текущее время, а T — период вращения. Это может быть быть дифференцированным, чтобы получить скорость:

скорость = 360°/T × (1 − cos(4πt/T))

,