Mit µ sek. Arbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Dienstag 21. Oktober 2008, 18:06

Hallo

Ich bin wieder an den Schrittmotoren angekommen.
Jetzt habe ich auch die Vorschubsteuerung im Griff (Mathemathisch gesehen).

Mein Probel:
Ich Steuere den Schittmotor mit einem Takt von 10µsek (ist noch zu viel sollte so bei 8µsek liegen) an, wenn ich jetzt eine Geschwindigkeit von 1mm/min angebe und 2mm fahre mit meiner Fräsmaschine brauche ich aber 3,4 min, also 1,4 min zuviel.

Ich habe die befürchtung das die Pausezeiten nicht genau eingehalten werden.

Bis jetzt mache ich das mit "time.sleep()".

Kenn da jemand auch schon was in die Richtung?

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 21. Oktober 2008, 18:19

Ich habe die besten Erfahrungen beim Messen bzw. Festlegen sehr kurzer Zeiträume/Verzögerungen mit time.time() (unter Linux) bzw. time.clock() (unter Windows) gemacht. Mit time.sleep() habe ich ähnlich (schlechte) Erfahrungen gemacht wie du.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Dienstag 21. Oktober 2008, 18:22

Hallo

Danke das hört sich doch schon besser an.
Werds mal testen!

gerade gesehen:
mit "time.clock()" kann keine Zeit stoppen.

Weiss jemand eine Methode wir ich genau(er) an meine 10µsek. rankommen?

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 21. Oktober 2008, 18:53

Andyh hat geschrieben:Steuere den Schittmotor mit einem Takt von 10µsek (ist noch zu viel sollte so bei 8µsek liegen) an
Hallo Andyh!

Schrittmotoren die ich kenne, laufen eine Umdrehung bei 100 Schritten. Es gibt auch Schrittmotoren, die mehr Schritte für eine Umdrehung brauchen.

Und das Nächste ist, dass Schrittmotoren nicht unendlich schnell angesteuert werden können. Je schneller du einen Schrittmotor ansteuerst, desto schwächer wird er. Irgendwann, bei irgendeiner Ansteuergeschwindigkeit ist er so schwach, dass er sich überhaupt nicht mehr dreht.

Und jetzt mal ein wenig rechnen. Wenn du möchtest, dass ein Schrittmotor, der 100 Schritte für eine Umdrehung braucht, sich ein mal die Sekunde dreht, dann musst du 100 Schritte an den Schrittmotor schicken. Das ist ein Impuls alle 0,001 Sekunden. Das wäre eine Pause von 1 ms (Millisekunde).

Bei einer Pause von nur 10 µs (Mikrosekunden), würde der Schrittmotor 100.000 Impulse die Sekunde bekommen.

1 / 0,00001 = 100000
100000 / 100 = 1000

Er würde sich theoretisch also 1000 mal die Sekunde drehen. Irgendwie stimmt da etwas nicht.

Was das Timing betrifft: ``time.sleep`` kann nicht unendlich kurz warten. Das Abarbeiten des Befehls braucht selbst auch seine Zeit. Je nach Geschwindigkeit deines Computers, kannst du kürzere oder längere Pausen machen. Bei mir sind z.B. nur Pausen von wenigen Millisekunden machbar. Aber in den Mikrosekundenbereich werde ich kaum vorstoßen können.

Und noch etwas. Du musst auch daran denken, dass die Abarbeitung der Befehle Zeit braucht. Du kannst also nicht einfach 10 ms warten und glauben, dass du damit den Schrittmotor mit einer Frequenz von 100 Hz ansteuerst. Die Frequenz wird sich verkleinern, da die Abarbeitung der Befehle auch seine Zeit braucht.

Wenn du genau arbeiten möchtest, dann darfst du nicht einfach mit ``time.sleep`` warten. Du müsstest dir ein Event-System aufbauen, welches exakt nach 10 ms einen Event auslöst. So ist es egal, wie lange die Abarbeitung der Befehle dauert, so lange es nicht länger als 10 ms ist.

Vielleicht findest du in diesem Thread http://www.python-forum.de/topic-6671.html noch ein paar Informationen, die dich weiter bringen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Mittwoch 22. Oktober 2008, 10:30

Hallo Andyh,

zumindest früher war es so, daß der PC unter Windows keine (wenigstens nicht ohne weiteres) Intervalle unter 10ms erzeugen konnte. Vor allem hast Du mit dem normalen PC (Win, Linux...) kein Echtzeitsystem (garantierte Antwortzeiten usw.) zur Verfügung. Ich würde mal Vermuten, daß Du extra Hardware zur Ansteuerung des Motors brauchst (hoffe ich erzähle Dir nicht Sachen, die Du schon weißt...).

Gruß,

Christoph
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Mittwoch 22. Oktober 2008, 19:07

Hallo

