PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Takt-Generieren für Schrittmotoren ???



korreander12
23.03.2004, 17:52
Hallo,
Ich habe ein Problem mit dem ansteuern eines Schrittmotors.

Ich habe eine SMC800 Karte, habe diese mit der paralellen Schnittstelle verbunden und ein C++ Programm mit dem Borland_C++_Builder dazu geschrieben. Der motor dreht sich auch, sogar in beide Richtungen so wie ich es haben will.

Nur:
er ist viel zu langsam, er hat ungefähr nur 30 U/min.

Allerdings:
Jede Millisekunde (1ms) send ich an diese Karte 1 Byte.
4 Byte werden benötigt um 1 Schritt durchzuführen.
200 Schritte hat der Motor.

Nach Adam Riese müsste er dan Trotzdem schneller laufen!!! oder nicht???

Ich kann keine Zeiten unter 1 ms programmieren !!!

Welche Lösungen gibt es also für dieses Problem ???

An die L297/298 Steuerung hab ich auch schon gedacht, aber an die kann ich ja auch nicht unter 1 ms senden !!!

Oder bin ich gedanklich einfach aufm Holzweg ????

Im voraus vielen Dank !!! :D :D

Frank
23.03.2004, 18:08
Hi,

warum braucht deine Platine 4 Byte für einen Schritt, wäre ungewöhnlich! Aber ich kenne die Karte nicht!. Ich glaube aber das du da ein Denkfehler machst - eigentlich müsste er sich doch bei jedem Byte ein Schritt bewegen.
Dann müsste man es wohl so rechnen:

Wenn du jede Millisekunde ein Takt gibst, dann wären 1000 Takte = Sek und 60.000 Takte 1 Minute .
Wenn der Motor 200 Schritte pro Umdrehung benötigt, ergibt sich:
60000 / 200=300
Also dein Motor muss 300 Umdrehungen pro Minute machen.

Das ist eigentlich schon recht schnell, zumindest für Bot´s, da man da ja Räder oft direkt dran befestigt.

Und warum sollte man mit ein bisschen ASM-COde nicht noch höhere Taktraten hin bekommen? Allerdings wüsste ich nicht wozu man die beim Bot braucht?

Gruß Frank

23.03.2004, 18:43
Hallo,
erstmal vielen dank,

Ich schicke der Platine folgendes über den Para-Port:

ABCD
1001 Byte 1
1010 Byte 2
0110 Byte 3
0101 Byte 4

Genau so werden nachher auch die Phasen angesteuert (denke ich).

Das wären dann 1000 Bytes in der Sek=250 Takte x 60sec=15000 Takt/min.

15000/200 Takt =75 U/min.

Ich vermute dass mein Programm-Timer zu ungenau ist und nicht alle ms sendet , sondern alle 1,5-2 ms und somit die Drehzahl nur noch halb so gross ist.

Wenn ich die L297/298 Schaltung baue und über die Para-Schnittstelle ansteuern will, ist dann jedes Byte 1 Schritt ???

Könnte ich denn Takt auch von einem Quarz-Timer (Hardware) generieren lassen ??? Ist der dann Fest oder kann mann den noch verstellen ???



Und warum sollte man mit ein bisschen ASM-COde nicht noch höhere Taktraten hin bekommen?


Was ist das "ASM-Code" ??? Nie gehört !!!

Manf
23.03.2004, 19:07
Wenn der Roboter nicht mit beliebig vielen Geschwindigkeiten laufen soll, dann könnte man ja eine oder ein paar feste Taktraten generieren und für eine einstellbare Zeit an die Schrittmotor-Steuerung durchschalten. Die Steuerung L297 kann gut eine Folge von n Takten in Schritte umsetzen. Weitere Signale wären dann vorwarts/rückwätrs, rechts/links an/aus, Geschwindigkeit 1,2,3,....
Dazu gibt es doch schon einen Thread.
Manfred
(ASM- Code verwenden heißt in Assembler programmieren. )https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=100

23.03.2004, 19:39
Hi,

also so ganz versteh ich deine Platine immer noch nicht. In einem Byte sind doch die kompletten Infos für eine Phasenstellung vorhanden, also müsste auch jedes Byte einen Schritt bewirken.
Geb doch mal eine ganz langsame Schrittfolge 2 Sekundentakt oder so aus, dann kannst du alles mitzählen und überprüfen.

Bei der L297/298 Schaltung ist jeder Takt ein Schritt, aber check nochmal ob das nicht doch bei dir auch so ist!

Natürlich kann man den Takt akt anders generieren. Wenn es nicht so genau sein muss dann bekommt man das mit einem Logik IC wie 7413 und einem Kondensator hin. Die Schaltung hab ich immer zum testen von Schrittmotoren benutzt.

