Insufficient force for linear actuation with a NEMA 17 stepper

Hello everybody,

I have been struggling with an Arduino UNO project for the last few days so I decided to write a post on the forum. I thank you for taking the time to read this and I hope someone can help me.

For the project I am working on, linear actuation at a maximum of 250 N is required. The force increases gradually from zero to the maximal value. As a linear actuator, I am using a NEMA 17 coupled with a lead screw and a nut. The driver of the motor is an Elegoo A4988 used in full step mode.

The problem I have is that the stepper stops moving and makes noise, I guess it’s losing steps when it can’t provide the required force. When such a failure occurs, the delivered force is around 30 N.

The motor datasheet guarantees a holding torque of 420 mN*m at 1.5 A. If my computations are right, such a torque corresponds to a force of 1319 N, considering a lead screw capable of perfectly transmitting the motor power to the nut. Even being very pessimistic about the lead screw efficiency, the motor seems to be good enough for the job. It should be noted that, to have a torque as close as possible to the torque at zero velocity, I am using the motor at a very small speed, around 50 rpm. I suspect I am doing something wrong with the power supply of the motor.

In order to set the current limit, I have watched a video by Pololu. I have managed to set the current limit at 1.5 A single phase, the motor rated current. However, I have observed that the current decreases to a value in the order of 0.01 A as the motor starts moving. The current drops during the homing and remains low when it needs to provide the gradually increasing force. When the motor starts losing steps and making noise, the current remains low.

I have noticed something that might be interesting stating here. In the video by Pololu I have linked before, the current is also changing when the motor is moving. However, in their case it oscillates from the rated current value to the negative rated current value. In my case it seems to oscillate from 0.02 A to -0.02 A.

Could it be that the tension of the power supply is not high enough? The datasheet recommends a tension between 12 V and 36 V and I am currently using 12 V. The only other explanation I can come up with is that there is a problem with the pulses I am sending to the motor. I post the code in case the problem is in there:

const int homePin = 7;
const int switchPin = 8;
const int stepPin = 5; 
const int dirPin = 4; 

int homeState = LOW;
int switchState = LOW; 
int steps; 

// --------------------------------------------------------------
void setup() {
// --------------------------------------------------------------

pinMode(stepPin,OUTPUT); 
pinMode(dirPin,OUTPUT);
pinMode(switchPin,INPUT); 
pinMode(homePin,INPUT); 

delay(5000);                       // Here the current is 1.5 A

while (homeState == LOW) {        // From here the current drops to 0.02 A
  
  digitalWrite(dirPin,LOW); 
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(9500);       
  digitalWrite(stepPin,LOW);
  delayMicroseconds(9500);
  
  homeState = digitalRead(homePin);
} 

while (homeState == HIGH) {     
  digitalWrite(dirPin,HIGH); 
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(9500);
  digitalWrite(stepPin,LOW);
  delayMicroseconds(9500);
  
  homeState = digitalRead(homePin);
} 

steps=0; 

delay(500);

for(int steps = 0; steps < 120; steps++) {
  digitalWrite(dirPin,HIGH);
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(9500);
  digitalWrite(stepPin,LOW);
  delayMicroseconds(9500);
}

delay(1000);

}

// --------------------------------------------------------------
void loop() {
// --------------------------------------------------------------

while (switchState == LOW) {     
  digitalWrite(dirPin,HIGH); 
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(48000);
  digitalWrite(stepPin,LOW);
  delayMicroseconds(48000);
  
  switchState = digitalRead(switchPin);

}

delay(5000);

}

Thank you very much for reading the post until the bottom, it's a bit long but I tried to be as precise as possible.

If the motor current is decreasing, then the motor driver is overheating and shutting down. The A4988 really can't handle 1.5 A/phase without additional cooling.

Try the DRV8825 instead, with forced air cooling if necessary.

"NEMA 17" specifies the width of the motor mounting plate, and tells us nothing useful about the motor. Post a link to the product page or motor data sheet.

Finally, note that the "holding torque" is generally not very useful. The running torque will be less, and decreases rapidly with the step rate.

Or this one.. but certainly expensive.

