Motor Ansteuern

Hallo,
Ich habe eine Arduino Mega und einen Treiber TB6600. Wenn das Programm anfängt habe ich folgendes Problem. Mein Motor macht viele kleine Schritte in beide Richtungen in ganz kurzer Zeit. Er soll ja eigentlich durch die doch recht hohe angabe wenigsten ein bischen verfahren bevor er wieder zurück fährt. Vieleicht könnt ihr mir bei der Fehlersuche helfen. Vielen Dank schon einmal

int dirpin_x = 51;
int pull_x = 49;
int enable_x = 53;

void set_dir_x(int dir);

void do_steps_x(int step_count , int delay_microseconds);

void setup() {

  pinMode(dirpin_x, OUTPUT);
  pinMode(pull_x, OUTPUT);
  pinMode(enable_x, OUTPUT);
  
  digitalWrite(enable_x, LOW);

 
  delay(100);
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {

  set_dir_x(1);
  do_steps_x(6000, 100);

  delay(500);

  set_dir_x(-1);
  do_steps_x(6000, 100);
}

void set_dir_x(int dir)
{
  if (dir < 0)
    digitalWrite(dirpin_x, HIGH); // Set the direction.
  else
    digitalWrite(dirpin_x, LOW); // Set the direction.
}

void do_steps_x(int step_count , int delay_microseconds)
{
  for (int i  = 0; i < step_count; i++)
  {
    digitalWrite(pull_x, HIGH); // This LOW to HIGH change is what creates the
    delayMicroseconds(delay_microseconds);
    digitalWrite(pull_x, LOW);
    delayMicroseconds(delay_microseconds);
  }
}

Aufgrund des Sketches würde ich erwarten, dass der Motor eine gute halbe Sekunde vorwärts fährt und dann eine halbe Sekunde rückwärts. Allerdings müsstest Du noch schauen, ob Dein Motor überhaupt mit dieser Geschwindigkeit (10kHz) angesteuert werden kann. Falls nicht könnte er in ein Knattern versinken und eher unkontrolliert in irgendeine Richtung drehen.

Ich benutze einen Nema 17.
Was müsste ich dafür am besten ändern ?

Nema 17 ist eine Grössenangabe, sagt aber nichts über Leistung, Ansprechverhalten, etc. aus. Hast Du einen Link auf das Datenblatt?

Was müsste ich dafür am besten ändern ?

Ersetze mal den Wert 100 in den do_steps-Aufrufen durch 10000, eine Frequenz von 100 Hz dürften die meisten Schrittmotoren hinkriegen.

das war dieser hier von ebay

Die Angaben sind leider etwas mager, also bleibt Dir wohl nichts anderes übrig, als mit kleinen Geschwindigkeiten zu beginnen, diese langsam zu steigern und dann das so einzustellen, dass Du noch verlässliche Bewegung kriegst. Hat's mit 100Hz geklappt?

leider nicht :frowning:

Guten Morgen,
ich habe einmal ein paar Fotos der Verkabelung gemacht. Evt hab ich dort ja einen Fehler eingebaut ohne es zu Merken. Der Arduino läuft im Moment nur mit 5V über USB.

Treiber TB6600
NEMA 17 Stepper Motor 26ncm 12v 0.4a 3d Pinter CNC RepRap Robot online kaufen | eBay

Die passen überhaupt nicht zusammen!
Du bräuchtest eher einen solchen Motor, für deinen Treiber:
http://www.ebay.de/itm/262037025865
Dann ist der Treiber immer noch überdimensioniert, sollte aber kein Problem sein.

Ich vermute folgende Probleme:

  1. Deine Versorgungsspannung beträgt 24V, wenn ich deinem Foto glauben darf. Der Motor hat einen Spulenwiderstand von 30 Ohm, was bei unbegrenztem Strom zu einem Fluss von 24V/30Ohm = 0,8A je Spule. Das ist das Doppelte von dem, was maximal für deinen Stepper zulässig ist.
    Wenn dein Treibermodul eine Strombegrenzungsmöglichkeit hat, das ist normalerweise bei diesen Treibern der Fall, dann stelle zunächst unbedingt den Wert auf 0,4A oder knapp darunter, je nachdem, was die Einstellung hergibt.

  2. Kann leider den Typ des Treibers nicht ablesen, sonst müsste ich nicht raten: Meist haben diese Treiber intern Optokoppler an Bord. Da gibt es 2 Grundschaltungen: Entweder "common anode" oder "common cathode". Im ersten Fall verbindet man alle + Pins des Treibers mit +5V des Arduinos und die - Pins mit den jeweiligen Ausgängen des Arduinos, die Dir, Step und Ena ansteuern. Deine aktuelle Verschaltung ist richtug, wenn dein Treiber ein "common cathode" Typ wäre. Aber: durch die Verbindung von Power GND (24 V Motorspannungsquelle) machst du die physikalische Trennung von Logik und Power wieder zunichte. Bei Optokoppler Treibern werden Logikversorgungsspannung und Motorversorgungsspannung NICHT verbunden. Also auf jeden Fall die GND Verbindung des 24V Teils abkabeln.

  3. Da das Teil einen enable Eingang besitzt, nutze dieses im Setup als allerersten Befehl, nachdem du den pinMode dazu auf OUTPUT gesetzt hast und "disable" mit HIGH oder LOW - je nach Typ (common anode, common cathode), dann ruckelt der Motor nicht zu Beginn, bis stabile Verhältnisse herrschen. Erst danach die beiden Befehle, um die pinModes fpr STEP und DIR setzen. Dann Enable mit dem inversen Kommando (LOW oder HIGH) enablen, wenn der Motor laufen soll - zwischen enable-Befehl und dem ersten Motorbefehl danach am besten 1-2ms delay einbauen - stört und stoppt hier nicht/kaum, sorgt aber dafür, dass sich im Treiber nach dem disable-Zustand stabile Verhältnisse eingestellt haben.

Das mache ich so in einem Projekt, wo die Stepper nur alle paar Sekunden für ca. 1-2sec loslaufen und KEINE LAST zwischendurch im stromlosen Zustand abverlangt wird - in deinem Fall scheint es sich aber um die zukünftige Ansteuerung einer z-Achse (CNC) zu handeln: diese braucht aber immer eine Haltekraft, um die schwere Spindel in Position zu halten, also kein Disable möglich, es sei denn dein Treiber kann den Haltestrom per Befehl auf ein niedrigeres Niveau absenken, um dann bei verlangter Bewegung wieder volles Moment zu geben.

Ich habe eine Arduino Mega und einen Treiber TB6600

TB6600 ist nur der zentrale Powerchip des Treibers und es gibt mittlerweile unzählige Varianten davon, die sich in etlichen Merkmalen unterscheiden.
Um dir präzisere Infos nachzureichen, wäre es gut, wenn du den genauen Treibertyp benennen oder einen link zum Datenblatt postest.

dann stelle zunächst unbedingt den Wert auf 0,4A oder knapp darunter, je nachdem, was die Einstellung hergibt.

Die passen nicht zusammen.

Die passen nicht zusammen.

Korrekt, wenn du es aus einer optimierten technischen Sicht betrachtest.
Dennoch kriegt man die beiden nicht zusammenpassenden Teile ans Laufen, wenn man den Treiberstrom auf unter 0,4A einstellen kann (was ich aber nicht weiß, da der exakte Typ nicht bekannt ist).

Dann hätte @flowers aber schon mal ein Erfolgerlebnis und wir können ihn anschließend über besser zusammenpassende Teile beraten - wenn wir seine genauen Anwendungspläne in Erfahrung bringen können.

0,4A einstellen kann (was ich aber nicht weiß, da der exakte Typ nicht bekannt ist).

Laut Produktfotos: Kleinste Einstellung 0,5A

Um noch ein ansprechendes Drehmoment bei einiger Drehzahl zu erreichen, müsste man da mit vollen 40V drauf gehen. Und selbst dann wird man nicht viel erreichen. Außer, dass der Motor glühend heiß wird.

Dann hätte @flowers aber schon mal ein Erfolgerlebnis und wir können ihn anschließend über besser zusammenpassende Teile beraten - wenn wir seine genauen Anwendungspläne in Erfahrung bringen können.

Da bin ich mir nicht sicher...

Ein herzerfrischend kenntnisfreier flowers hat Kaufentscheidungen anhand irgendwelcher, hier offensichtlich irrelevanter, Kriterien getroffen. Jetzt könnte ich nachtreten, und sagen: "Mache dich vorher kundig." Aber das mag ich nicht.

Oder sagen:
"Die Kombination tuts nicht.
Kaufe den anderen Motor."

Ich reiche den link nach der Treiber

Das hier ist eigentlich mein zweites Projekt und in meinem ersten habe ich die gleichen Treiber und gleichen Schrittmotoren verwendet. Hatte mir ein Weizeneinschenker gebastelt. Hier der Code von damals.

#include <Stepper.h>

Stepper stepper(200, 2, 3, 4, 5);

//motor pins
int dirpin_glas = 8;
int pull_glas = 9;
int enable_glas = 10;

int dirpin_flasche = 12;
int pull_flasche = 11;
int enable_flasche = 13;

int pos = 1;
int neg = -1;

void set_dir_flasche(int dir);
void set_dir_glas(int dir);
void do_steps_glas(int step_count , int delay_microseconds);
void do_steps_flasche(int step_count , int delay_microseconds);

void drehen();

void setup() {

  stepper.setSpeed(100);
  pinMode(A2, OUTPUT); pinMode(A3, OUTPUT);
  digitalWrite(A2, LOW); digitalWrite(A3, HIGH);
  // motoren
  pinMode(dirpin_glas, OUTPUT);
  pinMode(pull_glas, OUTPUT);
  pinMode(enable_glas, OUTPUT);

  pinMode(dirpin_flasche, OUTPUT);
  pinMode(pull_flasche, OUTPUT);
  pinMode(enable_flasche, OUTPUT);

  digitalWrite(enable_glas, LOW);
  digitalWrite(enable_flasche, LOW);

  //button
  pinMode(A0, OUTPUT);
  digitalWrite(A0, HIGH);
  delay(100);
  pinMode(A1, INPUT);

  delay(100);

  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // Fahren in Oberste Position

  while ( analogRead(A1) >  2)
    ;

  digitalWrite(enable_glas, LOW);
  digitalWrite(enable_flasche, LOW);
  delay(100);

  Serial.println("buttton wurde gedrueckt");
  Serial.println("Phase 1");

  float glas_counter = 0;

  set_dir_flasche(pos);
  set_dir_glas(pos);
  // anfahren bis kurz vor den Einschüttmoment
  for (int i = 0; i < 27000 ; i++) {

    if ((int)glas_counter <= i) {
      do_steps_flasche(1, 100);
      glas_counter += 1.066666;
    }
    do_steps_glas(1, 100);

  }

  Serial.println("Phase 2");
  //  Einschüttmoment
  do_steps_flasche(4000, 100);

  //  Glas füllen
  set_dir_glas(neg);
  glas_counter = 0;
  for (int i = 0; i < 17000 ; i++) { //18000
    if ((int)glas_counter <= i) {
      do_steps_flasche(1, 1000);
      glas_counter += 3;
    }
    do_steps_glas(1, 1000);
  }

  //falsche zurück und glas nach unten
  set_dir_flasche(neg);
  glas_counter = 0;
  for (int i = 0; i < 10000 ; i++) {
/*    if ((int)glas_counter <= i) {
      do_steps_flasche(1, 200);
      glas_counter += 3;
    }*/
    do_steps_flasche(1, 200);
    do_steps_glas(1, 200);
  }

  do_steps_flasche(6000, 200);

  //flasche Drehen
  delay(500);
  drehen();

  //schaum füllen
  set_dir_flasche(pos);
  do_steps_flasche(12000, 100); //5000
  do_steps_flasche(6000, 100); //5000
  //fahre flasche auf null position
  delay(1000);
  set_dir_flasche(neg);
  do_steps_flasche(5000, 100);
  do_steps_flasche(31312, 100); //32312

  digitalWrite(enable_glas, HIGH);
  digitalWrite(enable_flasche, HIGH);

  //while (1);

}

void drehen()
{
  for (unsigned int j = 0; j < 35; j += 1)
    for (unsigned int i = 0; i < 20000; i += 1)
    {
      // put your main code here, to run repeatedly:
      digitalWrite(A2, HIGH);
      delayMicroseconds(3);
      // Approximately 10% duty cycle @ 1KHz
      digitalWrite(A2, LOW);
      delayMicroseconds(3);
    }
}

void do_steps_flasche(int step_count , int delay_microseconds)
{
  for (int i  = 0; i < step_count; i++)
  {
    digitalWrite(pull_flasche, LOW); // This LOW to HIGH change is what creates the
    delayMicroseconds(delay_microseconds);
    digitalWrite(pull_flasche, HIGH);
    delayMicroseconds(delay_microseconds);
  }
}

void set_dir_flasche(int dir)
{
  if (dir < 0)
    digitalWrite(dirpin_flasche, LOW); // Set the direction.
  else
    digitalWrite(dirpin_flasche, HIGH); // Set the direction.
}

void set_dir_glas(int dir)
{
  if (dir < 0)
    digitalWrite(dirpin_glas, LOW); // Set the direction.
  else
    digitalWrite(dirpin_glas, HIGH); // Set the direction.
}

void do_steps_glas(int step_count , int delay_microseconds)
{

  for (int i  = 0; i < step_count; i++)
  {
    digitalWrite(pull_glas, LOW); // This LOW to HIGH change is what creates the
    delayMicroseconds(delay_microseconds);
    digitalWrite(pull_glas, HIGH);
    delayMicroseconds(delay_microseconds);
  }
}

und gleichen Schrittmotoren verwendet

Sicher?

Bedenke:
Nema17 ist nicht das gleiche, wie Nema17

PS:
Mit welcher Spannung versorgst du den Treiber?

Aber für eine Kaufempfehlung bin ich auch zu haben. Das Projekt ist eh etwas teurer geworden und nun spielt das auch keine Rolle mehr. Es soll ja funktionieren.
Was ich umbedingt noch loswerden will. Danke das ihr mir so tatkräftig zur Seite steht !

Hier das Video vom Einschenker

Treiber sind an ein 24V Netzteil angeschlossen.

Habe aber schon aus der "alten" Maschine einen Nema ausgebaut und Probeweise angeschlossen. auch ein Wechsel der Treiber hat leider keinen erfolg gebracht

Heißt das, dass du in der "alten" Maschine den Treiber mit einem Stepper am Laufen hattest? Oder war das ein anderer Treiber? Ich habe leider auch nicht aus deinem link herausfinden können, ob Optokoppler verbaut sind und somit auch nicht, ob es sich um common anode oder common cathode handelt.

Übrigens: dein auf den Bildern gezeigter Treiber lässt sich nur auf 0,5A begrenzen, was auf Dauer deinen Motor, der nur 0,4A verträgt, schrotten wird. Daher hatte @combie recht mit der Fehldimensionierung, da dein Treiber für diesen Motor zuviel an Strom, selbst auf der kleinsten Stufe, liefert.

Übrigens2:
Bitte vermeide in Zukunft die Gleichsetzung des Begriffs Nema mit einem bestimmten Steppertyp oder noch simpler als Äquivalent zu einem Steppermotor. Wenn du von Nema 17 sprichst, dann bedeutet das nur die mechanischen Dimensionen der Stirnplatte (Kantenlänge: 17/10 von einem Zoll); du wirst aber dutzende Nema17 mit sehr unterschiedlichen Motoreigenschaften (Widerstand, Induktivität, max. Stromstärke, Drehmoment etc.) finden.
Daher immer den genauen Motortyp benennen oder idealerweise direkt einen link zum Datenblatt mitliefern.

Ich habe vorhin mal nachgemessen.

PUL+ (+5V) zu Pul-(PUL) = -5,3V
DIR+ (+5V) zu DIR-(DIR) = -5,3V
ENA+ (+5v) zu ENA-(ENA) = -6,4V

könnte es doch sein das ich die GND und die Kabel vom Arduino tauschen muss ? sollte da nicht ein positiver Wert herrauskommen ?