Das es möglich ist steht außer Frage.
z.B. Mach3 (nicht der Rasierer, sondern die CNC-Software) kann das und zwar perfeck unter Win mit dem Paralleport.

@Christoph
Mit einem Microcontroller währe das eine saubere lösung wenn ich dem dann sage er soll 20 mm verfahren, nur soll das Programm an schon bestehenden anlagen laufen und die sizen meistens am LPT-Port.


@Gerold
Wie immer gut erklärt. Nur stimme ich dem nicht zu, gut ich habe noch was vergessen:

Das Signal ist 10µsek lang aber dann kommt eine pause um genau auf den Vorschub zu kommen den ich brauche.

Ich habe heute nochmal mit einem Telefoniert (Herr Ostermann, in Deutschald der größte entwickler für Schrittmotoren Steuerungen fürs hobby) der sag das optimale Signal liegt bei 8 µsek.

Ist es besser ich steige mit der Ausgabe auf "C" um?

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 22. Oktober 2008, 19:48

Andyh hat geschrieben:Ist es besser ich steige mit der Ausgabe auf "C" um?
Ohne ein Echtzeit-OS bekommst du nun mal keine garantierten Zeitspannen, in keiner Sprache.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 22. Oktober 2008, 21:16

Hallo Andyh!

Einfache, nicht ganz so genaue Schrittmotoransteuerung zur "unipolaren" Ansteuerung eines Schrittmotors mit 200 Halbschritten für eine Umdrehung:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import parallel
import time

half_steps = [
    int("1001", 2),
    int("0001", 2),
    int("0101", 2),
    int("0100", 2),
    int("0110", 2),
    int("0010", 2),
    int("1010", 2),
    int("1000", 2),
]

def main():
    round_counter = 0
    rounds = 0
    p = parallel.Parallel(port = 0)
    while True:
        for half_step in half_steps:
            p.setData(half_step)
            time.sleep(0.001)
            round_counter += 1
            if round_counter == 200:
                round_counter = 0
                rounds += 1
                print "Round: ", rounds

if __name__ == "__main__":
    main()
http://halvar.at/krimskrams2/schrittmot ... ar_v15.gif
siehe: untere Hälfte des Schaltplanes

Für dieses Programm, müsste man die Eingänge A, B, C und D mit Data1, Data2, Data3 und Data4 des Parallelports verbinden.

Als Schrittmotor wird im Schaltplan ein 24 V Schrittmotor mit mit Mittelanzapfung der Spulen verwendet. Da eine halbe Spule auch nur mit der halben Spannung versorgt werden darf, wird hier mit 12 Volt gearbeitet.

Der Parallelport wird hier mit 6 mA belastet. Das halten sehr alte Parallelports nicht aus. Aber neue Parallelports sollten damit kein Problem haben. Man könnte den Schaltplan ändern, so dass weniger Strom über den Parallelport geht, aber wie man sieht, ist der Schaltplan eigentlich für einen Mikrocontroller gedacht. Man könnte die Widerstände an den Eingängen etwas erhöhen z.B. auf 1200 Ohm. Dann würde weniger Strom (4 mA) über den Parallelport fließen.

Zugehöriger Thread: http://www.loetstelle.net/forum/viewtopic.php?t=2207

Ich habe es nicht ausprobiert. Aber ich bin mir trotzdem sehr sicher, dass der Schrittmotor mit diesem Programm laufen wird.

Und wenn du möchtest, dass der Schrittmotor schneller dreht, dann kannst du von 200 Halbschritten auf 100 Vollschritte umsteigen.

mfg
Gerold
:-)

PS: Falls es jemanden interessiert. Die Schaltung ist für so einen Schrittmotor gedacht: http://www.pollin.de/shop/shop.php?cf=d ... Q2OTg2OTk=

.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 22. Oktober 2008, 21:44

Andyh hat geschrieben:Das Signal ist 10µsek lang aber dann kommt eine pause um genau auf den Vorschub zu kommen den ich brauche.

Ich habe heute nochmal mit einem Telefoniert (Herr Ostermann, in Deutschald der größte entwickler für Schrittmotoren Steuerungen fürs hobby) der sag das optimale Signal liegt bei 8 µsek.
Hallo Andyh!

