How to enable max stepper motor holding torque

Hello, this is my first time posting so I hope it's in the right spot!

I have a NEMA 23 motor (23HS30-2804S) connected to ST6600 driver which I want to use to lift something then hold it in place. By using a power supply which supplies 3A @ 32V and a simple pulse signal to the driver, I can turn the motor to lift up the object successfully.

But as soon as I stop the command to spin the motor, the load falls because the motor's holding torque is too low. It is so low that you can turn it by your hand if you try hard enough.

When the motor is idling with no step commands, I can see from the power supply that it's only drawing 0.1A (rated current of 2.8A/phase). Can anyone inform me on how this holding torque thing is supposed to work?

Thank you!

1 Like

Are you sure the driver isn't being disabled at idle? The motor should be pulling close to max current when energised and not rotating.

The driver has enable pins, I've made sure I've grounded both of them so driver is enabled. Are there any other ways to make sure?

Different drivers work in different ways, check the documentation.

Put a multimeter to read the current on a single wire between the driver and motor. That shouldn't drop at idle unless the driver is switching off. Be careful to connect it securely as it can potentially damage the driver if it disconnects when running.

If the driver has a switch for "standby" or "idle" current or some such, turn it OFF. Post a link to the driver's user manual.

Hi,
What have you got the current limit on the controller set to?

Do you have a DMM?

Thanks.. Tom.. :smiley: :+1: :coffee: :australia:

I tried searching everywhere but information is unfortunately scarce with this driver (school provided it for a project). I would have to assume it's quite similar to a TB6600...

This is the closest I've found to a link: Buy Cheap ST-6600 Bipolar Stepper Motor Driver Max 4A Current 40VDC Input 16 Subdivision Online with Wholesale Price - Oyostepper.com

Current limit is set to 3A since the motors themselves are 2.8A/phase.

Not quite sure what a DMM is, please enlighten me!

DMM = digital multimeter

If the motor is 2.8A and you are running anything other than full stepping then you are exceeding it's limits.

Look at the picture of the DFRobot TB6600 in the following link, yours should look similar, make a well lighted and focused picture or pencil & paper copy of yours, indicating how each switch is set (ON or OFF) and post it.
TB6600 drive

A post was split to a new topic: Stepper motor light and dark

Hi,
If you have a DMM, can you please;

  1. Measure the 3A @ 32V power supply voltage when you run the motor.
  2. Measure the power supply voltage when you have the motor stationary.
  3. Measure the power supply voltage when you turn the motor shaft by hand.

If your stepper is 2.8A, then in locked stationary mode, I believe, it will draw 2.8A per winding, so;
2 * 2.8 = 5.6A
The 0.1A you are measuring may be because the power supply has shut down.

Can you post a picture of your project, including the power supply?

Tom... :smiley: :+1: :coffee: :australia:

@ BenBakker
What would hold the gate open or closed if the motor were disabled?

The switches are set to 100101. This corresponds to 1/4 microstepping with 3A peak output. The dip switches are slightly different on the ST-6600 compared to the TB6600 you linked, but I assure you that ON OFF ON for switches 4 - 6 corresponds to 3A settings.

What about switch(es) for idle / standby current? That's why I asked for a picture.

I don't think there are switches for that. From what I recall (and I've lost the document) the state of the enable pin determines the idle behaviour. Something along the lines of low = enabled, high = disabled and floating = freewheel.

The OP needs to put a meter on a motor wire and see if the motor is pulling current at idle. If not, change the state of the enable pin. No harm in just trying to be honest - there's only three states, try them and see what happens.

Thanks for your responses!

Yes, I don't think there are any other switches on this driver other than those 6 dip switches. I will take a picture tomorrow, not with the hardware right now.

I will try playing around with the enable pin and see what it does. From what I understand, LOW = driver is sending power and enabled. HIGH = disabled and freewheeling. What would be the third state?

Thanks!

Third (if it has it) would be to not connect the pin. Then it would be active when stepping, and freewheel at idle.

The motor speed is reduced ( trough gears ) the gate being not heavy at all. Power off and tryed with 3 kilo no movement.

/* This Arduino Schetch wil open (in the morning) and close ( in the evening ) the gate from a chicken barn.
It makes use of an LDR sensor to measure the ligth intensity
The sketch is to control a stepper motor with ULN2003 driver board
controlled by Arduino UNO with use of the AccelStepper library for: acceleration and deceleration.
The driver board is from Phoenix Contact with the ULN 2003 driver chip
Modified by Ben Bakker 25-november 2021 */

/* This Arduino Schetch wil open (in the morning) and close  ( in the evening ) the gate from a chicken barn. 
   It makes use of an LDR sensor to measure the ligth intensity 
   The sketch is to control a stepper motor with ULN2003 driver board
   controlled by Arduino UNO with use of the AccelStepper library for: acceleration and deceleration.
   The driver board is from Phoenix Contact with the ULN 2003 driver chip
   Modified by Ben Bakker 25-november 2021 */


#include <AccelStepper.h>                  // Include the AccelStepper library:

                                            // Motor pin definitions:
#define motorPin1  9                        // IN1 on the ULN2003 driver
#define motorPin2 10                        // IN4 on the ULN2003 driver
#define motorPin3 11                        // IN3 on the ULN2003 driver
#define motorPin4 12                        // IN2 on the ULN2003 driver