zeus2kx:
Or this one.. but certainly expensive.

That shield is completely unsuitable. It is a DC motor driver.

...R
Stepper Motor Basics
Simple Stepper Code

Hello,

Thank you for your reply, that was super-fast. I am sorry for not being exhaustive enough with the information regarding the motor, I thought rated current, tension and torque would be enough. Anyway, I have attached the datasheet to this message.

Datasheet_NEMA17.pdf (441 KB)

That data sheet is better than nothing, but you need a pull-out torque versus speed curve to make a realistic assessment of the motor's capability.

A guess might be to assume half the holding torque.

Robin2:
That shield is completely unsuitable. It is a DC motor driver.

...R
Stepper Motor Basics
Simple Stepper Code

Right, I just noticed.

Hello again everyone,

Last week I posted about a project I was doing with a stepper motor coupled with a lead screw. Unfortunately, I still haven’t fixed this and I would be very grateful if someone could give me some advice.

In a nutshell, I couldn’t get the motor to deliver a sufficient force for the application because of a too small current (link to Pololu’s video):

In order to set the current limit, I have watched a video by Pololu. I have managed to set the current limit at 1.5 A single phase, the motor rated current. However, I have observed that the current decreases to a value in the order of 0.01 A as the motor starts moving. The current drops during the homing and remains low when it needs to provide the gradually increasing force. When the motor starts losing steps and making noise, the current remains low.

I have noticed something that might be interesting stating here. In the video by Pololu I have linked before, the current is also changing when the motor is moving. However, in their case it oscillates from the rated current value to the negative rated current value. In my case it seems to oscillate from 0.02 A to -0.02 A.

During the discussion, I was suggested to change the A4988 driver which probably couldn’t handle the 1.5 A required by the motor. So, I purchased a DRV8825 and a TB6600 and I tested again the motor, so far with the latter which should be ok up to 4 A. To my disappointment, the motor behaves exactly in the same way as before when I measure the current. As long as the motor is at rest, the current is what I want to set (around 1.5 A) but, as soon as it starts moving, the current drops to 0.02 A. The TB6600 driver needs at tension between 9 V and 40 V and I have tried with two different power supplies, 15 V - 0.5 A and 24 V - 1.4 A. The results don’t change.

I would say the problem lies in the way the driver sends the pulses to the coils. Therefore, the issue here might have something to do either with the driver or with the code. However, the latter is so simple it is hard to believe something is wrong there:

const int homePin = 7;
const int switchPin = 8;
int dirpin = 4;
int steppin = 5;
int enable = 2;

int homeState = LOW;
int switchState = LOW; 

void setup()
{
pinMode(dirpin, OUTPUT);
pinMode(steppin, OUTPUT);
digitalWrite(enable, HIGH);
pinMode(homePin,INPUT);

while (homeState == LOW) {     
  digitalWrite(dirpin,HIGH); 
  digitalWrite(steppin,HIGH);
  delayMicroseconds(9500);       
  digitalWrite(steppin,LOW);
  delayMicroseconds(9500);
  
  homeState = digitalRead(homePin);
}

while (homeState == HIGH) {     
  digitalWrite(dirpin,LOW); 
  digitalWrite(steppin,HIGH);
  delayMicroseconds(9500);       
  digitalWrite(steppin,LOW);
  delayMicroseconds(9500);
  
  homeState = digitalRead(homePin);
}

int steps=0; 

delay(500);

}

void loop()
{
 while (switchState == LOW) {     
  digitalWrite(dirpin,LOW); 
  digitalWrite(steppin,HIGH);
  delayMicroseconds(14000);       
  digitalWrite(steppin,LOW);
  delayMicroseconds(14000);
  
  switchState = digitalRead(switchPin);
}
}

I could find another motor if necessary but if it is not the problem than I’m afraid of going back to square one with a different motor instead of solving this.

Thanks for reading, wish you a great day

Why didn't you just continue the other Thread so we could see all the info in one place?

I am suggesting to the Moderator to merge the Threads.

You say you are measuring current - what are you using? A multimeter would be completely unsuitable for measuring current while the motor is moving.

