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 '16 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 '16 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 '16 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 '16 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 '16 at 20:23

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.


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, privacy policy and cookie policy

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