Forum: Mikrocontroller und Digitale Elektronik Schrittmotor läuft chaotisch


von Alexander S. (knut740)


Lesenswert?

Hallo,
ich habe einen Schrittmotor KP4M2-203, dazu einen Arduino nebst 
Schrittmotoransteuerungsshield auf Basis eines L298P.
Die Spulen des Motors habe ich wahrscheinlich richtig angeschlossen, 
denn er dreht sich ja und die zugehörigen LED's leuchten auf plausible 
Weise. Höchstens könnte die Richtung einer Spule vertauscht sein - was 
aber unwahrscheinlich ist, denn am Verhalten des Motors ändert sich 
nichts.

Mein Problem: der Motor läuft nicht, wie lt. Programm vorgesehen. Er 
sollte eine Umdrehung im Uhrzeigersinn und dann wieder zurück machen. 
Tatsächlich dreht er ruckweise in kleineren und größeren Schritten im 
Uhrzeigersinn und gelegentlich kleine Stücke zurück.

Ich habe die Ansteuerung der Ports bzw. Spulen nicht ehrlich 
programmiert, sondern eine fertige library aus dem Arduino-Umfeld 
benutzt. Arduino unterstützt bekanntermaßen die Faulheit seiner 
Benutzer.
Nun müßte ich aus den eingebundenen Dateien stepper.h bzw. stepper.cpp 
herausfinden,  w o  die Spulen in der falschen Reihenfolge angesteuert 
werden. Was aber schwierig ist, denn wenn sich der Motor ca um 100° 
normal bewegt, dann sind das vielleicht 70 richtige Abläufe. Daß danach 
die Reihenfolge der Spulenansteuerung eine Weile daneben geht und dann 
wieder richtig ist, wäre eigenartig.

Oder ob es an etwas Anderem liegt?
Ich füge das Programm mal an, vielleicht kann jemand mit einem Blick die 
Schwachstelle finden oder mir sonst wie einen guten Rat geben.
Vielen Dank schon mal.
1
// _stepper_oneRevolution
2
/* 
3
 Stepper Motor Control - one revolution
4
 
5
 This program drives a unipolar or bipolar stepper motor. 
6
 The motor is attached to digital pins 8 - 11 of the Arduino. - nein, 4,5,6,7
7
 
8
 The motor should revolve one revolution in one direction, then
9
 one revolution in the other direction.  
10
 
11
  
12
 Created 11 Mar. 2007
13
 Modified 30 Nov. 2009
14
 by Tom Igoe
15
 
16
 */
17
#include <Arduino.h>
18
#include <Stepper.h>
19
20
const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
21
                                     // for your motor
22
23
// initialize the stepper library on pins 8 through 11:  Auf dem Shield sind D4,D5,D6,D7 angeschlossen (Brücken gesetzt)
24
Stepper myStepper(stepsPerRevolution, 6,5,7,4);  //6574  , wobei 7 u. 4 untere Anschlüsse sind      
25
                                   
26
void setup() {
27
  
28
    for(int i=1;i<=10;i++){ //For Arduino Motor Shield            // u.U. sind in Stepper.h / cpp die dort nicht genannten 
29
    pinMode(i, OUTPUT); //set pin 4,5,6,7 to output mode          // Ports nicht als Ausgänge gesetzt?
30
    }
31
  // set the speed at 60 rpm:
32
  myStepper.setSpeed(100);
33
  // initialize the serial port:
34
  Serial.begin(9600);
35
}
36
37
void loop() {
38
  // step one revolution  in one direction:
39
   Serial.println("clockwise");
40
  myStepper.step(stepsPerRevolution);
41
  delay(500);
42
  
43
   // step one revolution in the other direction:
44
  Serial.println("counterclockwise");
45
  myStepper.step(-stepsPerRevolution);
46
  delay(500); 
47
}

von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Hallo Alexander,

Alexander Schmeil schrieb:
> Mein Problem: der Motor läuft nicht, wie lt. Programm vorgesehen. Er
> sollte eine Umdrehung im Uhrzeigersinn und dann wieder zurück machen.
> Tatsächlich dreht er ruckweise in kleineren und größeren Schritten im
> Uhrzeigersinn und gelegentlich kleine Stücke zurück.

Das hört sich sehr nach zu schneller Ansteuerung an. Ohne 
Beschleunigungs-Rampe sind Schrittmotoren recht lansam. Kann es sein, 
dass Du den setSpeed-Parameter falsch interpretierst?

