Hallo zusammen.
ich habe hier folgende Teile:
- einen Schrittmotor 34HS1456
(http://i01.i.aliimg.com/img/pb/991/085/441/441085991_523.jpg)
- Steuerung DM860
(http://file.siam2web.com/cnctak/product/2012826_23753.jpg)
- Arduino Uno
- Netzteil Ausgang: 60VDC
Ich möchte über lange Zeit eine Bewegung machen mit X Schritten in die
eine Richtung und X Schritten in die andere Richtung.
Das Problem ist, das ich bereits nach kurzer Zeit einen Versatz habe.
Das bedeutet, dass er vorwärts weniger schritte wie rückwärts macht.
Woran könnte denn das liegen???
Ist die Geschwindigkeit zu hoch?
Folgende Verdrahtung:
Arduino Pin 11 --> DM860 Pin DIR-
Arduino Pin 6 --> DM860 Pin PUL-
Arduino 5V --> DM860 an Pin PUL+ und DIR+
Die DIP Schalter sind wie folgt angeschlossen.
1: OFF
2: OFF
3: OFF
4: OFF
5: ON
6: ON
7: ON
8: ON
1
// include stepper library
2
#include <Stepper.h>
3
4
const int stepsPerRevolution = 200; // Nema17 motor has 200 steps in 360 degrees rotation
5
6
// initialize the stepper library on pins 8 through 11:
7
Stepper myStepper(stepsPerRevolution, 8, 6, 10, 11); // pins 8,9 go to PULL+ & PULL- , pins 10,11 go to DIR+ & DIR-
Michael schrieb:> for (int x = 0; x <=800; x++){> myStepper.step(-1);
Ich verstehe zwar nichts von C, aber: Wenn x hier statt bei Null bei -1
losgeht (oder was das sonst bei dem Zahlenformat wird) , dann wird das
mit der Zeit immer mehr fehlerhaft.
SW4 habe ich auf ON gestellt ohne unterschied.
Ich habe auch noch folgendes versucht. Leider wird es da noch schlimmer.
Der Motor "verschluckt" sich teilweise sogar.
Der mechanische Aufbau ist auch entscheidend, so ein Stepper ist ja ein
realweltliches Bauteil mit Schwingungsverhalten. Je nach mechanischer
Last und ihrer Dynamik werden Schritte übersprungen. Ich habe mir auch
die Angaben zum Motortreiber nicht durchgelesen, ob der irgendwelche
Gegenmaßnahmen hat, wie Selbstinduktionsmessung und dgl. (Wenn der Rotor
nicht tut, was er soll, induziert er meistens etwas, woraus ein sehr
guter Controller Rückschlüsse ziehen kann. Stichwort Back-EMF)
Michael schrieb:> Ist die Geschwindigkeit zu hoch?Michael schrieb:> for (int x = 0; x <=800; x++){> myStepper.step(1); //gegen Uhrzeigersinn
Da ist keinerlei Begrenzung der Geschwindigkeit zu sehen, es sei denn,
sie steckt in myStepper.step. Sonst erfolgt das mit maximaler
Prozessorgeschwindigkeit.
Georg
Michael schrieb:> Kann mir hier keiner Helfen?
Nein.
Schrittmotoren und BLDC haben eins gemeinsam: Sie verschlucken sich
gerne.
So wie ich das sehe, macht die Arduino Stepper Library keine
Beschleunigungs- und Abbremsrampen. Deine Geschwindigkeit muss nicht zu
hoch sein, aber ob die träge Masse so schnell beschleunigt, ist unklar.
Dreht der Motor noch ohne Last, schliesst jeder Step über das Ziel
hinaus, auch das führt zu Schrittfehlern. Man bremst eine
Schrittmotorwelle, manchmal reicht schon den Finger dagegen zu halten.
Etwas betribssicherer werden Schrittmotore, wenn sie im Mikroschritt
laufen, was du mit deiner DIL-Einstellung verhindert hast obwohl es die
Karte kann.
Es gibt mechanische oder auch optische Drehencoder die man ein die Welle
anbringen kann um dadurch bestimmen zu können wo sich die Welle nun
wirklich befindet.
Du wirst wohl beim starten einen oder mehrere Schritte verlieren wenn du
keine Anfahrrampe in der Software mit drin hast.
Vielleicht ist die Last für den Motor auch etwas zu groß und er
überspringt deshalb manchmal ein paar Schritte.
Nutzt du Mikrostepping?
Hast du es mal mit einem höheren Spulenstrom probiert?
Bevor hier weiter über Resonanzen und ähnliches philosophiert wird,
würde ich es mal mit einer systematischen Fehlersuche probieren:
- Arduino und Schrittmotorendstufe trennen, Schrittmotorendstufe mit
definiertem Takt ansteuern (Frequenzgenerator, NE555 o.ä.). Dann weiss
man, ob Motor und Treiber grundsätzlich funktionieren. Ansonsten geht
hier die Suche weiter (Verdrahtungsfehler, Wackelkontakte o.ä.).
- Arduino wieder anschließen, einfaches Bitbang-I/O für den Takt mit
Sleep(10ms) zur Steuerung verwenden. Wenn das geht, ist die Verdrahtung
richtig und der Arduino in der Lage, die Eingänge der Steuerung zu
treiben. Sonst hier weitersuchen.
- Dann erst den Code prüfen, z.B. ausgegebene Frequenz per Scope prüfen.
Die AccelStepper.lib hat sehr wohl eine Beschleunigungsrampe, deswegen
der Name. Die Beschleunigung muss natürlich sinnvoll definiert sein.
Beispielcode siehe [1].
Mit freundlichen Grüßen
Thorsten Ostermann
[1]
http://www.schrittmotor-blog.de/ansteuern-von-schrittmotoren-mit-arduino/
Thorsten O. schrieb:> Die AccelStepper.lib hat sehr wohl eine Beschleunigungsrampe, deswegen> der Name
Das ist schön, er verwendet die aber nicht sondern stepper.h
Hi
>> Die AccelStepper.lib hat sehr wohl eine Beschleunigungsrampe, deswegen> der Name>Das ist schön, er verwendet die aber nicht sondern stepper.h
Ist doch egal was er benutzt. Er versteht beidens nicht.
MfG Spess