//Program for acceleration rate control for Stepper Motor with L298N & Arduino
//Source: https://www.ee-diary.com/2021/08/stepper-motor-acceleration-speed.html
#include <AccelStepper.h>
//define pins for stepper motor
int en = 10;
int in1 = 9;
int in2 = 8;
int in3 = 7;
int in4 = 6;
int fullstep = 4; //number of stages in full drive
int halfstep = 8; //number of stages in half drive
int stepdrive = fullstep; //select step drive mode
//define stepper motor with step mode and inputs
AccelStepper stepper1(1, 3, 2);
int steps = 200; //number of steps per revolution
long last = 0;
int lag = 500; //time (ms) interval for display
int dir = 1; //direction of rotation
float rpm, v, oldspeed, a;
int nsteps;
void setup() {
Serial.begin(9600); // define Serial output baud rate
pinMode(en, OUTPUT);
digitalWrite(en, HIGH);
stepper1.setMaxSpeed(2000); //max speed 2000 steps/s
stepper1.setAcceleration(50); //acceleration rate(steps/s^2)
Serial.println("Outputs:");
Serial.println(" (+ve=clockwise, -ve=counter clockwise)");
Serial.println("No. of Steps RPM Acceleration(m/s^2) Speed(m/s)");
Serial.println("-------------------------------------------------------------------\n");
stepper1.moveTo(20000);
}
void loop() {
// stepper1.moveTo(11000); //move to position ±100 or ±200
// if(stepper1.distanceToGo()==0)
// stepper1.setSpeed(2000);
// stepper1.moveTo(20000);
if (millis() > last + lag) //lag time elapsed since last print
{
v = stepper1.speed(); //get motor speed (steps/s)
nsteps = v * lag / pow(10, 3); //No. of steps taken during lag time
rpm = 60.0 * v / steps; //RPM
a = (v - oldspeed) * 1000.0 / lag; //Acceleration
oldspeed = v; //update speed value
last = millis(); //update last print time
//Outputs
//print No. of Steps
Serial.print(String(nsteps) + "\t\t");
//print RPM
Serial.print(String(rpm, 2) + "\t\t");
//print Acceleration
Serial.print(String(a, 2) + "\t\t\t");
//print Speed
Serial.println(String(v));
}
stepper1.run(); //move to new position
}