Grüße, Kurt

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


Lesenswert?

Oder die Schaltung funktioniert nicht richtig und es wird nur eine Spule 
richtig bestromt. Dann ist das Anlaufverhalten eher zufällig. Wenn der 
Motor einmal läuft, dreht er meist auch weiter. Aber natürlich nicht mit 
vollem Drehmoment.

Mit freundlichen Grüßen
Thorsten Ostermann

von Harry (Gast)


Lesenswert?

oder du hast ganz einfach am Motor zwei Anschlüsse vertausch...

von Cihan K. (cihan7515)


Lesenswert?

Ich beschäftige mich im Moment auch mit diesem Thema und kann dir mal 
das foglende empfehlen:


#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::DRIVER, 13, 12); // 13-PUL,12-DIR

void setup()
{
  stepper.setAcceleration(80000);
  stepper.setCurrentPosition(0);
  stepper.setMaxSpeed(4000);
}
long current_position;
void loop()
{
  current_position = stepper.currentPosition();
  if(current_position>=50000){
    stepper.moveTo(0);
  }
  if(current_position<=0){
    stepper.moveTo(50000);
  }
  stepper.run();
}

Hier kannst du die Bib downloaden: 
https://github.com/adafruit/AccelStepper

Ich hoffe das bringt dich weiter :)

von Kein Name (Gast)


Lesenswert?

Ist der Motor eingebaut? Ohne Last, auf dem Tisch liegend ist das ganz 
normal. Auf eine schwere Platte schrauben und mit 1/10 des Nennstroms 
versuchen.

von Alexander S. (knut740)


Lesenswert?

Kein Name schrieb:
> Ist der Motor eingebaut? Ohne Last, auf dem Tisch liegend ist das ganz
> normal. Auf eine schwere Platte schrauben und mit 1/10 des Nennstroms
> versuchen.

Er lag lose auf dem Tisch. Ich habe ihn jetzt in den Schraubstock 
gespannt und die Spannung am Netzgerät heruntergedreht. Außerdem habe 
ich anschließend, wie Kurt schreibt, an myStepper.setSpeed gedreht und 
den Wert wieder heruntergesetzt auf 10-15.
Nun läuft er  f a s t  normal: in Uhrzeigerrichtung dreht er normal eine 
Umdrehung, dann ruckelnd etwa eine halbe Umdrehung zurück.
Er läuft schlechter, wenn man die Spannung wieder erhöht.

@ Thorsten, es sieht in der Tat etwas merkwürdig aus. Es gibt für jede 
Spule zwei LED's, wobei jeweils eine deutlich dunkler leuchtet.

@Cihan7515 werde ich mal probieren!

Ich werde wohl noch einige Zeit brauchen, bis ich mit dem Motor aus der 
Bastelkiste zurecht komme.

Freundliche Grüße
Alexander

von Thorsten B. (thorstenbutz)


Lesenswert?

Hallo Forum

Das Problem mit dem Steppern ist ganz einfach.

1. Ungenaugikeiten bei den Berechnungen der float Variablen.

2. Ist leider das größere Problem. Die Stepper haben mehrere 
Resonanz-frequenzen. Wenn der Stepper bei seiner Beschleunigung und 
Verzögerung durch diese Frequenzbereiche läuft verhält sich der Stepper 
nicht normal. Schritten gehen verloren und es ist möglich dass die 
Stepper zum Stillstand gekommen sind und brummen.

Die Resonantfrequenzberiche sind durch diverse Faktoren abhängig.

Zum mechanische Unwucht, Chopper-Frequenz bei Treiber/Endstufen, die 
Trägheit des Stepper und die Betriebsspanung (höhere Ub ist von 
Vorteil).

Bei www.goetz-automation.de/Schrittmotor/Resonanzen.htm ist es gute 
verständlich Erklärt.

Einfache Lösung ist das schnelle durchfahren der 
Resonanzfrequenzbereiche.

Ihr könnten mit setMaxSpeed und setAcceleration experimentieren.

Gruß Thorsten

von Johannes S. (Gast)


Lesenswert?

Nach über 3 Jahren ohne Rückmeldung wird dem Alexander das schon 
gelungen sein oder die Motoren liegen in der Tonne.
Und mit einem L298 muss man sich heute auch nicht mehr rumquälen wo es 
die billigen Pololu & Co. Treiber an jeder Ecke gibt.

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.