Hallo,
seit gut einer Woche beschäftige ich mich mit Schrittmotoren. Über Rn
Wissen habe ich einiges an theoretischem Wissen angelesen. Nun wollte
ich mir mit meinem Arduino ein Sekundenzeiger programmieren. Jedoch
treten jetzt bei mir einige Probleme auf. Und zwar möchte ich mein
Schrittmotor in microstep Betrieb betreiben, da er die Schritte feiner
macht als bei einer anderen Ansteuerung, soweit ich das verstanden habe.
Den Schrittmotor habe ich nicht direkt auf mein Arduino angeschlossen
sondern auf ein Adafruit Motor Shield v.2.3. Daher habe ich auch ein
Forenbeitrag hier:
Beitrag "2 Schrittmotoren mit Adafruit Motor Shield im alternierenden Start-Stop-Betrieb, geht das?"
gefunden, wo jemand auch mit diesem Shield einen Stepper ansteuern
wollte. Was mir direkt aufgefallen ist dass die library die er verwendet
hat nicht bei meinem Shiled funktioniert obwohl ich genau das selbe
habe. Damit ich geanau wie er die Stepper in Betrieb bekomme muss ich
das shield über den Ic2 Bus starten. Komisch finde ich da ich genau wie
er die Servos an M1 udn M2 angeklemmt habe. Nun ja das am Rande mein
eigentliches Problem ist mein Quellcode, denn ich selbstverständlich
hier bei fügen werde Da ich einen Schrittmotor habe der 200 Schritte/pro
Umdrehung bei einem Schrittwinkel von 1,8 Grad habe ich hier in anderen
Foren gelesen dass man die Schritte beliebig ändern kann sprich 200
Schritte auf 1000 Schritte. Dazu muss nur das Drehmoment geändert
werden. Bei 1000 Schritte würde sich der Stepper 5 Umdrehungen/sec
machen d.h pro minute wären das 300 Umdrehungen.
Rechnung:
1000 Schritte / 200 = 5 Umdrehung /sec
5 Umdrehung/sec *60 = 360
Und das habe ich letztenendlich in der Motorgeschwindigkeit
myMotor->setSpeed(1000); // 10 rpm eingeschreiben
Und für die Schritte habe ich eigentlich
200 / 60 gerechnet da er in meinem Falle im Microstepbetrieb nur 200
Schritte für eine Umdrehung braucht. Und das finde ich komisch
eigentlich hätte ich mit 1000 Schritten gerechnet aber das hätte sowieso
auch nicht hingehauen da er dann mehrere Umdrehungen gemacht hätte.
Wie Ihr lesen könnt verwirrt mich das ziemlich sehr. Ich glaube dass ich
eher ein rechnerisches Problem habe. Ich bin auch davon ausgegangen das
Microstep kleine Schritte sind und nicht so riesige Schritte macht wie
im Vollschritt. Deswegen habe ich das alles versucht in einer Schleife
zu verpacken. Leider muss ich dann noch entdecken dass er neben dem
eigenlichen Schritt noch einen kleinen Zusatzschritt macht obowhl ich
ihm befohlen hab einen Schritt zu machen.
Nun ja hoffe Ihr könnt mir dabei helfen. Und sorry falls mein Text ein
bisschen lang wurde ich wollte direkt mein Problem auf dem Punkt bringen
Mtf
Hallo Adrian,
> Da ich einen Schrittmotor habe der 200 Schritte/pro> Umdrehung bei einem Schrittwinkel von 1,8 Grad habe ich hier in anderen> Foren gelesen dass man die Schritte beliebig ändern kann sprich 200> Schritte auf 1000 Schritte. Dazu muss nur das Drehmoment geändert> werden.
Das hast du mit Sicherheit falsch verstanden...
> Wie Ihr lesen könnt verwirrt mich das ziemlich sehr.
Wie ich lesen kann bist du sehr verwirrt, ja. Das merkt man deinem Text
deutlich an.
> Nun ja hoffe Ihr könnt mir dabei helfen. Und sorry falls mein Text ein> bisschen lang wurde ich wollte direkt mein Problem auf dem Punkt bringen
Das ist dir leider nicht gelungen. Versuch es nochmal, kurz und knapp
und in verständlichem Deutsch ;)
Mit freundlichen Grüßen
Thorsten Ostermann
1. Was ich nicht weiss ist wie ich aus 200 Schritte / Umdrehung z.b 1000
bzw 360 Schritte machen könnte. Und diese könnte ich dann durch 60
teilen dann hätte ich ja meine Sekunde pro Schritt oder geht das
irgendwie anders?
2. Inwiefern beeinflusst die Motorgeschwindigkeit die Schritte des
Steppers also sprich diese Funktion
Motor->setSpeed(1000); // 10 rpm eingeschreiben
3. Was bewirkt die Frequenz beim Schrittmotor? Ich gebe ihm am anfang
ungefähr 1kz. Ist dies nun für meinem Sekundenzeiger wenig?
Adrian schrieb:> Den Schrittmotor habe ich nicht direkt auf mein Arduino angeschlossen> sondern auf ein Adafruit Motor Shield v.2.3. ...
Nicht jeder kennt deinen Schild. Für diejenigen, die keine Lust zum
Suchen haben, wäre ein Link - möglichst mit Schaltplan - eine echte
Unterstützung.
Adrian schrieb:> 1. Was ich nicht weiss ist wie ich aus 200 Schritte / Umdrehung z.b 1000> bzw 360 Schritte machen könnte.
Das macht gewöhnlich der Sequencer im Mikroschritttreiber. Dazu genügt
ein Blick ins Datenblatt. Mikroschritttreiber erlauben allerdings meist
nur eine Untersetzung in ganzen Zweiterpotenzen also /2 /4 /8 /16. Steht
auch im Datenblatt von deinem Treiber.
Adrian schrieb:> Und zwar möchte ich mein> Schrittmotor in microstep Betrieb betreiben, da er die Schritte feiner> macht als bei einer anderen Ansteuerung
Nö.
Microstepping ist eine Mogelpackung, es dient nur zu Verringerung der
Laufgeräusche.
Sobald Du den Motorstrom abschaltest, ziehen ihn die Magnete auf den
nächsten Vollschritt.
Willst Du 200 Schritte in 60 unterteilen, machst Du ganz einfach 3,3,4
usw.
>Nicht jeder kennt deinen Schild. Für diejenigen, die keine Lust zum>Suchen haben, wäre ein Link - möglichst mit Schaltplan - eine echte>Unterstützung.
sorry hab ich vergessen hier den link dazu
http://www.flikto.de/products/motor-stepper-servo-shield-for-arduino-kit>Das macht gewöhnlich der Sequencer im Mikroschritttreiber. Dazu genügt>ein Blick ins Datenblatt. Mikroschritttreiber erlauben allerdings meist>nur eine Untersetzung in ganzen Zweiterpotenzen also /2 /4 /8 /16. Steht>auch im Datenblatt von deinem Treiber.
Wie heisst das da im Datenblatt? hab mir es angeschaut aber davon habe
ich leider nichts gefunden:(
> Und zwar möchte ich mein> Schrittmotor in microstep Betrieb betreiben, da er die Schritte feiner> macht als bei einer anderen Ansteuerung
also sprich dies hier etwa?
for (i = 0; i <= 3; i++) {
motor > step(1, 1, Microstep);
for (i = 0; i <= 3; i++) {
motor > step(1, 1, Microstep);
for (i = 0; i <= 4; i++) {
motor > step(1, 1, Microstep);
}
}
}
Adrian schrieb:> ich wollte direkt mein Problem auf dem Punkt bringen
Dann mach das doch mal ;-)
Der Motor macht 200 Vollschritte/Umdrehung. Damit kann man nicht exakt
60 Positionen/U anfahren, was aber das Auge nicht stört, solange nach
einer Minute der Zeiger wieder auf '12' steht.
Nimmt man die 'Mogelpackung' der Mikroschritte, nehmen wir mal 16, so
braucht der Motor(-treiber) 200*16 = 3200 Schritte, um den Zeiger einmal
zu drehen. Die notwendige Frequenz für eine Umdrehung/s ist demnach 3200
Hz. Da der Zeiger aber nur 1/60 Umdrehung/s drehen soll, sind es 3200/60
Hz.
Ich spare mir das Umrechnen auf 'krumme' Frequenzwerte, sondern rechne
gleich auf die Timertakte eines mit 16 MHz betriebenen µCs um:
16000000/3200*60 = 300000. Das heißt, der µC muß bei 16 MHz alle 300000
Takte einen Impuls an den Motortreiber abgeben, damit er den Zeiger in
einer Minute eine Umdrehung machen läßt.
Laß die Finger von solchen Funktionen wie 'delay_ms()' und such Dir
einen Timer aus, der das erledigt.
Adrian schrieb:> Wie heisst das da im Datenblatt? hab mir es angeschaut aber davon habe> ich leider nichts gefunden:(
Da frag mal Adafruit mit ihrem "great tutorial", wie sie sich
vernünftiges Micro-Stepping mit dem TB6612 vorstellen. Bei dem Baustein
sehe ich nicht mal eine Stromregelung, ganz zu schweigen von einem
Hardware Sequenzer für Mikrostepping. Vielleicht stellen die sich
irgendeine Softwaresteuerung mit einer Trickserei über PWM vor - sehr
windig.
Guck dir z.B. mal den A4989 von Allegro an. Da findest du Stromregelung
und Mikroschritt Translator. Über MS1 und MS2 kannst du die
Schrittuntersetzung konfigurieren.
http://www.allegromicro.com/en/Products/Motor-Driver-And-Interface-ICs/Bipolar-Stepper-Motor-Drivers/A4989.aspx
Mike schrieb:> Guck dir z.B. mal den A4989 von Allegro an.
Glaubst Du denn, dass man mit ein paar Ampere Phasenstrom einen
tonnenschweren Sekundenzeiger gewegen kann? ;-)
Ein A4288 dürfte wohl schon reichen; und wer nicht beim Fernost
Billiganbieter kaufen, sondern selber löten will, kann den A4982 nehmen.
Und wenn es ganz einfach sein soll: L6219 im 24-pol. DIL im
Halbschrittbetrieb tickt gut genug.
Adrian schrieb:> Nun wollte> ich mir mit meinem Arduino ein Sekundenzeiger programmieren.
Du hast einen UNO R3 und kannst mit AVR-Studio umgehen?
Dann suche in der Codesammlung nach Beispielen für den ATmega328.
gibt es auch dazu schaltpläne wie ich man sowas zusammenbaut, nicht dass
ich in meiner schaltung große fehler machen würde?
Also ist mein Adafruit shiled ungeeignet für den microsteppber Betrieb.
Na toll-.- und ich such mir einen Wolf raus.
Adrian schrieb:> Also ist mein Adafruit shiled ungeeignet für den microsteppber Betrieb.
Die Frage ist doch: brauchst du das überhaupt für einen Sekundenzeiger.
Wenn der in 1 Minute einmal rum kommt, dann reicht das völlig aus. Kein
Mensch schaut so genau auf die Sekunden, dass es ihm auffällt, das der
zeiger nicht 100% exakt über einer Minutenmarkierung steht.
Man kann auch alles übertreiben.
Adrian schrieb:> Also ist mein Adafruit shiled ungeeignet für den microsteppber Betrieb.
Laut Doku kann das Ding Microstep. Du kannst dir in der Lib nur nicht
aussuchen, in wieviele Steps aufgelöst wird. Und was ich der Doku auch
nicht entnehmen konnte ist, ob das Microstepping dann benutzt wird um
von einem Vollschritt zum nächsten zu steppen oder ob sich dadurch auch
die Schrittzahl für eine Umdrehung erhöht. Aber das kann man in einem
Versuch in 2 Minuten feststellen.
Du gehst mir da sowieso zu naiv an die Sache ran, indem du auf Biegen
und Brechen versuchst, das Ding genau an deine Aufgabenstellung zu
konfigurieren. Das wird in deinem Fall mit der Uhr sowieso nicht
funktionieren. Ein Schrittmotortreiber ist keine Präzisionsuhr. Muss er
auch nicht sein.
Lass deine Sekundenzeiger nach Ablauf einer Sekunde zur nächsten Ziffer
steppen und gut ists. Wieviele Schritte das jeweils sind, kann man
ausrechnen.
Der ganze Ansatz mit: ich rechne mir aus, wieviele Schritte der Motor
machen muss und sag dann dem Treiber, dass er die in exakt 60 Sekunden
machen soll, wird nicht klappen. Viel zu ungenau.
Adrian schrieb:> gibt es auch dazu schaltpläne wie ich man sowas zusammenbaut,
Welchen Motor hast Du denn überhaupt?
Lies das Datenblatt vom L6219 und versuche, die recht einfache Funktion
zu verstehen.
> nicht dass ich in meiner schaltung große fehler machen würde?
Mache Deine Fehler und lerne daraus. Dann wirst Du selber merken, warum
ein A49xx einige Probleme (viel) besser löst.
m.n. schrieb:> Glaubst Du denn, dass man mit ein paar Ampere Phasenstrom einen> tonnenschweren Sekundenzeiger gewegen kann? ;-)
Vielleicht soll es ja eine Kirchturmuhr mit zusätlich noch schlecht
ausbalanciertem Zeiger sein ;-)
Für einen kleinen Motor reicht sicher auch der A3967 mit 700mA.
Wenn man mit einer variablen Referenzspannung arbeitet, z.B. per PWM und
Tiefpass, läßt sich der Haltestrom noch auf das notwendige Mindestmaß
reduzieren. Trotzdem ist ein dauerbestromter Schrittmotor energetisch
ziemlich unpraktisch und man fährt besser, wenn man zum Halten des
Zeigers mit dem Rastmoment auskommt, so dass man nur für die Bewegung
Strom braucht.