Forum: Mikrocontroller und Digitale Elektronik Arduino Stepper Sekundenzeiger


von Adrian (Gast)


Angehängte Dateien:

Lesenswert?

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

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


Lesenswert?

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

von Adrian (Gast)


Lesenswert?

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?

von Mike (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Adrian (Gast)


Lesenswert?

>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);
    }
  }
}

von m.n. (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

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.

von Adrian (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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.

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.