Aber das wäre eigentlich Verschwendung des Schrittmotors. Beim Schittmotor ist es ja gerade das schöne das du gezielt eine ganz genaue Anzahl von Takten ausgeben kannst. Um beispielsweise einen Roboter um 90 Grad zu drehen braucht man je nach Radgröße eine festgelegte Zahl von Takten. Die Geschwindigkeit in der man die schickt ist eigentlich völlig egal - solange die Anzahl stimmt würde der Bot immer einen 90 Grad Winkel drehen. Teilt man die Anzahl der Takte durch 2 dann hat man den Wert für die 45 Grad Drehung usw. Man kann also den Bot in jedem Winkel genau drehen und bewegen, man muss nur die Taktzahl addieren.
Das ganze würde man nicht mehr so genau hinbekommen wenn du einen Taktgenerator benutzt.

Aber vermutlich willst du sowieso etwas anderes mit dem Schrittmotor machen. Für schnelle Flitzer und Rennbots ist ein Schrittmotor sowieso nicht sonderlich gut geeignet - da solltest du vielleicht dann doch ein normalen Getriebemotor denken.

Beim Schrittmotor ist etwas Assemblercode oder zumindest compilierter Basic-Code wie mit AVR-Bascom empfehlenswert, da bekommt man schon recht flotte Taktraten hin. Timer braucht man noch nicht mal unbedingt.

Gruß Frank

korreander12
23.03.2004, 20:32
In einem Byte sind doch die kompletten Infos für eine Phasenstellung vorhanden, also müsste auch jedes Byte einen Schritt bewirken.


Ja aber ich dachte immer es sind 4 (??) Phasenstellungen nötig um den Anker einen Schritt zu bewegen.
z.B.:

Phase1 zieht // Phase2 drückt
Phase1 zieht // Phase2 zieht
Phase1 drückt // Phase 2 zieht
Phase1 drückt // Phase 2 drückt

Ich möchte damit vorerst mal eine Modell-CNC-Fräse ansteuern, die im Eilgang schon ein bisschen Speed haben sollte.

Danach (in meinem nächsten Projekt) möchte ich dann einen Kettengetriebenen Robby bauen. (mit L297/298 Schaltung )

Manf
23.03.2004, 20:39
Das sind vier Schritte.
Eigentlich sind es die Zwischenschritte des Halbschrittverfahrens, wobei die Vollschrittpositionen, in der nur eine Spule akitv ist, weggelassen wurden. Laufen tut der Motor damit, nur auf die Definitionen mussen wir uns zur Diskussion einigen.
Manfred

korreander12
23.03.2004, 20:49
Aha,
versteh ich jetzt nicht ganz.....

Was heisst das ganz genau,
heisst das ich betreibe den motor nicht im "echten" Vollschrittbetrieb ???



Vollschrittpositionen, in der nur eine Spule akitv ist


heisst das ich muss immer nur 1 Spule anziehen lassen ???


also

Phase 1 ziehen
Phase 2 ziehen

usw....

Bernd

Manf
23.03.2004, 21:11
Es geht nicht um muß, er wird laufen.
Gebaut ist er für den Lauf im Vollschrittberieb.
ost, nord, west, süd,
oder auf dem Papier:
rechts, oben, links, unten,
Das Haltemoment an den Positionen, mit nur einer aktiven Spule ist am größten. Demnach wird der Wirkungsgrad ein bischen besser sein, im Vollschrittbetrieb mit jeweils nur einer gleichzeitig aktiven Spule gegenüber jeweils zwei gleichzeitig aktiven Spulen.
Manfred

Frank
23.03.2004, 23:41
So sehe ich es auch! Allerdings machst du trotzdem volle Schritte und das mit jedem Byte! Also kann das mit der geringen Umdrehungszahl die du genannt hast irgendwie nicht hin kommen. Somit muß dein Timer doch wohl erheblich langsamer sein.

korreander12
24.03.2004, 12:13
Das heisst also dass ich die Bytefolge so lassen könnte,
und trotzdem höhere Umdrehungen erreichen müsste ??? (zu lasten des Haltemoment)

Also wird der Fehler warscheinlich im PC-System liegen (Timer- LPT1 etc..)

Könnte es nicht auch an der Karte liegen, oder ist das auszuschliessen ???

Ich will halt eine Anwendung für Win2k schreiben. Desswegen auch der Borland Builder und die daraus resultierenden Probleme !!!

Vielen Dank für Eure tolle Hilfe !!!

24.03.2004, 12:37
Ja korrekt!
Wie gesagt, lass mal einen langsamen takt mit 2 Sekunden Pause zwischen jedem Byte ausgeben. Dann siehst du ja selbst das er sich bei jedem Byte einen Schritt bewegt. Wenn das richtig klappt, dann mußt du nur noch Software optimieren. probier es dann doch erstmal nur mit einer FOr-Next Schleife bevor du Sachen mit Timer machst.

Also Stück für Stück rantasten.

Gruß Frank