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
Hallo spess,
das Motorshield benötigt eine Anzahl an Schritten. Hier gespeichert in
dem Integer steps. Die Drehrichtung ist über das Vorzeichen geregelt.
MfG
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.
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
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
Stepperstepper(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
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
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