Torque for Stepper motor

Hey Guys,

I am using this Stepper Motor for my project which I am controlling with a Big Easy Driver. I am supplying the motor with this Power Supply of 24V 30W.

The device I am attaching to the motor is little heavy and it consists of 3 levers as shown in fig. I need these levers to go inside the device one by one while the motor rotates the device. In free rotation, as in without the levers the device is rotating but as soon as the levers are pushed inside, the motor jerks and does't rotate.

I suppose the torque is not sufficient. But I don't know how should I increase the torque. Should I change the power supply or increase the current from BED by it's inbuilt potentiometer? Or something other?

I'd be grateful if you guys can suggest me anything.

You motor wants 2.8A, you won't get that from a B.E.D. (Above 1.5A its probably too hot to be reliable). Geckodrive?

Are you sure its torque that's the problem? Could it be resonance? Are you using microstepping? How fast are you driving the motor?

Hi @MarkT thanks for your reply…

Are you using microstepping?

I am using the BED to default mode i.e MS1 MS2 MS3 all low…

Could it be resonance?

I have no idea about it…

As soon as the levers go into the slots and try to drive the motor, it jerks and vibrates. Otherwise it rotates fine.

I am using a code from Bildr.org

#define DIR_PIN 8
#define STEP_PIN 9
#define RELAY1  2
#define RELAY2  3
#define RELAY3  4
#define LED 12
#define SENSOR 5

int sensorVal;
int position_Motor = 0;
bool zeroPosition = 0;
void setup() {

  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
  pinMode(LED, OUTPUT);

  pinMode(SENSOR, INPUT_PULLUP);
  pinMode(LED, OUTPUT);

  digitalWrite(RELAY1, HIGH);
  digitalWrite(RELAY2, HIGH);
  digitalWrite(RELAY3, HIGH);

  digitalWrite(LED, LOW);

  Serial.begin(9600);
  delay(2000);
}



void loop() {
 if (zeroPosition == 0)
  {
  
  sensorVal = digitalRead(SENSOR);
if (sensorVal == LOW) {
  digitalWrite(12, LOW);
 
  zeroPosition = 1;
}
rotateOneStepForward(0.1);
}
  else {
    digitalWrite(LED, HIGH);
    digitalWrite(RELAY1, LOW);          // Turns ON Relays 1
    rotateDegAbsolute(90, .08);
    delay(1000);
    rotateDegAbsolute(-90, .08);                //reverse
    delay(2000);
    digitalWrite(RELAY1, HIGH);         // Turns Relay Off

    digitalWrite(RELAY2, LOW);          // Turns ON Relays 2
    rotateDegAbsolute(90, .08);
    delay(1000);
    rotateDegAbsolute(-90, .08);                //reverse
    delay(2000);
    digitalWrite(RELAY2, HIGH);         // Turns Relay Off

    digitalWrite(RELAY3, LOW);
    rotateDegAbsolute(90, .08);
    delay(1000);
    rotateDegAbsolute(-90, .08);                //reverse
    delay(2000);
    digitalWrite(RELAY3, HIGH);
  } 
}


void rotateDeg(float deg, float speed) {
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0) ? HIGH : LOW;
  digitalWrite(DIR_PIN, dir);

  int steps = abs(deg) * (1 / 0.225);
  float usDelay = (1 / speed) * 70;

  for (int i = 0; i < steps; i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}

void rotateDegAbsolute(float deg, float speed) {
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  

  int steps = deg * (1 / 0.225)-position_Motor;
  float usDelay = (1 / speed) * 70;


  int dir = (deg > 0) ? HIGH : LOW;
  digitalWrite(DIR_PIN, dir);

  for (int i = 0; i < abs(steps); i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);
if (dir == HIGH){position_Motor += 1;}
else {position_Motor -= 1;};
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}

void rotateOneStepForward(float speed) {
  //rotate one step
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  digitalWrite(DIR_PIN, HIGH);

  float usDelay = (1 / speed) * 70;
  
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(usDelay);

  digitalWrite(STEP_PIN, LOW);
  delayMicroseconds(usDelay);
}

I am not driving the motor fast, just the normal drive with 90deg+ and 90deg-

Geckodrive?

I was looking into this driver but didn’t quite understand whether it will work with my code and Arduino or not?

This is how the lever and device arrangement looks like.

First try modest microstepping, x4 or x8, see it that helps. Full steps are bad for resonance, physical damping is pretty much essential if using full steps, or keeping below the first resonance frequency (which is load dependent). A stepper in resonance cannot handle anything like its normal torque without skipping. Microstepping reduces the amount of vibration and thus reduces the severity of resonance. Its also a whole lot quieter.

@MarkT

First try modest microstepping, x4 or x8, see it that helps.

No luck with the micro stepping.

I am thinking to order TB6560 3.5A stepper motor driver. It's cheap and with specifications I think it will work.

Do you have any suggestions regarding this? I mean how efficient the driver is, because I need approximately 2.8A to produce full rated torque for my motor.

One more question, the supply I am using is rated for 24V 1.25A. Do you think should I replace the supply in order to get better results? Mainly concerned for the current rating.

Do you actually know what torque you need at what speed? Steppers torque ratings for pull-out at stationary are not the same as working torque at speed, in fact a lot different. A 2Nm pull-out torque motor is not going to drive a 2Nm load, ever.

The datasheet for the motor will have torque-speed curves, you need to check those out.

Power supply current depends on speed - it acts as a buck regulator but the output voltage depends on the motor speed (back EMF), so more current is needed as the motor is spun faster. You can make rough calculations if you know the back-EMF constant of your motor and the speed, and the power efficiency of the driver.