#define MotorInterfaceType 8                // Define the AccelStepper interface type;
                                            // type 8 means 4 wire motor in half step mode:

// Initialize the pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper library for stepper motor:
AccelStepper stepper = AccelStepper(MotorInterfaceType, motorPin1, motorPin3, motorPin2, motorPin4);

const int startPin = A2;                    // Read the value of the LDR
const int sensorPin1 = 2;                   // Read the sensor ( read contact sensor ) (gate in closed position), for safety after power reset.
                                            // when the power for whatever reason is reset, the system is trying to re close the gate.
                                            // when the gate is already in the closed position, this creates mechanical problems.
const int sensorPin2 = 3;                   // Read the sensor ( reed contact sensor ) (gate in open position), for safety after power reset.
                                            // when the power for whatever reason is reset, the system is trying to re open the gate.
                                            // when the gate is already in the open position, this creates mechanical problems.
void setup(){                                        

stepper.setMaxSpeed(256);                   // maximum speed if more then 768 stepmotor becomes noisy
stepper.setAcceleration(200);               // Set the maximum acceleration in steps per second^2:


 Serial.begin(115200);                      // Set Serial port Baudrate to 115200
   pinMode(startPin, INPUT_PULLUP);         // Make pin A2 input with internal pullup, LDR  
   pinMode(sensorPin1, INPUT_PULLUP);       // Make pin 2 input with internal pullup
   pinMode(sensorPin2, INPUT_PULLUP);       // Make pin 3 input with internal pullup 
}                                           // End of Setup

void loop (){

 if (analogRead(startPin) <=400){           // Run steppermotor 5800 steps forward
       stepper.moveTo(5800);                // 5880 steps are needed for 3,8 revolution for a distance of 38 cm  
         stepper.runToPosition();           // Run to position with set speed and acceleration:  
          delay(1000);                      // To make it less sensative for small interuptions 
                                            // Power on steppermotor stayes consuming 0.5 Amp

    
   if (analogRead(startPin) >= 600){        // reverse direction, run back to original position:   
      delay(100);                           // Not needed but avoids contact bouncing in case of mechanical contacts
        stepper.moveTo(0);                  // Steps back 5800 steps to come back to start position
          stepper.runToPosition();          // Run back to start position with set speed and acceleration:  
           delay(1000);                     // To make it less sensative for very small interuptions
             }                               // End of closing the gate ( down )
           }                                   // End of Loop
        }   
                                            // Power on steppermotor stayes consuming 0.5 Amp
   

#include <AccelStepper.h> // Include the AccelStepper library:

                                        // Motor pin definitions:

#define motorPin1 9 // IN1 on the ULN2003 driver
#define motorPin2 10 // IN4 on the ULN2003 driver
#define motorPin3 11 // IN3 on the ULN2003 driver
#define motorPin4 12 // IN2 on the ULN2003 driver

#define MotorInterfaceType 8 // Define the AccelStepper interface type;
// type 8 means 4 wire motor in half step mode:

// Initialize the pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper library for stepper motor:
AccelStepper stepper = AccelStepper(MotorInterfaceType, motorPin1, motorPin3, motorPin2, motorPin4);

const int startPin = A2; // Read the value of the LDR
const int sensorPin1 = 2; // Read the sensor ( read contact sensor ) (gate in closed position), for safety after power reset.
// when the power for whatever reason is reset, the system is trying to re close the gate.
// when the gate is already in the closed position, this creates mechanical problems.
const int sensorPin2 = 3; // Read the sensor ( reed contact sensor ) (gate in open position), for safety after power reset.
// when the power for whatever reason is reset, the system is trying to re open the gate.
// when the gate is already in the open position, this creates mechanical problems.
void setup(){

stepper.setMaxSpeed(256); // maximum speed if more then 768 stepmotor becomes noisy
stepper.setAcceleration(200); // Set the maximum acceleration in steps per second^2:

Serial.begin(115200); // Set Serial port Baudrate to 115200
pinMode(startPin, INPUT_PULLUP); // Make pin A2 input with internal pullup, LDR
pinMode(sensorPin1, INPUT_PULLUP); // Make pin 2 input with internal pullup
pinMode(sensorPin2, INPUT_PULLUP); // Make pin 3 input with internal pullup
} // End of Setup

void loop (){

if (analogRead(startPin) <=400){ // Run steppermotor 5800 steps forward
stepper.moveTo(5800); // 5880 steps are needed for 3,8 revolution for a distance of 38 cm
stepper.runToPosition(); // Run to position with set speed and acceleration:
delay(1000); // To make it less sensative for small interuptions
// Power on steppermotor stayes consuming 0.5 Amp

if (analogRead(startPin) >= 600){ // reverse direction, run back to original position:
delay(100); // Not needed but avoids contact bouncing in case of mechanical contacts
stepper.moveTo(0); // Steps back 5800 steps to come back to start position
stepper.runToPosition(); // Run back to start position with set speed and acceleration:
delay(1000); // To make it less sensative for very small interuptions
} // End of closing the gate ( down )
} // End of Loop
}
// Power on steppermotor stayes consuming 0.5 Amp
...

The safety sensors are not yet in this sketch.
I also used instead of the IF (analog ..... the WHILE and BREAK but do not kno if you can have multiple sensrs in the while loop.
Tested with single sensors the sketch runs the same as with if