Steppermotoren drehen zu langsam

Hallo,

ich arbeite an einem Projekt für die Uni, in welchem ich mit einem Arduino Uno u.a. drei Stepper steuern möchte, von denen zwei immer parallel laufen. Grundsätzlich habe ich den Code soweit fertig aber leider laufen die Motoren sehr langsam (<1 U/s). Als Motoren verwende ich NEMA17 mit 200Steps/U und als Treiber zwei Adafruit Motor Shilds V2.3.. Ein Teil des Codes habe ich angehängt.

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include <AccelStepper.h>
#include <Servo.h>;

Adafruit_MotorShield AFMSbot(0x61); //Rechter Jumper geschlossen
Adafruit_MotorShield AFMStop(0x60); //Keine Jumper geschlossen

Adafruit_StepperMotor *Spindel_Links = AFMSbot.getStepper(200, 1); //Stepper anlegen (Schritte/U,Steckplatz auf Motorshild(1=links, 2=rechts))
Adafruit_StepperMotor *Spindel_Rechts = AFMSbot.getStepper(200, 2);

Adafruit_StepperMotor *Hebemotor = AFMStop.getStepper(200, 1);

Servo Schalterbetaetigung; //Pin10 = Äußere Pins auf Motorshild (gelb rechts)

boolean Endschalter_Druckplatte;
boolean Endschalter_Klingenarm;
boolean Endschalter_Hauptarm;
boolean Automatikmodus;
boolean Einmalige_Abloesung;
boolean Abloesevorgang;
int Taster_Automatik;
int Taster_Abloesung;
int Taster_Automatik_Zaehler;
int Taster_Abloesung_Zaehler;
int Taster_Automatik_Letzter_Status;
int Taster_Abloesung_Letzter_Status;
int LED_Gruen = 7;
int LED_Blau = 8;
int LED_Gelb = 9;
int i = 0;
int j = 0;
unsigned long Zeitstempel1;

void forwardstep1() {
  Spindel_Links->onestep(FORWARD, SINGLE);}
void backwardstep1() {
  Spindel_Links->onestep(BACKWARD, SINGLE);}

void forwardstep2() {
  Spindel_Rechts->onestep(FORWARD, SINGLE);}
void backwardstep2() {
  Spindel_Rechts->onestep(BACKWARD, SINGLE);}

void forwardstep3() {
  Hebemotor->onestep(FORWARD, SINGLE);}
void backwardstep3() {
  Hebemotor->onestep(BACKWARD, SINGLE);}

AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);
AccelStepper stepper3(forwardstep3, backwardstep3);

void setup() {

  pinMode(2, INPUT); //Endschalter_Druckplatte
  pinMode(3, INPUT); //Endschalter_Klingenarm
  pinMode(4, INPUT); //Endschalter_Hauptarm
  pinMode(5, INPUT); //Taster_Automatik (Blauer Knopf)
  pinMode(6, INPUT); //Taster_Ablösung (Gelber Knopf)
                     //Taster_Reset(Grüner Knopf)
  pinMode(7, OUTPUT); //Grüne LED = Gerät bereit (Strom vorhanden)
  pinMode(8, OUTPUT); //Blaue LED = Automatikmodus an
  pinMode(9, OUTPUT); //Gelbe LED = Ablösevorgang läuft
  Schalterbetaetigung.attach(10);  //Servo

  digitalWrite(LED_Gruen, HIGH);  //Grüne LED an
  Automatikmodus = false;
  Einmalige_Abloesung = false;
  Abloesevorgang = false;

  AFMSbot.begin(); // Start bottom shield
  AFMStop.begin(); // Start top shield

  
  stepper1.setAcceleration(10000); //Beschleunigung
  
  
  stepper2.setAcceleration(10000);
  
  stepper3.setMaxSpeed(40);
  stepper3.setAcceleration(100.0);
  
  Zeitstempel1 = millis();
  }

