I have a stepper connected to a leadscrew, on which is situated a nut somehow connected to a load, along with linear bearings -- so a typical linear-actuation setup. I'm using a commonplace A4988 module (along with an Atmega328 MCU on Arduino) to drive the stepper.

What are the primary things I should do with a stepper motor setup to make the load move as fast as possible?

I'm guessing at least some of the following are useful:

  1. Applying the maximum voltage that the stepper and driver are specified to handle: I am applying pretty close to the maximum already.

  2. Increasing the pulse frequency in my code: I did this up to a point, but beyond a certain point, I start to hear a strange high-pitched sound.

  3. Use a stepper with higher torque specification: I'm assuming this by itself won't make the steppper go faster but, for a given load, it will help in not skipping steps at high speeds.

  4. Some other motor-specifications or driver-specifications that I should take into account when selecting a stepper or driver to purchase?

  • 2
    \$\begingroup\$ You need a proper acceleration/deceleration profiles. Don't jump right from 0 to the high speed. And if you can have some feedback - it will allow much better control. \$\endgroup\$
    – Eugene Sh.
    Nov 30, 2016 at 19:15
  • \$\begingroup\$ About the "jump": I'm unclear -- do you mean that's an unhealthy practice (i.e., produces a high-pitch whining, for example) or that it actually prevents me from reaching the highest speed I can? \$\endgroup\$
    – boardbite
    Nov 30, 2016 at 19:16
  • 3
    \$\begingroup\$ What is the supply voltage you're using? You can supply these drivers with up to 35V. It doesn't matter if you're using a voltage above the motor specs. What is important for the motor is the driving current (which is defined by the Rsense value). Providing higher voltage will allow you to have better torque/acceleration capabilities. \$\endgroup\$
    – dim
    Nov 30, 2016 at 19:53
  • 3
    \$\begingroup\$ Providing higher voltage is required to achieve maximum performance, but it's only appropriate if you have current-mode drivers, otherwise it will just cook the motor. The point is that for a given step rate, you need to force rated current through the inductance before too much of the step time has elapsed, and the faster you go the higher the voltage required to accomplish that in time. If you fail to achieve rated current in time, you fail to achieve rated torque. So you need low inductance motors, current mode drivers, high voltage, and acceleration profiling... and no nasty resonances. \$\endgroup\$ Nov 30, 2016 at 20:18
  • 1
    \$\begingroup\$ @ChrisStratton is correct. Also, the A4988 is a current mode driver so it is an appropriate solution for you. \$\endgroup\$
    – Matthew
    Nov 30, 2016 at 20:23

4 Answers 4


Your problem is the Arduino. I assume that you connected a digital pin to the STEP of your motor driver. There is an upper limit for the frequency (see AccelStepper Doucmentation), which is around 1000 pps (points per second). Assuming that you have a standard stepper with approx. 200 steps / revolution this would only result in 300 rpm (rounds per minute). For many applications this is too slowly.

So how can you go faster? I would recommend to use a "PWM chip" as a controller and connect that one to the STEP of your driver. With that you have sort of a speed control. I am currently searching for an appropriate PWM chip, if I find something, I will update this answer. Perhaps some small chip which does "i2c to pwm with variable frequency". I know that Adafruit did something like that but they only achieve 1.6 kHz.


If you think about it, the only difference between a stepper motor and a DC brushless motor is the way in which the coils are controlled. A stepper is open-loop, while the BLDC is closed-loop, using Hall or back-EMF sensing.

So on the face of it what you’re asking for is not unreasonable. The trick is, if you’re open-loop, how to control the coils in such a way as to mimic closed-loop?

If torque weren’t a consideration this is relatively easy: just increase the coil switching rate. The motor speed will match.

But, torque is a consideration so you have to account for that. Mainly, acceleration requires torque, so employing acceleration profiles to limit torque demand is a first approach. Adaptive coil drive also can be employed, boosting drive during high load.

For ultimate performance however, a closed-loop stepper system will produce better acceleration, speed, and efficiency. These use DSP controllers and feedback. The Arduino isn’t capable of doing this by itself; there are MCUs with DSP capabilities that are.

Something to think about.

More here: https://www.motioncontroltips.com/open-loop-stepper-motor-versus-closed-loop-stepper-motor-systems/

And here: https://www.motioncontroltips.com/digital-signal-processors-dsps-motion-control/


Just use "FastAccelStepper" library. I reached "1800" rpm by this library and drv8825 driver (in 1/8 microstep mode).


Sorry, this may be not exactly what you expect. But to make it run faster/smoother/whatever else you may want, you should take a brushless dc motor. Everything else is good for either amateurs or extremely high volume production.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.