Forum: Mikrocontroller und Digitale Elektronik Rampenfunktion bei Schrittmotorsteuerung


von Michael L. (strompaedagoge)


Lesenswert?

Hallo,

ich habe einen Schrittmotor welcher sich auf Tastendruck einen Step oder 
eine Umdrehung weiterbewegen soll. Dies funktioniert soweit ganz gut. 
Jedoch zittert der Motor manchmal dabei. Komischerweise nur bei 
Linksdrehung. Meine Lösung wäre jetzt eine Rampenfunktion gewesen. 
Jedoch bin ich da bis jetzt nicht sondrlich weit mit gekommen, da meine 
Programmierkenntisse dafür alleine nicht ausreichen. Die Suche hat mich 
da auch nicht großartig weitergebracht. Ich bin dabei zwar auf eine 
AccelStepper Bibliothek gestoßen, jedoch bekomme ich diese nicht auf 
meinen Code angewandt. Die Beeispiele funktionieren jedoch auch nicht.

Verwendete Hardware ist ein ein Arduino Uno und ein Motorshield.

Der Code ist:
1
#include <Stepper.h>
2
3
4
/* STEPS muss auf die Anzahl der Stepps des verwendeten Motors angepasst werden */
5
#define STEPS 200
6
 
7
// eine Instanz aus der Klasse Stepper wird erzeugt
8
// sie bekommt die Anzahl der Steps und die Pins, an die der Schrittmotor
9
// angeschlossen ist übermittelt
10
Stepper stepper(STEPS, 3, 11, 12, 13);
11
12
//Pinbelegung
13
14
const int buttonPin1 = 5;
15
const int buttonPin2 = 4;
16
const int led1Pin = 7;
17
int drehrichtung = 0; 
18
int steps = 200;
19
//const int led2Pin = 8;
20
int buttonState1 = 0;
21
int buttonState2 = 0;
22
23
24
//---------------------------------------------------------------------------------------------
25
26
void setup() {
27
  // put your setup code here, to run once:
28
  
29
  stepper.setSpeed(10);             // setzt die Geschwindigkeit des Motors in Umdrehungen pro Minute
30
                                   // 10 gute Einstellung, 15 geht gar nicht, 30 dreht mancmal in die falsche Richtung
31
  
32
   pinMode(led1Pin, OUTPUT);
33
//   pinMode(led2Pin, OUTPUT);
34
   pinMode(buttonPin1, INPUT);
35
   pinMode(buttonPin2, INPUT);
36
37
38
//---------------------------------------------------------------------------------------------
39
40
41
void loop() {
42
  // put your main code here, to run repeatedly:
43
  
44
 //1 Umdrehung =  200 Schritte 
45
  buttonState1 = digitalRead(buttonPin1);     // im Loop wird der Variable buttonState mit dem Befehl = digitalRead(buttonPin) 
46
  buttonState2 = digitalRead(buttonPin2);    // der aktuelle Zustand des Buttons übergeben (entweder HIGH oder LOW).
47
48
  
49
                                            
50
if (buttonState1 == HIGH) {
51
  digitalWrite(led1Pin, HIGH);
52
  stepper.step(steps);          // Drehung rechts
53
  drehrichtung = 1; 
54
}
55
else {
56
  digitalWrite(led1Pin, LOW);
57
}
58
59
if (buttonState2 == HIGH) {
60
  digitalWrite(led1Pin, HIGH);
61
  stepper.step(- steps);       // Drehung links
62
  drehrichtung = -1;
63
}
64
else {
65
  digitalWrite(led1Pin, LOW);
66
}
67
68
}


Beste Grüße

Michael (strompädagoge)

von spess53 (Gast)


Lesenswert?

Hi

>  stepper.step(steps);          // Drehung rechts
>  drehrichtung = 1;
...
>  stepper.step(- steps);       // Drehung links
>  drehrichtung = -1;

Was verlangt dein Motorshield zur Ansteuerung? Schritte+Richtung oder 
was anderes?

MfG spess

von Michael L. (strompaedagoge)


Lesenswert?

Hallo spess,

das Motorshield benötigt eine Anzahl an Schritten. Hier gespeichert in 
dem Integer steps. Die Drehrichtung ist über das Vorzeichen geregelt.

MfG

von W.S. (Gast)


Lesenswert?

Michael L. schrieb:
> Meine Lösung wäre jetzt eine Rampenfunktion gewesen.
> Jedoch bin ich da bis jetzt nicht sondrlich weit mit gekommen, da meine
> Programmierkenntisse dafür alleine nicht ausreichen.

Dann lerne dazu, so daß dann deine Kenntnisse ausreichen.
Zunächst brauchst du nen Timer, aber den hat ja wohl so ziemlich jeder 
µC heutzutage. Selbiger sollte in der Lage sein, irgend einen 
PWM-Ausgang direkt anzusteuern, das wird dann dein Taktsignal für den 
Motortreiber. Mach das PWM-Verhältnis einfach 1:1, also 50%.

Beim Überlaufen des Timers sollte eine Interrupt-Routine aktiviert 
werden, die ihrerseits die Timerfrequenz verändern kann. Also pro 
SM-Schritt ein Timerereignis.

Jetzt fängst du mit ner niedrigen Frequenz an und mit jedem Schritt 
erhöhst du selbige, bis du bei der höchsten (von dir selbst 
vorgegebenen) Frequenz angekommen bist. Die Anzahl N der dabei 
zurückgelegten Schritte zählst du mit. Anschließend fährst du mit 
konstanter Frequenz, bis du beim Schritt Gesamtschrittzahl-N angekommen 
bist. Ab da erniedrigst du die frequenz wieder. Ist die 
Gesamtschrittzahl kleiner als 2*N, dann fährst du eben bloß soweit hoch, 
bis 2*N >= Gesamtschrittzahl ist.

Das ist alles.

W.S.

von Wolfgang (Gast)


Lesenswert?

Michael L. schrieb:
> Jedoch zittert der Motor manchmal dabei.

Hast du eine passende Last dran? Sonst kann es bei passender 
Schrittfrequenz schon mal zu Resonanzen kommen.

> Die Suche hat mich da auch nicht großartig weitergebracht.

Dann probiers doch mal mit der Application Note 446 von Atmel
AVR446: Linear speed control of stepper motor, Kap 2.3 Linear speed ramp
http://www.atmel.com/dyn/resources/prod_documents/doc8017.pdf

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


Lesenswert?

Für die Accelstep habe ich mal ein Beispiel gemacht. Dein Code oben 
scheint mir nicht vollständig zu sein? Oder hast du tatsächlich einen 
Motortreiber, der mit 4 Signalen angesteuert wird und nicht mit 
Takt/Richtung?
1
Stepper stepper(STEPS, 3, 11, 12, 13);
Wie wird hier die Pinzuordnung aufgelöst?

1
  stepper.setSpeed(10);             // setzt die Geschwindigkeit des Motors in Umdrehungen pro Minute
2
                                   // 10 gute Einstellung, 15 geht gar nicht, 30 dreht mancmal in die falsche Richtung

Ohne Rampen und bei einer einfachen H-Brücke ohne Stromregelung wundert 
mich das nicht.

Mit freundlichen Grüßen
Thorsten Ostermann

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


Lesenswert?

Link vergessen:
http://www.schrittmotor-blog.de/ansteuern-von-schrittmotoren-mit-arduino/

Mit freundlichen Grüßen
Thorsten Ostermann

von Michael L. (strompaedagoge)


Lesenswert?

Wolfgang schrieb:
> Dann probiers doch mal mit der Application Note 446 von Atmel
> AVR446: Linear speed control of stepper motor, Kap 2.3 Linear speed ramp
> http://www.atmel.com/dyn/resources/prod_documents/doc8017.pdf

Hallo Wolfgang,
das Dokument habe ich vorher schon gefunden. Ich bekomme dies nicht so 
ganz in einen Programmcode umgesetzt :(

Thorsten O. schrieb:
> Ohne Rampen und bei einer einfachen H-Brücke ohne Stromregelung wundert
> mich das nicht.

Hallo Thorsten,
das Motorshield ist ja nur dieser einfache Aufsatz für das Arduinoboard. 
Soll später durch ein DM542a ersetzt werden. Dieser ist dann mit Takt 
und Richtung gesteuert soweit ich das verstanden habe. Ein TinyStep habe 
ich leider nicht bekommen ;) Deinen Programmcode funktioniert deswegen 
wahrscheinlich nicht mit dem einfachen Motorshield. Ich werde das Montag 
mal testen. Schöner Blog übrigens ;)

