Stepper-Servo ansteuern

Hallo,
ich beschäftige mich zur Zeit mit Schrittmotoren. Leider klappt die Ansteuerung des Schrittmotres nicht so wie ich es gerne hätte. Ich kann ihn einmal oder mehrmals umkreisen lassen -das funktioniert soweit aber wenn Ihn als sekundenzeiger programmieren möchte und er nach einer minute eine komplette umdrehung gemacht haben sollte tauchen genau da die Probleme auf. Nach einer minute hat er nicht mal die komplette Umdrehung geschafft. Ich musste in meinen Programm die Schritte einzeln manipulieren als ich sie selber rechnerisch ausgrechnet hatte. Da er für eine Umdrehung 200 Schritte braucht habe ich dies einfach durch 60 geteilt und komme auf 3.3 Schritte pro sekunde. Für die erste Hälte der Umdrehung mutte ich 6 schritte laufen lassen ab der zweiten musste es 1 schritt mehr sein damit er genau innerhalb dieser zeit die eine umdrehung schafft. Da mein Schrittmotor einen Schrittwinkel von 1.8 hat braucht er ja 200 Schritte für diese Umdrehung. Ich würde gerne die Schrittzahl für eine Umdrehung erhöhen. Leider geht das nicht in meinem Programm:(. Er macht trotzdem seine 200 Schritte pro umdrehung.

Ich habe einen bipolaren Schrittmotor ohne Mittelanzapfung und schließe es an mein MotorShield v.2.3 an nicht 2.0!. Ob es bei diesen Shields einen Unterschied gibt weiss ich werde ich noch danach googlen. Im Prinzip müsste es wie das alte Shiled auf die gleiche Weise angesteuert werden.

Hoffe ihr könnt mir dabei helfen

Sekundenzeiger_mit_Stepper.ino (1.82 KB)

AdrianG90:
Da er für eine Umdrehung 200 Schritte braucht habe ich dies einfach durch 60 geteilt und komme auf 3.3 Schritte pro sekunde.

Ganz schöner Rundungsfehler, oder?

Ich würde mal eher so herum rechnen: Du mußt 200 Schritte in 60000 Millisekunden machen, das sind also 1 Schritt in 60000/200= 300 Millisekunden.

Guckst Du zu wie der Millisekundenzähler läuft.
Machst Du alle 300 Millisekunden einen einzelnen Schritt.
Dann sind nach 60000 Millisekunden 200 Schritte gemacht.
Rundungsfehler entfallen.
So what, wo liegt das Problem?

und einfach den Schrittmotor alle 60/200 Sekunden einen Schritt machen lassen gefällt Dir nicht??
Scheibe mal den Link zu deinem Motorshield.
Grüße Uwe

Hier ist der Link zu meinem Motorshield nur das meiner die Version v.2.3 hat aber sieht genauso gleich auch mit den gleichen ics

also wenn ich 60/200 sec rechnen sollte dann müsste ich bei der funktion motor->step(0.3,FORWARD,DOUBLE); einsetzen oder ?

AdrianG90:
also wenn ich 60/200 sec rechnen sollte dann müsste ich bei der funktion motor->step(0.3,FORWARD,DOUBLE); einsetzen oder ?

Ohne Deine Library zu kennen, würde ich mal vermuten, dass keine Bruchteile eines Steps ausgeführt werden können, sondern nur ganze Steps.

Also vermutlich entweder:

void loop() {
  myMotor->step(1, FORWARD, SINGLE);
  delay(300);
}

Oder mit Doppelschrittansteuerung:

void loop() {
  myMotor->step(1, FORWARD, DOUBLE);
  delay(150);
}

Wobei das Timing auf diese Art mit delay() nicht besonders präzise ist, das müßte man für eine reale Anwendung sicher etwas genauer ansteuern.

Und ob Du nach jedem Schritt wirklich das noch zusätzlichen machen kannst:

    myMotor->release();

um den Haltestrom der Wicklungen abzuschalten, müßtest Du ausprobieren. Wenn ein Steppermotor stromlos ist, hat er keine Haltekraft mehr und dann bewegen sich die Zeiger, wenn sich eine Fliege draufsetzt. Oder durch die Schwerkraft der Zeiger, wenn sie nicht genau nach unten und oben zeigen. Möglicherweise.

ich hab jetzt versucht einige dinge zu ändern und gleichzeichtig noch ein timer programmiert um zu überprüfen ob der zeiger auf dahin kommt wo er auch begonnen hat. Hab den timer auf 900 ms heruntergesetzt weil das Programm ja auch noch einige Millisekunden Bearbeitungszeit benötigt dennoch habe ich immer nach jeder minute einige sekunden Verzögerung.
Ich betreibe mein Schrittmotor gerade im Halbschrittmodus. Deswegen sollte er die Schritte daher feiner machen. Aber irgendwie komme ich nicht weiter :frowning: Habe ich hier was entscheidendes vergessen?

Sekundenzeiger_mit_Stepper.ino (2.54 KB)

AdrianG90:
Deswegen sollte er die Schritte daher feiner machen. Aber irgendwie komme ich nicht weiter :frowning: Habe ich hier was entscheidendes vergessen?

Wenn Du in großen Zeitabständen stets ein halbes Dutzend Schritte auf einmal machst, machst Du natürlich keine feinen Schritte:

myMotor->step(6, 1, INTERLEAVE);

Dann ruckt der Zeiger: Lange warten, 6 Schritte auf einmal, lange warten, 6 Schritte auf einmal.

Eine Feinsteuerung machst Du, indem Du in gleichmäßigen Zeitabständen jeweils EINEN einzigen Schritt machst.
Kurz warten, ein Schritt, kurz Warten, ein Schritt, kurz Warten, ein Schritt. So wird im Feinantrieb ruckfrei gesteuert.

Und meinen Hinweis auf das merkwürdige "myMotor->release();" im Code, und dass damit der Motor frei herumschlackern kann und Du damit keine präzise Steuerung hinbekommen kannst, hast Du irgendwie nicht verstanden oder es ist Dir egal, dass der Motor zwischen den angesteuerten Schritten im quasi "Freilauf" machen kann was er möchte?

vielen dank jetzt funktioniert eigentlich alles so wie es sein sollte. Aber mir ein kleines problem habe ich da der Schrittmotor wird ziemlich sehr schnell heiß obwohl ich nur 5V extern mit einer Strombegrenzung von 0,5A einspeise.

Ist das normal oder? Oder muss ich noch was an meiner Software ändern nicht dass er mir kaputt geht :frowning:

AdrianG90:
Ist das normal oder? Oder muss ich noch was an meiner Software ändern nicht dass er mir kaputt geht :frowning:

Schau ins Datenblatt des Schrittmotors, da steht drin, was er an Strom bei wieviel Spannung ziehen darf!

Ein Schrittmotor wird stets mit vollem Strom angesteuert, egal ob er steht oder ob er dreht. Und jeder Motor, der mit seiner vollen Nennleistung angesteuert wird, wird schon mehr als handwarm.

Mit Deiner "release()" Funktion schaltest Du den Strom zwar ab, aber dann schlackert der Motor auch frei herum und macht ganz bestimmt keine präzisen Steuerschritte, wenn Du danach wieder Strom draufgibst. Für eine schrittgenaue Steuerung darfst Du den Strom nicht zwischendurch abschalten, sonst verliert der Motor seine Step-Position extrem leicht.

Eine Zeitanzeige mit Schrittmotoren, die Zeiger bewegen, wird daher eine ziemlich stromfressende Angelegenheit und verschafft Deiner Stromrechnung einen Push nach oben.

Etwas kühler kannst Du den Stepmotor ggf. mit der Ansteuerung "SINGLE" statt "DOUBLE" ansteuern, ich glaube dann wird immer nur eine Spulenwindung unter Strom gehalten. Aber dazu müßte man mal in Deine Library reinschauen und auch den Motortreiber kennen, ob das wirklich so ist. Oder mal den tatsächlich gezogenen Strom des Motortreibers bei unterschiedlicher Ansteuerung SINGLE/DOUBLE messen. Mit der Ansteuerung, die weniger Strom zieht, bleibt der Motor dann kühler.

danke schön sehr hilfreicher Beitrag :slight_smile: Hab mein Problem herausgefunden^^