Control a Stepper Motor With PWM
by StepsoftheSun in Circuits > Electronics
40713 Views, 111 Favorites, 0 Comments
Control a Stepper Motor With PWM
Ever wanted to control several stepper motors precisely with just one microcontroller? Use PWM! Instead of bit-banging and writing your own delay functions to create square waves, you can use the builtin timers and pin-change interrupts available on most hobbyist microcontrollers.
In this case we'll use a Teensy LC, a Pololu DRV8825 driver and a NEMA 17 stepper motor.
Wiring and Connections
First solder headers to your DRV8825 board and Teensy, then put them on a breadboard. (It's actually easiest to solder these headers while the boards are already on a breadboard, but work in whatever order you'd like!)
We will connect the stepper driver much like the diagram from Pololu's product page (also included in the image below).
- VMOT and GND will have a 100uF capacitor between them and be connected to a 12V benchtop supply capable of supplying at least 2A.
- The ~RESET and ~SLEEP pins will be held high by connecting them to the teensy's 5V rail.
- The stepper itself will connect to A1, A2, B1 and B2.
- Set the stepper into 1/16 step mode by pulling M2 high and allowing M0 and M1 to float.
- The driver's GND pin will connect to the teensy GND.
- The teensy's pin 2 will connect to the driver's DIR pin.
- And the teensy's pin 3 will connect to the driver's STEP pin.
The teensy will have one additional connection: pin 9 will be tied to pin 3. This will allow the teensy to count pulses via a pin-change interrupt.
Also make sure to set the DRV8825's current limiting resistor to an appropriate value, as described on their product page.
Coding!
I used teensyduino to write a little arduino-like sketch to control the stepper motor. Follow the teensyduino setup steps here to get your coding environment setup correctly.
The code will allow us to send a command from the terminal to control the stepper's position. The full sketch is posted here. Each image below will breakdown a section of the code. And there's also a quick demo of the controller in action!
What's Next..
Some things you could try next:
- add limit switches to control the max and min extent of the stepper's travel
- experiment with acceleration to get the stepper quickly up to speed
- try different microstepping values -- the DRV8825 supports full step to 1/32 microsteps
If you try any of these, post your results in a comment below!