Beste Grüße

strompädagoge

von Michael L. (strompaedagoge)


Lesenswert?

Thorsten O. schrieb:
> Link vergessen:
> http://www.schrittmotor-blog.de/ansteuern-von-schrittmotoren-mit-arduino/
>
> Mit freundlichen Grüßen
> Thorsten Ostermann

Hallo Thorsten,

leider ist mir dein Code etwas zu wenig kommentiert.
Was ist der Unterschied zwischen stepper.move und stepper.run?

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


Lesenswert?

Hallo Michael,

schau doch mal in die accelstepper.h...:
1
   /// Set the target position relative to the current position
2
    /// \param[in] relative The desired position relative to the current position. Negative is
3
    /// anticlockwise from the current position.
4
    void    move(long relative);
5
6
    /// Poll the motor and step it if a step is due, implementing
7
    /// accelerations and decelerations to achive the ratget position. You must call this as
8
    /// fequently as possible, but at least once per minimum step interval,
9
    /// preferably in your main loop.
10
    /// \return true if the motor is at the target position.
11
    boolean run();

Mit freundlichen Grüßen
Thorsten Ostermann

von Michael L. (strompaedagoge)


Lesenswert?

Hallo Thorsten,

der Motor dreht sich langsam in die eine Richtung, nach einiger Zeit 
dreht er sich mit schnellen Tempo einmal Links und einmal Rechts rum und 
wechselt dann die Richtung.

So sollte dein Beispiel Sketch funtionieren oder? Ich hatte 
zwischendurch etwas Probleme mit dem Chip, deswegen frage ich.

MfG

Strompädagoge

von m.n. (Gast)


Lesenswert?

Ich weiß nicht, welche Hardware Du hast. Wenn Du die Pinbelegung anpaßt, 
sollte vorwärts - rückwärts mit beliebiger Geschwindigkeit funktionieren
http://mino-elektronik.de/Generator/takte_impulse.htm#bsp7 ff.

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.