And if you want to measure current be VERY CAREFUL not to disconnect a wire between the motor and the driver while the driver is powered. That usually destroys the driver instantly.

...R

Sorry about posting it separately.

I did use a multimeter to measure the current, that’s what was done in Pololu’s video but maybe mine isn’t capable of detecting rapid fluctuations. I don’t know if I have powered the driver as you said, it might be so but in that case I guess it would stop working while mine just isn’t doing well enough

Zurent:
I did use a multimeter to measure the current, that’s what was done in Pololu’s video

I thought they were measuring the current while the motor is stationary - that is the usual way.

...R

Hi,
Did you measure the voltage of the power supplies when you power up and try and drive the stepper?

Thanks.. Tom... :slight_smile:

Hello,

No I didn’t. I only have a power supply with a 5.1 mm jack and one multimeter, when I measure the current in the coil I can’t measure at the power supply. However, I could go get more equipment if necessary, a lab power supply for example

Hi,

Can you please post a copy of your circuit, in CAD or a picture of a hand drawn circuit in jpg, png?

Can you post a picture of your project so we can see your component layout?

Thanks.. Tom.. :slight_smile:

The current in the coil is AC when the motor is moving, its not useful to measure this when moving
anyway as its a very complex waveform and affected by motor speed and load.

You measure the shunt voltage on the driver to set the current as per the instructions, and then its set.
Easy. This sets the amplitude of the quadrature current to the motor, its all you need to do. The current
to one coil is not the whole story, the sum of the squares of both coil currents is what's important, and
that's a pig to measure and its not worth worrying about.

You can monitor the supply voltage and current if you want with the motor running, that tells you the
power going to the motor and heating up the driver too. Expect perhaps 60 to 80% of this power
to get to the motor, roughly, depends on many variables though. The expected power drawn by a stepper
when stationary in microstepping mode is I-squared-R, where I is the set current and R is the winding resistance.

Hello everyone and thank you for your answers,

This morning a friend of mine, more skilled with electronics than me, helped me a little bit with the project. We observed the current through a coil with an oscilloscope and, as MarkT pointed out, the signal is pretty complex.

You measure the shunt voltage on the driver to set the current as per the instructions, and then its set. Easy.

If stepper motors are supposed to be given a current limit without worrying about the current when moving than this is good news. I will estimate the current through a shunt resistance with the TB6600 while the motor is not stepping and set it to the rated value (I already set the current to 1.5 A as I said in post #7 but at the time there was a problem with the joint between motor shaft and lead screw that reduced the transmitted torque). If the force is still insufficient, then I will conclude that the torque from the motor is not enough, a more powerful motor will be necessary.

I don’t think there’s anything wrong with the circuit or the components but I will post anyway a few photos. They might be useful to someone in the future, who knows.

Once again thank you for your help

StepperPics.pdf (958 KB)

Zurent:
If stepper motors are supposed to be given a current limit without worrying about the current when moving than this is good news.

Not "stepper motors" but "stepper motor drivers"

I will estimate the current through a shunt resistance with the TB6600 while the motor is not stepping and set it to the rated value

It is usual to use the motor as the load for that purpose. Just don't disconnect the motor from the driver while the driver is powered as that is likely to destroy the driver instantly.

Also check with the driver documentation because some of them reduce the current to 70% of the set value when the motor is stationary.

There is good advice about setting the current limit on the Pololu DRV8825 web page. Obviously the details will differ for a TB6600.

...R

Zurent:
Hello,

No I didn’t. I only have a power supply with a 5.1 mm jack and one multimeter, when I measure the current in the coil I can’t measure at the power supply. However, I could go get more equipment if necessary, a lab power supply for example

Take the DMM out of the solenoid circuit and measure the powersupply voltage in fault condition.
You don't need the DMM to measure current to get the fault.
Tom... :slight_smile:

I encounter the same problem as you. i just get 2 nema 17 stepper motors for my robots

https://www.oyostepper.com/goods-45-Nema-Size-17-Stepper-Motor-Bipolar-45Ncm-64ozin-2A-42x40mm-4-Wires-w-1m-Cable-Connector.html

What is the motor torque? What is the leadscrew pitch? How much force do you need?