87void STEPPER::move(
float targetSpeed,
float acceleration,
float angle,
int steps_revolution) {
88 float currentSpeed = 0;
89 float stepInterval = 0;
90 unsigned long lastStepTime = 0;
91 unsigned long currentTime;
95 float steps_degree = (float)steps_revolution / 360.0;
96 float steps = angle * steps_degree;
98 int steps_rounded = (int)floorf(steps);
101 if (steps_rounded <= 0)
return;
104 float maxReachableSpeed = sqrt(acceleration * steps_rounded);
107 if (targetSpeed > maxReachableSpeed) {
108 targetSpeed = maxReachableSpeed;
112 float accelTime = targetSpeed / acceleration;
113 float accelDist = 0.5 * acceleration * accelTime * accelTime;
116 float cruiseDist = steps_rounded - 2 * accelDist;
117 bool hasCruise = cruiseDist > 0;
119 while (stepsTaken < steps_rounded) {
120 currentTime = micros();
124 if (stepsTaken < accelDist) {
126 phaseTime = sqrt(2.0 * stepsTaken / acceleration);
127 currentSpeed = acceleration * phaseTime;
128 }
else if (hasCruise && stepsTaken < (steps_rounded - accelDist)) {
130 currentSpeed = targetSpeed;
133 int stepsRemaining = steps_rounded - stepsTaken;
134 phaseTime = sqrt(2.0 * stepsRemaining / acceleration);
135 currentSpeed = acceleration * phaseTime;
139 if (currentSpeed < 1) currentSpeed = 1;
141 stepInterval = 1000000.0 / currentSpeed;
143 if ((micros() - lastStepTime) >= stepInterval) {
145 lastStepTime = micros();
147 delayMicroseconds(4);
169 void STEPPER::move(
float targetSpeed,
float acceleration,
float angle,
int steps_revolution,
STEPPER* stepper2,
int stepper2_ratio) {
170 float currentSpeed = 0;
171 float stepInterval = 0;
172 unsigned long lastStepTime = 0;
173 unsigned long currentTime;
175 bool updatedStepper2Direction =
false;
178 if (stepper2->GetDirection() ==
direction) {
180 updatedStepper2Direction =
true;
184 float steps_degree = (float)steps_revolution / 360.0;
185 float steps = angle * steps_degree;
187 int steps_rounded = (int)floorf(steps);
190 if (steps_rounded <= 0)
return;
193 float maxReachableSpeed = sqrt(acceleration * steps_rounded);
196 if (targetSpeed > maxReachableSpeed) {
197 targetSpeed = maxReachableSpeed;
201 float accelTime = targetSpeed / acceleration;
202 float accelDist = 0.5 * acceleration * accelTime * accelTime;
205 float cruiseDist = steps_rounded - 2 * accelDist;
206 bool hasCruise = cruiseDist > 0;
208 while (stepsTaken < steps_rounded) {
209 currentTime = micros();
213 if (stepsTaken < accelDist) {
215 phaseTime = sqrt(2.0 * stepsTaken / acceleration);
216 currentSpeed = acceleration * phaseTime;
217 }
else if (hasCruise && stepsTaken < (steps_rounded - accelDist)) {
219 currentSpeed = targetSpeed;
222 int stepsRemaining = steps_rounded - stepsTaken;
223 phaseTime = sqrt(2.0 * stepsRemaining / acceleration);
224 currentSpeed = acceleration * phaseTime;
228 if (currentSpeed < 1) currentSpeed = 1;
230 stepInterval = 1000000.0 / currentSpeed;
232 if ((micros() - lastStepTime) >= stepInterval) {
233 lastStepTime = micros();
236 if(stepsTaken % stepper2_ratio == 0) {
245 int residual = stepsTaken % stepper2_ratio;
246 stepper2->steps_remainder = (float)residual / (
float)stepper2_ratio;
249 if (updatedStepper2Direction) {
250 stepper2->SetDirection(!stepper2->GetDirection());
332 float jerk = maxJerk;
334 unsigned long lastStepTime = 0;
335 unsigned long lastUpdateTime = micros();
337 const float dt = 0.001;
339 while (stepsTaken < distance) {
340 unsigned long now = micros();
341 if ((now - lastUpdateTime) < dt * 1e6)
continue;
342 lastUpdateTime = now;
351 float stoppingDist = (vel * vel) / (2 * acc + 1e-6);
354 if (vel < targetSpeed && pos < (distance - stoppingDist)) {
356 }
else if (vel > 0) {
361 float maxAcc = sqrt(targetSpeed * maxJerk);
362 if (acc > maxAcc) acc = maxAcc;
363 if (acc < -maxAcc) acc = -maxAcc;
366 if (vel < 0) vel = 0;
371 float stepInterval = 1e6 / (vel + 1e-3);
373 if ((micros() - lastStepTime) >= stepInterval && stepsTaken < distance) {
376 lastStepTime = micros();
378 delayMicroseconds(4);
void move(float targetSpeed, float acceleration, float position, int steps_revolution)
Move the motor a given angle with a given acceleration and distance.
void absoluteMove(float targetSpeed, float acceleration, float angle, int steps_revolution)
Move the motor to a target location based on an absolute angle with a given speed and acceleration.