AccelStepper, Speed einstellungen

hallo miteinander,

kann mir jemand mit den Einstellungen für Schrittmotoren über die LIB AccelStepper bitte Helfen.

Ich komme mit der Logik nicht zurecht.

Das ist mein Test Code:

#include <AccelStepper.h>    // Installieren der AccelStepper LIB 

   int   PUL_Z            = 45;           // Takt Signal  
   int   DIR_Z            = 46;           // Drehrichtungssignal  
   AccelStepper Achse_Z(1, PUL_Z, DIR_Z); // (1, PUL, DIR)     Motoren Installieren 

void setup()
{
 Achse_Z.setMaxSpeed(1);               // Geschwindigkeit pro Sekunde 
 Achse_Z.setAcceleration(2000);        // Beschleunigung in Schritten pro Sekunde.
 Achse_Z.move(400);                    // Der Motor soll 100 Schritte machen  
} // SETUP

void loop()
{
   Achse_Z.run();                       // Es werden die Schritte gemacht und dabei runter gezählt bis alle gemacht wurden. 
} // LOOP

Ich habe eingestellt:

Beschleunigung: 2000 pro Sekunde
Speed: 1 Schritt pro Sekunde
Anzahl der Schritte: 400 (entspricht 1 vollen Umdrehung)

Da meine Geschwindigkeit 1 Schritt pro Sekunde beträgt würde ich jetzt sagen das für 400 Schritte 400 Sekunden benötigt werden.
Dem ist aber nicht so, der Motor Dreht sich mit einem Affen Zahn, wenn ich die Rampe runter Sätze dann wird auch der Motor Langsammeer, kann mir jemand erklären warum das so ist?
irgend wie bin ich zu Doof das zu verstehen.

Gruß Mücke

habe meinen Text etwas überarbeitet, war doch etwas Kompliziert geschrieben, sorry.

Bei so wenig Code kann man nur wenig falsch machen. Stimmt die Reihenfolge von setMaxSpeed() und setAcceleration()? Ansonsten vermute ich, daß Speed 1 nicht funktioniert. Wenn das in der Bibliotheksbeschreibung noch nicht drinsteht, den Leuten eine Fehlermeldung schicken.

Hmm, an die Reihenfolge habe ich noch nicht gedacht.
Das werde ich jetzt im Keller ausprobieren gehen.

So ich habe jetzt die reihen folge abgeändert, leider macht das keinen Unterschied. :frowning:

ich habe mal ein Paar Videos gemacht, mit den jeweiligen Einstellungen das man sieht was ich meine.

Video 1:
setAcceleration(20);
setMaxSpeed(1);

Video 2:
setAcceleration(20000);
setMaxSpeed(10);

Video 3:
setAcceleration(20000);
setMaxSpeed(100);

Video 4:
setAcceleration(200);
setMaxSpeed(100);

Video 5:
setAcceleration(200000000);
setMaxSpeed(100);

Video 6:
setAcceleration(200000000);
setMaxSpeed(10);

Da Videos nicht hoch geladen werden können und dazu auch die Datengröße viel zu Groß ist habe ich die Videos auf der Dropbox Ligen.

Wenn Ihr noch Tipps habt, oder mir das erklären könnt warum das so ist, das ich mit der richtigen Denkweise weiter machen kann, wäre ich euch Tief verbunden.

Gruß Mücke

Muecke:
setAcceleration(200000000);
setMaxSpeed(100);

Aus der Doku:
void AccelStepper::setAcceleration (float acceleration)
void AccelStepper::setMaxSpeed (float speed)

Möglicherweise sieht es mit anderem Typ anders aus :slight_smile:

Hey agmue,

agmue:
Aus der Doku:
void AccelStepper::setAcceleration (float acceleration)
void AccelStepper::setMaxSpeed (float speed)

Möglicherweise sieht es mit anderem Typ anders aus :slight_smile:

