What could be the reasons for a stepper motor stuttering with an A4988 driver?
Ask QuestionAsked yesterdayActive todayViewed 40 times21
I am using an A4988 Stepper Motor Driver, which is controlled with an STM32F767ZI on a Nucleo 144 board. The stepper motor takes 12 V with a maximum of 350 mA.
When powered, the motor simply flickers and stutters, but moves at a negligible speed.
Here is a circuit diagram of the setup, with voltage readings taking from a multimeter:

The potentiometer has been set correctly.
The same results occur even with two other A4988 drivers.
For reference, here is the code (though I don’t believe this is a software issue):
main.c
#include "./headers/stm32f767xx.h"
#include <stdint.h>
int main(void)
{
initMotor(0); // initialise the motor
initLed(7); // initialise the led
unsigned long a = 0;
while (1)
{
if (a == 50000)
{
toggleLed(7); // this LED flashes a little quicker than twice per second
stepMotor(0); // output a pulse to the driver to step the motor, attached to PA2
a = 0;
}
a++;
}
}
./drivers/led.c
#include "../headers/stm32f767xx.h"
void initLed(int pin)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // enable the GPIOB clock
GPIOB->MODER |= (0x1 << (pin * 2)); // set to output
GPIOB->OTYPER = 0x00; // push-pull mode
GPIOB->ODR = 0x00; // set output register to 0 across all pins
}
void toggleLed(int pin)
{
GPIOB->ODR ^= (0x1 << pin); // toggle the pin
}
./drivers/motor.c
#include "../headers/stm32f767xx.h"
void initMotor(int step_pin)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // enable the GPIOA clock
GPIOA->MODER |= (0x1 << (step_pin * 2)); // set to output
GPIOA->OTYPER = 0x00; // push-pull mode
GPIOA->PUPDR |= (0x2 << (step_pin * 2)); // pull down the pin specified
GPIOA->ODR = 0x00; // set output register to 0 across all pins
}
void stepMotor(int step_pin)
{
GPIOA->ODR |= (1 << step_pin); // output to the pin specified
GPIOA->ODR &= ~(1 << step_pin); // reset the output back to 0
}
With this code, I was expecting the motor to take steady and even steps, rather than the backwards-and-forwards stuttering it does.
I would appreciate any suggestions for the direction I should take from here, or any suggestions as to what the issue could be.stm32stepper-motorstepper-driverShareCiteEditFollowFlagasked yesterdayuser152789781111 bronze badge New contributor
- one reason is trying to push her too fast and she can’t handle. – tlfong01 yesterday
- 1Do you have a datasheet for the stepper? The first thing to check would be that the phases of the stepper motor are correctly connected to the A4988 outputs. – gcr yesterday
- 1Are you sure ‘stepMotor’ function works to send a ~50% duty cycle PWM? – Ernesto 23 hours ago
- 1@tlfong01 i have slowed it down, and the result is still the same – user15278978 18 hours ago
- 1@gcr i believe the only wiring concern with the motor is that one coil of the motor is connected to a number pair (1A with 1B, 2A with 2B), as outlined in this image (which is what I have done) – user15278978 18 hours ago
- 1@Ernesto nope, it doesn’t. i was under the impression that any change to a high signal sent to the step pin of the A4988 would step the motor. i’ll give this a go – user15278978 18 hours ago
- I see from your schematic that you are using a bipolar stepper, but It is a bit difficult to follow you code to figure out your stepping sequence. It is not important which driver your are using, A4988, L298, 297, L293 etc. You might like to skim my answer to the following Q&A. Using L293D Motor Driver to Control Bipolar Stepping Motor 28BYJ48 – raspberrypi.stackexchange.com/questions/97975/…. You might also follow the AdaFruit or other newbie friendly tutorial and let me know the stepping schemes you are using. – tlfong01 17 hours ago
- You may like to refer to the newbie friendly Components 101 tutorial for a simple full step (no micro step) operation description. A4988 Stepper Motor Driver Module Tutorial – Components 101, 2019aug22 components101.com/modules/a4988-stepper-motor-driver-module. / to continue, … – tlfong01 16 hours ago
- It is not clear if you have a 2 coil, 4 coils, 4 wires, 5 wires, or 6 wires stepper. If you have a 6 wire bipolar, and if you wrongly select the wires, you might have strange movements. To make very sure you have selected the correct wires, you see that in my referred answer, I actually spent a couple of hours using a multi-meter and a battery and by hand (and later using a 2 pole 5 throw rotary switch) changed the polarity to actually see the motor stepping small steps of 1.8 degrees. To get a thorough understanding, you might like me, experiment DIY change bipolar to unipolar. configuration. – tlfong01 16 hours ago
- Let us continue this discussion in chat. – tlfong01 16 hours ago
- 1Are /Reset and /Sleep pulled to logic high somehow? – John Birckhead 15 hours ago
- 1@JohnBirckhead the sleep pin is pulled up, so both reset and sleep are at logic high (which is intentional) – user15278978 15 hours ago
- 1Ok. We have a pull-up on our design. I couldn’t find reference to an internal pull-up in the data sheet. – John Birckhead 15 hours ago
1 Answer
Question
MCU STM32 with stepper motor driver Allegro A4988 are moving a 2 coil, 4 wire, bipolar stepper motor ridiculously slowly, with flickers and stutters. How to fix?



The OP’s original code (See Appendix A, B, and C below)
Answer
/ to continue, …
References
/ to continue, …
Appendices
Appendix A – The OP’s Original Code – main.c
#include "./headers/stm32f767xx.h"
#include <stdint.h>
int main(void)
{
initMotor(0); // initialise the motor
initLed(7); // initialise the led
unsigned long a = 0;
while (1)
{
if (a == 50000)
{
toggleLed(7); // this LED flashes a little quicker than twice per second
stepMotor(0); // output a pulse to the driver to step the motor, attached to PA2
a = 0;
}
a++;
}
}
Appenidx B – The OP’s Original Code – ./drivers/led.c
#include "../headers/stm32f767xx.h"
void initLed(int pin)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // enable the GPIOB clock
GPIOB->MODER |= (0x1 << (pin * 2)); // set to output
GPIOB->OTYPER = 0x00; // push-pull mode
GPIOB->ODR = 0x00; // set output register to 0 across all pins
}
void toggleLed(int pin)
{
GPIOB->ODR ^= (0x1 << pin); // toggle the pin
}
---
Appenidx C – The OP’s Original Code – ./drivers/motor.c
---
#include "../headers/stm32f767xx.h"
void initMotor(int step_pin)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // enable the GPIOA clock
GPIOA->MODER |= (0x1 << (step_pin * 2)); // set to output
GPIOA->OTYPER = 0x00; // push-pull mode
GPIOA->PUPDR |= (0x2 << (step_pin * 2)); // pull down the pin specified
GPIOA->ODR = 0x00; // set output register to 0 across all pins
}
void stepMotor(int step_pin)
{
GPIOA->ODR |= (1 << step_pin); // output to the pin specified
GPIOA->ODR &= ~(1 << step_pin); // reset the output back to 0
}
/ to continue, …ShareCiteEditDeleteFlaganswered just nowtlfong011,68811 gold badge66 silver badges1111 bronze badgesAdd a commentAdd Another Answer
Categories: Uncategorized