void loop() {
  Endschalter_Druckplatte = digitalRead(2);
  Endschalter_Klingenarm = digitalRead(3);
  Endschalter_Hauptarm = digitalRead(4);
  Taster_Automatik = digitalRead(5);
  Taster_Abloesung = digitalRead(6);
  

//Hauptarm und Klingenarm fahren in Endschalter, sobald Endschalter Druckplatte nicht gedrückt ist
  if (Endschalter_Druckplatte == false)
  {if(Endschalter_Hauptarm == false)
  {stepper3.move(-200);
  stepper3.run();}
  if (Endschalter_Hauptarm == true)
  {Hebemotor->release();}
  }

  if (Endschalter_Druckplatte == false)
  {if (Endschalter_Klingenarm == false)
  {stepper1.move(-200);
  stepper2.move(-200);
  stepper1.run();
  stepper2.run();}
  if (Endschalter_Klingenarm == true)
  {Spindel_Links->release();
  Spindel_Rechts->release();}
  }

Weiß jemand wie ich die Drehzahl erhöhen kann? Bereits 2 U/s würden mir ungemein helfen.

Vielen Dank im Voraus.

sketch_jan06b.ino (3.35 KB)

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Welcher uC wird verwendet?

Ich verwende einen Arudino Uno Rev. 3.

luc_2710:
Ein Teil des Codes habe ich angehängt.

Teile des Codes sind immer schlecht, weil man nicht weis, ob das Problem im nicht geposteten Teil liegt.
Ich sehe z.B. nicht wo Du überhaupt die Geschwindigkeit von Stepper 1+2 setzt. Standard ist 1Step/Sec, was ja nicht gerade flott ist.

Auch das:

  if (Endschalter_Druckplatte == false)
  { if (Endschalter_Klingenarm == false)
    { stepper1.move(-200);
      stepper2.move(-200);
      stepper1.run();
      stepper2.run();
    }

erscheint mir suspekt. Da setzt Du bei jedem loop-Durchlauf die Zahl der zu fahrenden Steps erneut. Ist das tatsächlich so gewollt? Ich glaube, Du hast die Funktionsweise der AccelStepper noch nicht ganz verstanden. Die Aufrufe sind ja nicht blockierend. D.h. der Sketch bleibt da nicht stehen, bis die 200 Schritte ausgeführt sind.

Danke für die schnelle Rückmeldung. Der Rest des Codes ist ähnlich aufgebaut, aber wenn ich nur den geposteten Teil aufspiele und laufen lasse, sind die Motoren auch nicht schneller.

Mit move hatte ich nur etwas rumprobiert eigentlich nutze ich MoveTo, aber selbst dann sind die Motoren nicht schneller.

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include <AccelStepper.h>
#include <Servo.h>;

Adafruit_MotorShield AFMSbot(0x61); //Rechter Jumper geschlossen
Adafruit_MotorShield AFMStop(0x60); //Keine Jumper geschlossen

Adafruit_StepperMotor *Spindel_Links = AFMSbot.getStepper(200, 1); //Stepper anlegen (Schritte/U,Steckplatz auf Motorshild(1=links, 2=rechts))
Adafruit_StepperMotor *Spindel_Rechts = AFMSbot.getStepper(200, 2);

Adafruit_StepperMotor *Hebemotor = AFMStop.getStepper(200, 1);

Servo Schalterbetaetigung; //Pin10 = Äußere Pins auf Motorshild (gelb rechts)

boolean Endschalter_Druckplatte;
boolean Endschalter_Klingenarm;
boolean Endschalter_Hauptarm;
boolean Automatikmodus;
boolean Einmalige_Abloesung;
boolean Abloesevorgang;
int Taster_Automatik;
int Taster_Abloesung;
int Taster_Automatik_Zaehler;
int Taster_Abloesung_Zaehler;
int Taster_Automatik_Letzter_Status;
int Taster_Abloesung_Letzter_Status;
int LED_Gruen = 7;
int LED_Blau = 8;
int LED_Gelb = 9;
int i = 0;
int j = 0;
unsigned long Zeitstempel1;

void forwardstep1() {
  Spindel_Links->onestep(FORWARD, SINGLE);}
void backwardstep1() {
  Spindel_Links->onestep(BACKWARD, SINGLE);}

void forwardstep2() {
  Spindel_Rechts->onestep(FORWARD, SINGLE);}
void backwardstep2() {
  Spindel_Rechts->onestep(BACKWARD, SINGLE);}

void forwardstep3() {
  Hebemotor->onestep(FORWARD, SINGLE);}
void backwardstep3() {
  Hebemotor->onestep(BACKWARD, SINGLE);}

AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);
AccelStepper stepper3(forwardstep3, backwardstep3);

void setup() {

  pinMode(2, INPUT); //Endschalter_Druckplatte
  pinMode(3, INPUT); //Endschalter_Klingenarm
  pinMode(4, INPUT); //Endschalter_Hauptarm
  pinMode(5, INPUT); //Taster_Automatik (Blauer Knopf)
  pinMode(6, INPUT); //Taster_Ablösung (Gelber Knopf)
                     //Taster_Reset(Grüner Knopf)
  pinMode(7, OUTPUT); //Grüne LED = Gerät bereit (Strom vorhanden)
  pinMode(8, OUTPUT); //Blaue LED = Automatikmodus an
  pinMode(9, OUTPUT); //Gelbe LED = Ablösevorgang läuft
  Schalterbetaetigung.attach(10);  //Servo

  digitalWrite(LED_Gruen, HIGH);  //Grüne LED an
  Automatikmodus = false;
  Einmalige_Abloesung = false;
  Abloesevorgang = false;

  AFMSbot.begin(); // Start bottom shield
  AFMStop.begin(); // Start top shield

  stepper1.setSpeed(400);
  stepper1.setAcceleration(10000); //Beschleunigung
  
  stepper2.setSpeed(400);
  stepper2.setAcceleration(10000);
  
  stepper3.setMaxSpeed(40);
  stepper3.setAcceleration(100.0);
  
  Zeitstempel1 = millis();
  }

void loop() {
  Endschalter_Druckplatte = digitalRead(2);
  Endschalter_Klingenarm = digitalRead(3);
  Endschalter_Hauptarm = digitalRead(4);
  Taster_Automatik = digitalRead(5);
  Taster_Abloesung = digitalRead(6);
  

//Hauptarm und Klingenarm fahren in Endschalter, sobald Endschalter Druckplatte nicht gedrückt ist
  if (Endschalter_Druckplatte == false)
  {if(Endschalter_Hauptarm == false)
  {stepper3.moveTo(-200);
  stepper3.run();}
  if (Endschalter_Hauptarm == true)
  {Hebemotor->release();}
  }

  if (Endschalter_Druckplatte == false)
  {if (Endschalter_Klingenarm == false)
  {stepper1.moveTo(-200);
  stepper2.moveTo(-200);
  stepper1.run();
  stepper2.run();}
  if (Endschalter_Klingenarm == true)
  {Spindel_Links->release();
  Spindel_Rechts->release();}
  }

setSpeed ändert in dem Fall auch nicht die Geschwindigkeit, mache ich da irgendetwas grundlegend falsch?

Hallo,

ich denke für die beiden Stepper1 und 2 fehlt der Bezugspunkt stepper.setMaxSpeed(300) im Setup.

Heinz

Also setMaxSpeed hat zumindest das Problem mit der Geschwindigkeitseinstellung behoben. Aber die Motoren drehen nicht schneller als etwas mehr als 1 U/s auch wenn ich setSpeedMax über 500 stelle.

  stepper1.setMaxSpeed(300);
  stepper1.setAcceleration(100); //Beschleunigung
  
  stepper2.setMaxSpeed(300);
  stepper2.setAcceleration(100);
  
  stepper3.setMaxSpeed(40);
  stepper3.setAcceleration(100.0);
  
  Zeitstempel1 = millis();
  }

void loop() {
  Endschalter_Druckplatte = digitalRead(2);
  Endschalter_Klingenarm = digitalRead(3);
  Endschalter_Hauptarm = digitalRead(4);
  Taster_Automatik = digitalRead(5);
  Taster_Abloesung = digitalRead(6);
  

//Hauptarm und Klingenarm fahren in Endschalter, sobald Endschalter Druckplatte nicht gedrückt ist
  if (Endschalter_Druckplatte == false)
  {if(Endschalter_Hauptarm == false)
  {stepper3.move(-200);
  stepper3.run();}
  if (Endschalter_Hauptarm == true)
  {Hebemotor->release();}
  }

  if (Endschalter_Druckplatte == false)
  {if (Endschalter_Klingenarm == false)
  {stepper1.moveTo(20000);
  stepper2.moveTo(20000);
  stepper1.run();
  stepper2.run();}
  if (Endschalter_Klingenarm == true)
  {Spindel_Links->release();
  Spindel_Rechts->release();}
  }
}

Wenn ich die Frequenz TWI.FREQ in der library twi.h von 100kHz auf einen höheren Wert setze, laufen die Motoren schneller. Aber ist das der richtige weg oder führt das eher zu Problemen. Wenn nicht, bis zu welcher Frequenz funktioniert das?

luc_2710:
Wenn ich die Frequenz TWI.FREQ in der library twi.h von 100kHz auf einen höheren Wert setze, laufen die Motoren schneller. Aber ist das der richtige weg oder führt das eher zu Problemen. Wenn nicht, bis zu welcher Frequenz funktioniert das?

Dann blockiert wohl die I2C Übertagung für die Stepper deinen Sketch extrem. Offensichtlich ist das Adafruit-Shield nicht für dich geeignet, da es alles über den I2C Flaschenhals übertragen muss.
Nimm ein Shield mit den 'klassischen' Treibern A4988 oder DRV8255.
Welche Stepper hast Du eigentlich? Die meisten der erhältichen Stepper sind für Stromtreiber wie die oben angegebenen vorgesehen. Die passen aber nicht zu den Adafruit Shield - das braucht spannungsgesteuerte Stepper.

Moin,

Warum werden eigentlich immer die (ich nenn sie mal) "alten" A4988 und DRV8255 empfohlen? Ich hab die auch. Auch in 3D Druckern. Später hab ich die auf TMC2208 und TMC2209 umgebaut und habe dabei gefühlt einen Quantensprung gemacht. Die Motoren sind dadurch flüsterleise. Wenn ein Drucker auf 3 Achsen fährt hört man keinen Motor mehr. Gibts mit den TMCs irgendwelche Nachteile, weswegen sie nicht mit den Arduinos verwendet werden? (....klar, man hört die Schritte nicht mehr :o )

Lieben Gruß,
Chris

Reine Gewohnheit :wink: aber eigentlich hast Du schon recht. Gibt's ja sogar in weitgehend kompatibler Bauform. Sind aber auch komplexer zu konfigurieren.
Ändert aber nichts an dem grundsätzlichen Problem hier.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.