Öm, ich kann dir jetzt nicht ganz folgen ;-(

Was meinst du mit anderen Typen?

float sagt doch das es sich um eine Gleitkomma zahl handelt? oder nicht, sprich ich kann einen Komma wert angeben.

Oder meinst du was anderes?

Gruß Mücke

Muecke:
Oder meinst du was anderes?

Genau das meine ich. 100 ist Integer, während 100.0 float ist. Bei kleinen Zahlen macht das möglicherweise keinen Unterschied, bei 200000000 bin ich mir da nicht so sicher, das habe ich noch nicht probiert. Aber wenn was nicht wie erwartet funktioniert, könnte es der falsche Typ sein. Versuch macht kluch :slight_smile:

Ok das werde ich morgen mal testen. ich bin gespannt.

Was mich jedoch so irritiert.

Eine Beschleunigung von 200 Schritte pro Sekunde bedeutet doch das der Motor pro Sekunde 200 Schritte machen wird.

auf einer Zeit Achse würde das dann so aussehen.

Sekunde       1       2      3
Schritte     200     400    600

Wenn jedoch das Maximal Speed auf 100 Schritte pro Sekunde steht, dann ist doch in der ersten Sekunde schon das Maximal Speed erreicht, warum beschleunigt der Motor dann dennoch?

Und wenn ich Speed gleich lasse und die Beschleunigung Hoch setze warum wird dann der Motor im Maximalen Speed schneller?

Ich würde es ja verstehen wenn Speed Höher wie die Beschleunigung ist das das Endspeed Schneller wird wenn ich die Beschleunigung Höher setze, denn es wird eine Anfahrt und abfahrt Rampe gefahren und wenn nicht genügend Umdrehungen gemacht werden dann erreicht bei zu geringer Rampe der Motor nie seine Endgeschwindigkeit doch das ist nicht so.

Ich hoffe das man mich verstehen kann was mich so Irritiert, und mit was ich gerade gedanklich nicht so richtig klar komme.

Gruß Mücke

Ein Compiler, der solche int/float Konvertierungen nicht selbständig und korrekt einfügt, wäre schlicht unbrauchbar.

Nach einem näheren Blick auf die Bibliothek tippe ich auf einen Fehler in den Berechnungen. Da intern long Variablen verwendet werden, können die durch Rundungsfehler auch mal auf unbrauchbare Werte abgeschnitten werden. Es könnte interessant sein, sich die internen Variablen ausgeben zu lassen, die z.B. in computeNewSpeed() mit #if 0 auskommentiert sind.

Z.B. könnte bei acceleration=2000 diese Geschwindigkeit benutzt werden, die ja deutlich höher ist als die maximale Geschwindigkeit (1) und die Distanz (400).

Hallo DrDiettrich,

wenn ich dich richtig verstandene habe könnte das ein Logikfehler in der LIB sein?
Demnach wäre das etwas das man dem LIB Entwickler zukommen lassen sollte?

Leider kann ich deinen Ausführungen nicht ganz vollen mit dem was man sich anzeigen lassen kann bzw. sollte.

Gerne mache ich einige Tests und stelle auch die Ergebnisse hier im Forum beriet. jedoch müsste ich dazu wissen was ich genau machen soll.

Gruß Mücke

ps. mich wundert es jedoch das wenn es sich um einen Fehler in der LIB handelt warum das noch niemanden aufgefallen ist.

Bis auf maxSpeed(1) sieht das doch alles ganz gut aus. Bevor Du eine Fehlermeldung abschickst, prüfe ob Du auch die neueste Bibliotheksversion benutzst.

ich verstehe immer noch noch nicht warum die Geschwindigkeit sich ändert wenn ich die Rampe verändere und die Maximale Geschwindigkeit gleich lasse.

Denn das ist ja nicht nur bei maxSpeed(1) sondern auch wenn die maxSpeed Höher eingestellt ist.

Mir ist nur im Video 1 aufgefallen, daß die Geschwindigkeit viel zu hoch ist. Bei Speed 100 (Video 3-5) dauert eine Umdrehung immer etwa 4 Sekunden.

Und Beschleunigungen über 1000 dürfte auch kein Motor schaffen, unsinnige Werte muß eine Bibliothek nicht unbedingt berücksichtigen. Bei Zahlen außerhalb des Bereichs von int sollte auch immer ein L angehängt werden.

@Mueke, die vorgegebee geschwindigkeit kann bei zu langer rampe dann nicht erreicht werden, wenn die laufzeit kürzer ist, als die rampe.
Hast Du mal die Beispiele der Accelstepper durchprobiert? Da sind teilweise in den sketchdokumentationen noch Infos vorhanden, die so in der Doku nicht drin stehen.
Du must halt in den Beispielen die Motorkonfiguration (Treiberkonfiguration) auf die von Dir verwendete anpassen.
Ausserdem hatte ich seinerzeit bei verwendung der Takt - Richtungsgesteuerten Endstufe das Problem, das Accelstepper anscheinend die Signale INVERTIERT ausgibt. Mein Motor kam damit einfach nicht auf Toueren.
Hb dann den Treiber so angeschlossen das er auf Minus-Signale reagiert (also DIR und PUL haben gemeinsamen Plus, und Arduino schaltet auf GND.
Danach hab ich dan in der Doku nen befehl gefunden, der die lib so konfiguriert, dass die signale gedreht ausgegeben werden.
Das der Motor viel schneller kann hab ich mit nem Stepper-Generator rausgefunden, der das PUL und Dir-Signal mit nem einstellbaren Taktgeger und nem Taster erzeugt. da rannte der Motor wie Sau und am Arduino schlief einem beim Zusehen das Gesicht ein.

Hoffe das hilft Dir etwas weiter.
LG Stefan

Irgend wie habe ich den Eindruck das wir aneinander vorbei reden.

Angenommen ich habe eingestellt:

Beschleunigung: 600 Schritte pro Sekunde [setAcceleration]
Speed: 300 Schritte pro Sekunde [setMaxSpeed]

Dann müsste meine Maximales Speed nach 0,5 Sekunden erreicht sein, der Motor wird aber nicht schneller wie die 300 Schritte pro Sekunde.

Wenn ich einstelle:
Beschleunigung: 1.200 Schritte pro Sekunde [setAcceleration]
Speed: 300 Schritte pro Sekunde [setMaxSpeed]

Dann sind ist das Max Speed nach 0,25 Sekunden erreicht.

Warum wird der Motor jedoch in seiner Maximalen Speed Höher wenn die Beschleunigungsrampe steiler steht?
die Beschleunigungsrampe hat doch im Normalfall keine Auswirkungen auf das Maximal Speed.

denn wenn das so wäre könnte ich bei einer Geschwindigkeit von 100 Schritte pro Sekunde immer nur eine Lineare Anfahrrampe bekommen und brauche für die Anfahrt immer 1 Sekunde.

zur Verdeutlichung habe ich ein Bild gemacht.

Bildschirmfoto 2017-10-03 um 21.20.57.png

Die Extrem hohe Beschleunigungsrampe habe ich das ich auch garantiert, mit den ersten schritten auf mein Maximal Speed komme.
Da mein Motor Ohne last ist, und laut Datenblatt 1.000 Rpm kann sollte das eigendlich schon machbar sein.

@Deltaflyer: Leider ist jetzt mein Urlaub vorbei und ich komme erst am WE wider dazu was am Motor zu machen, werde mir das aber mal genauer anschauen was du meinst. das mit dem Signal umswitchen in der LIB habe ich noch nicht verstanden, denn die LIB macht doch für jeden Schritt ein mal HIGH und LOW oder nicht? somit wäre das erst ein mal egal.
jedoch ein Versuchsaufbau, mit einen Treiber der mal mit GND geschaltet wird wäre eine Idee, denn mehr als 250 RPM klappt nicht :frowning: egal was ich mache.
Vieleich- müssen wir das Thema noch mal separat besprechen.

Ach so ich habe die Aktuellste Version der LIB 1.57-2

Gruß Mücke

@Mücke, ja ich war auch überrascht, nicht auf touren kam. Ich hatte mir ne schiebetüre gebaut, die ich schnell öffnen wollte. da ich aber kein Ingenieur bin, und mir das Wissen fehlte, um zu berechnen, ob der Motor das überhaupt packt, hatte ich mit den Stepper-Tackter gekauft, der die passenden Signale für die Endstufe erzeugen kann. Ich wollte bei diesen ersten Tests nicht auch noch von eventuellen fehlerhaften Software-Parametern abhängig sein, sondern nur rein die Mechanik mal testen. Nun da hatte ich gesehen, dass das ding rennt wie Sau und ich musste für die Tests der Maximalen Geschwindigkeit die Sicherheits-Endschalter in die PUL Leitung einschleifen, weil ich das Poti gar nicht schnell genug wieder runter drehen konnte.

Als ich dann das das Testprogramm auf den arduino geladen hatte, und mit verschiedenen Geschwindigkeiten testete, war die Ernüchterung gross denn egal wie kurz ich die rampe einstellte, das Ding kam einfach nicht auf Tempo.
Das hat mich sehr verwundert, denn der Arduino hätte das ja scneller hinbekommen sollen, als ich von Hand.
Dann habe ich am Signal-Eingangsstecker des Motortreibers einfach mal die Plus-Eingänge von PUL und DIR zusammen geschaltet und die Minus-Eingänge auf die Steuerpins des Arduino.
Und dann rannte das Ding los!
Die Türe läuft übrigens in 0,76 Sec eine Strecke von 800mm. Das Türblatt wiegt ca. 20Kg.
Besucher die das Ding nicht kennen, machen schonmal nen erschreckten Schritt zurück.
Ich jedoch geniesse das "Raumschiff Enterprise-Feeling"

Ich habe dann später, als ich in der Doku nach ner Möglichkeit, die Anfahr- und Brems-Rampe getrennt einzustellen suchte, herausgefunden, dass es einen Befehl (oder ne Funktion) gibt, mit der eingestellt werden kann, mit welcher Logik die Signale ausgegeben werden.

Hier der Befehl:

AccelStepper::setPinsInverted 	( 	bool  	directionInvert = false,
		bool  	stepInvert = false,
		bool  	enableInvert = false 
	)

LG Stefan

@Stefan: Das hört sich sehr interessant an. das werde ich auf alle Felle mal testen. und schauen ob ich dann besser damit zurecht komme. An so was habe ich noch gar nicht gedacht.

Deine "Raumschiff Enterprise-Feeling" Türe würde ich gerne mal Testen ;-). ist bestimmt cool.

Was ich jedoch auch sehr interessant finde ist der "Stepper-Tackter" den du erwähnst, leider kann ich da nicht richtig unterscheiden was gemeint ist im Netz Google.de hast du mir da einen Link zu dem was du da hast?

Gruß Mücke

Ach noch was:
Hatte das falsch in errinnerung mit Acceleration 0! Muss Grösser sein als Null!
Aber, Du darfst die Nicht zu hoch ansetzen, da sonst bei höher eingestellter Drehzahl der Motor nicht mehr anläuft (auch nicht ohne Last), sondern einfach stehenbleibt und fürchterlich pfeift.

Also, wenn Du den Motor auf 600RPM (10 U/sek) bringen willst und der Treiber auf 1/1 Schritt eingestellt ist, benötigst Du bei einem Motor mit 1.8° (200 Steps/U) 2000 Steps/sec. wenn Du jetzt testweise mal zu diesem Speedwert ne Rampe von 500 einstellst muss der motor damit problemlos auf die gewünschte drehzahl kommen. Wenn nicht, ist der Strangstrom evt zu HOCH eingestellt. un/Oder die Betribsspannung für den Motor zu klein.
Erst wenn der Motor mit moderater Rampe sauber läuft, würde ich beginnen diese STUFENWEISE höher zu setzen.
Sobald der Motor nicht mehr, oder nicht mehr zuverlässig anläuft, ist die Grenze der Beschleunigung erreicht/bzw. überschritten. Danach kanst Du dich langsam an die Maximalwerte herantasten. Da gibst du dann noch ein bisschen Reserve (also etwas tiefer setzen.) nun belastest Du den Motor und korrigierst nötigenfalls die Rampe etwas.
Die maximale Drehzahl, die der Motor kann, wirst Du nicht ohne Rampe erreichen. (ich glaube noch nichtmal im unbelasteten Zustand. Wobei bei höherer Betriebsspannung des Treibers die werte entsprechend agressiver gewählt wn können.

LG Stefan.

Ja, billigstes CE (China Export) - Produkt.
Suche Dir gleich den Link raus....

Habe den Hier (eb...)

LG Stefan

Musst bei dem Teil ein bisschen mit dem Jumper für den Frequenzbereich spielen. am besten im tiefsten bereich anfangen. Das Poti jeweils LANGSAM aufdrehen, das Ding kennt nämlich keine Rampe.
Kann Dir leider grad nicht sagen, wie di Jumper darauf zu konfigurieren sind und die Anleitung musst du evt. auch noch ergoogeln. (ist glaub ich wie be CE üblich nicht dabei.) Ist aber so ich weiss zu finden.
Mein Modul ist leider grad nicht greifbar, da es zurzeit verliehen ist.

LG Stefan