Forum: Mikrocontroller und Digitale Elektronik Problem mit Schrittmotorsteuerung. Abwechselnd links/rechts Drehung. Versatz nach mehreren Durchläuf


von Michael (Gast)


Lesenswert?

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-
8
int stepCount = 0;
9
10
void setup() {
11
   // set the speed at 60 rpm:
12
   myStepper.setSpeed(1400); //2600max
13
   // initialize the serial port:
14
   Serial.begin(9600);
15
   delay(10000);
16
}
17
18
19
void loop() {
20
  for (int x = 0; x <=800; x++){
21
    myStepper.step(1); //gegen Uhrzeigersinn
22
    }
23
  delay(500);
24
  for (int x = 0; x <=800; x++){
25
    myStepper.step(-1);
26
    }
27
  delay(500);
28
  }

Vielen Dank :-)

von Karsten U. (herr_barium)


Lesenswert?

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.

von Leroy M. (mayl)


Lesenswert?

Sollte SW4 nicht auf ON stehen?

In OFF halbiert der doch den eingestellten Strom? Jedenfalls 
interpretiere ich das Bild so.

von Michael (Gast)


Lesenswert?

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.
1
#include <AccelStepper.h>
2
3
//AccelStepper stepper(AccelStepper::DRIVER, 6, 8);
4
5
AccelStepper stepper(1, 6, 8);
6
7
int pos = 200;
8
 
9
void setup()
10
 {  
11
   stepper.setMaxSpeed(2000);
12
   stepper.setAcceleration(100);
13
 }
14
 
15
void loop()
16
 {
17
   if (stepper.distanceToGo() == 0)
18
   {
19
     delay(500);
20
     pos = -pos;
21
     stepper.moveTo(pos);\
22
  }
23
  stepper.run();
24
 }

von Michael (Gast)


Lesenswert?

Kann mir hier keiner Helfen?

von Boris O. (bohnsorg) Benutzerseite


Lesenswert?

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)

von Georg (Gast)


Lesenswert?

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

von Michael B. (laberkopp)


Lesenswert?

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.

von Mike J. (linuxmint_user)


Lesenswert?

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?

von eProfi (Gast)


Lesenswert?

Läuft der Motor mit oder ohne mechanische Last?
Evtl. Microschritt oder Dämpferscheibe (Oriental Clean Damper) 
probieren.
Beitrag "Schrittmotor Problem - bleibt bei ca. 300u/min stehen"

Jetzt weiß ich wenigstens, wie diese funktionieren:
https://de.wikipedia.org/wiki/Schwingungstilger
https://de.wikipedia.org/wiki/Zweimassenschwungrad

Und was die komischen T-Teile an den Hochspannungsleitungen nahe an den 
Isolatoren sind:
https://de.wikipedia.org/wiki/Stockbridge-Schwingungstilger

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

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/

von Michael B. (laberkopp)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.