Wenn du den Schrittmotor direkt ansteuerst, dann ist nichts mit 8 µs. Eine Signallänge von 8 µs könnte dazu gedacht sein, um einen Schrittmotortreiber (z.B. mit L297 und L298 --> http://www.roboternetz.de/bilder/l298standard.gif) anzusteuern. Aber auch diese Teile arbeiten nicht mit einer Signallänge, sondern reagieren auf Flanken (LOW/HIGH oder HIGH/LOW). Und damit ist es egal wie lang die Signale sind, hauptsache nicht zu kurz, so dass der IC die Flanke erkennen kann.

Und da ich nicht weiß, wie deine Schaltung aussieht, halte ich jetzt den Mund. :D

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 23. Oktober 2008, 12:54

Hallo Andyh!

So oder ähnlich, kriegst du einen genaueren Timer hin:
http://paste.pocoo.org/show/88848/

Mit den Wartezeiten habe ich etwas experimentiert. Diese Zahlen gelten nur für meinen Computer. Bei anderen Computern sieht es gleich wieder ganz anders aus.

Die Queue darf nicht mehr als einen Eintrag haben, sonst wird die Sache recht unregelmäßig. Die Queue stellt sicher, dass kein Schritt verloren geht.

Je länger der Intervall, desto genauer läuft das Programm. je länger der Intervall, desto länger kann auch die Wartezeit zwischen den Prüfungen der Zeit sein. Ich habe diese Wartezeit auf ein Zwanzigstel der Intervallzeit eingestellt. Damit fahre ich auf meinem Computer ziemlich genau. Je länger der Intervall, desto weniger wird der Computer belastet.

Intervalle von 8 µs lassen sich damit aber auf keinen Fall generieren. Millisekunden -- Ja. Mikrosekunden -- Nein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Freitag 24. Oktober 2008, 11:24

Hallo, ich noch mal:

Allein die Tatsache, daß Gerold schreibt: "die Zahlen gelten nur für meinen Computer" zeigt, wie fragil die ganze Sache ist. Was passiert wohl, wenn Du nebenbei ein Filmchen guckst?

Um Leonidas' Vorschlag aufzugreifen: Hast Du schon mal über RTLinux nachgedacht? Kost nix und könnte helfen.

Gruß,

Christoph
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 24. Oktober 2008, 11:51

ChrisGTJ hat geschrieben:zeigt, wie fragil die ganze Sache ist.
Hallo Christoph!

Ganz so problematisch sehe ich die Sache nicht, da es sich ja nur um eine Fräse handeln soll.
Durch das Übergeben der Schritte an eine Queue, gehen keine Schritte verloren. Und wenn eine Fräse den Kopf kurzfristig etwas langsamer bewegt, dann passiert nichts Tragisches. Schlimm wäre nur, wenn der Fräskopf kurz stehen bleiben würde. Das könnte sich nachteilig auf das Werkstück auswirken. Das Ansteuern von Fräsen mit Nicht-Echtzeitbetriebssystemen ist aber kein Problem und hat sich in der Praxis schon längst etabliert.
Und wenn jemand neben dem Fräsen den Computer mit anderen Programmen auslastet, dann ist er/sie meist selber schuld. :-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Samstag 25. Oktober 2008, 12:18

Hallo
@ Gerold
Du hast es erraten ich arbeite mit L297 und L298.
Du schreibst ja "Das Ansteuern von Fräsen mit Nicht-Echtzeitbetriebssystemen ist aber kein Problem und hat sich in der Praxis schon längst etabliert", weis ich habe ich ja selber, nur wie machen die das?

Wenn´s nicht klappt mit dem PC werde ich wohl auf Microcontroller umsteigen. Schaft dann der meine 8µsek?

Achso, Danke für die ganzen hilfen!!!

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 25. Oktober 2008, 18:14

Andyh hat geschrieben:hat sich in der Praxis schon längst etabliert", weis ich habe ich ja selber, nur wie machen die das?
Hallo Andyh!

Ganz einfach -- die pfeifen auf diese 8 µs.

Denn es ist einfach nicht notwendig, dieses Signal so kurz zu halten. Ich schrieb ja schon, dass nicht die Länge des Signales entscheidend ist, so lange das Signal nicht zu kurz ist (mindestens 0,5 µs). Das Signal kann sogar mehrere Sekunden lang sein -- der IC reagiert nur auf die Flanken (LOW/HIGH oder HIGH/LOW).

EDIT: Direkt aus dem Datenblatt kopiert:
Step clock. An active low pulse on this input advances the motor
one increment. The step occurs on the rising edge of this signal.
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Samstag 25. Oktober 2008, 18:36

Hallo

@ Gerold

Erst mal Danke für deine Bemühungen!

Mir kommt da so ein blöder gedanke das ich was Falsch mache.

Ich gebe bis jetzt so Schritte aus:

- Richtungs Port Einschalten
- Warten 10ms
- Tack Port dazu Schalten
- Warten 10ms
- Tack Port wieder ausschalten
- Warten 10ms
- Tack Port dazu Schalten
- Warten 10ms
-usw.

Wenn ich von Signal reden dann meine ich einer dieser Schritte.
Du redes ja immer von Flanken (LOW/HIGH oder HIGH/LOW) das ist schon das gleiche was ich mache?

Ich erhalte jetzt mit 0.001 sek gute ergebnisse. Am besten sind sie wenn ich die ausgabe in einen Thread im Thread lege und dann den Prozess Priorität auf "Hoch" Stelle.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Antworten