Hallo, ich beschäftige mich gerade damit, wie man eine Fräse mit konstanter Geschwindigkeit im Kreis fahren lassen kann. Dabei bin ich über diesen Thread Beitrag "Bresenham-Kreis: Verschobener Start ?" auf den Bresenham-Kreis-Algorithmus gestoßen. Der Algorithmus ist ja dafür bekannt, daß er nur mit Additionen/Subtractionen und ein bischen Bit-Shiften auskommt, und dadurch sehr schnell ist. Nun ist es aber so, daß wenn ich mich gleichzeitig in X- und Y-Richtung bewegen die 1,4-fache Geschwindigkeit habe, als wenn ich mir nur in X oder Y-Richtung bewegen. Nun sollte eine Fräse im Werkstück mit konstanter Geschwindigkeit fahren. Weiß jemand, ob es da eine elegante Lösung für gibt. Ansonsten würde spätestens bei der Geschwindigkeitsermittlung wieder viel gerechnet werden müssen und damit der ganze Geschwindigkeitsvorteil des Bresenham-Algorithmus verloren gehen. Grüße, Bernd
Ich würde es einfach vektoriell rechnen und gut. Der Recourcenbedarf ist auch im 3-D-Raum noch vernachlässigbar. Zumindest, solange man nicht eine sehr teure und präzise Fräse (Hermle o.Ä.) hat. Bei denen ist dann die Steuerung mitsamt DSP ohnehin dabei. Grüße, Peter
Die 1,4-fache Geschwidigkeit der Fräse bei gleichzeitiger x- und y-Bewegung kommt doch etwa von der Wurzel aus zwei, welche das Ergebnis vom Satz des Pythagoras ist, wenn man die "einfache" Geschwindigkeit in beide Richtungen fährt, oder nicht? Aus sin^2 + cos^2 = 1 folgt ja, dass die Geschwindigkeit am Kreis entlang immer gleich ist?
moin moin,
>>Bresenham-Kreis-Algorithmus ...sehr schnell
warum muß er schnell sein?
Wie schnell wird gefräst?
mfg
Pieter
> Die 1,4-fache Geschwidigkeit der Fräse bei gleichzeitiger x- und > y-Bewegung kommt doch etwa von der Wurzel aus zwei, welche das Ergebnis >vom Satz des Pythagoras ist, wenn man die "einfache" Geschwindigkeit in >beide Richtungen fährt, oder nicht? Ja. Werden nach Bresenham aber nicht gegen Ende des Oktanten immer X und Y um 1 versetzt, was zur 1,4-fachen Geschwindigkeit führt? >Aus sin^2 + cos^2 = 1 folgt ja, dass die Geschwindigkeit am Kreis >entlang immer gleich ist? Wie ist diese Aussage im Zusammenhang mit dem Algorithmus zu sehen? > warum muß er schnell sein? Muß er nicht unbedingt, aber sind Divisionen, Multiplikationen,... nicht auf den meißten MCUs relativ langsam? > Wie schnell wird gefräst? Noch garnicht, ist alles noch in der Planungsphase. Wenn man mal von max. 2000mm/min (33,33mm/sec) ausgeht und von 3mm Steigung und 1,8° Schritten (200 Schritten/Umdrehung) und von 8-16 Microschritten, komme ich da so auf ca. 30-50µs je Schritt. Ich gehe also mal davon aus, daß es möglich ein soll alle 30µs einen Schritt auszugeben. Ein PIC32@80Mips sollte also ca. 2400 Single-Cycle-Instructions in der Zeit beweltigen können abzüglich dem, was für das Interrupthandling und kleinere Nebenaufgeben draufgeht.
> Wenn man mal von max. 2000mm/min (33,33mm/sec) ausgeht ...
Du willst also mit einem Vorschub von 2000mm/min fräsen?
Welches Material?
Was für ein Fräser?
Welche Frästiefe?
Wie stellst du dir die Kühlung vor?
moin moin, meine Spindel hat 1" Steigung, 5PhasenStepper mit Halbschritt sind 25,4µm/Step. Bei 10mm/s brauche ich also 394 Steps/s -> 2,54ms je Stepp. Für sin/cos braucht mein 8051 System ca. je 250µs, mit allen Rechnungen wird ca. alle ms eine Position berechnet. Den Bresenham habe ich beim Kreis wieder rausgenommen, zuviele Probleme wenn Anfangs und Endpunkt beliebig sein sollen. In Delphi ist das Programmmodul Kreis mit Bresenham ca. 360 Zeilen, mit Kreisgleichung ca. 60 Zeilen lang. Der Faktor sqrt(2) bei der Geschwindigkeit ist nicht auf den Kreis beschränkt. Als sqrt(2) rechne ich den Zeitwert des Timers (16Bit) T2 = T * 362 / 256. Mit Gruß Pieter
2m/min ist schon ziemlich schnell. Sowas fährt man nur, wenn der Fräser nicht in Material eingreift, oder hat eine sehr steife Maschine bei ziemlich "weichem" Material. Das Thema hatten wir hier schon mal. Das Ergebnis ist eigentlich recht einfach: Wenn man den Fräser nur in einer Ebene verfährt (X oder Y), dann programmiert man zwischen zwei Schritten die einfache Zeit. Bewegt sich der Fräser gleichzeitig in 2 Ebenen, dann programmiert man die 1,4-fache Zeit zwischen zwei Schritten. Bei drei Ebenen ist es entsprechend mehr Zeit zwischen den Schritten. >Aus sin^2 + cos^2 = 1 folgt ja, dass die Geschwindigkeit am Kreis >entlang immer gleich ist? Das sollte so sein (Soll-Bedingung). Daraus folgt aber auch, dass man die X-Y-Geschwindigkeit anpassen muss.
moin moin,
>>Bei drei Ebenen ist es entsprechend mehr Zeit zwischen den Schritten.
warum??
und welchen Faktor (sag jetzt nicht sqrt(3)!)
mfg
Pieter
>>Bei drei Ebenen ist es entsprechend mehr Zeit zwischen den Schritten. >>warum?? >>und welchen Faktor (sag jetzt nicht sqrt(3)!) Warum nicht? ;-)
Pieter wrote: > moin moin, > >>>Bei drei Ebenen ist es entsprechend mehr Zeit zwischen den Schritten. > warum?? > und welchen Faktor (sag jetzt nicht sqrt(3)!) Wie lang ist die Diagonale eines Würfels in Bezug zu seiner Seitenlänge? (Hinweis: 2 mal-iges Anwenden des Pythagoras, und du hast das Ergebnis)
>mit konstanter Geschwindigkeit fahren
Wie sagte mein alter Physiklehrer immer:
Die kreisförmige Bewegung ist immer eine beschleunigte Bewegung! ;-)
Bernd wrote: > Muß er nicht unbedingt, aber sind Divisionen, Multiplikationen,... nicht > auf den meißten MCUs relativ langsam? Im Relation dazu ist deine Fräse schnarchlangsam.
moin moin, @Karl Heinz Kantenlänge(Rubiks Cube läst grüßen..), schon klar, ist ebend nichts wenn man auf arbeit was mit Ameisensäure klebt und dabei denken soll... ..die anvisierte Geschwindigkeit ist nicht zum fräsen gedacht. Damit soll ein Beitrag zur Küchenarbeit geleistet werden. z.B. Eiweis zu Schaum verarbeiten...meine Frau fragt auch immer nach möglichen anwendungen ;-)) Mfg Pieter
Pieter wrote: > ..die anvisierte Geschwindigkeit ist nicht zum fräsen gedacht. Damit > soll ein Beitrag zur Küchenarbeit geleistet werden. z.B. Eiweis zu > Schaum verarbeiten...meine Frau fragt auch immer nach möglichen > anwendungen ;-)) LOL. In dem Fall braucht dann aber auch der sin/cos nicht sonderlich genau sein. Eine Tabelle mit den Werten von 0 bis 90 Grad in 1 Grad Schritten sollte doch locker ausreichen.
moin moin, >>max. 2000mm/min (33,33mm/sec) ausgeht und >>von 3mm Steigung und 1,8° >>Schritten (200 Schritten/Umdrehung) und >>von 8-16 Microschritten, komme >>ich da so auf ca. 30-50µs je Schritt 3mm/( 200Stepps*8MicroStepps) = 0,001875mm/MicroStepp Bei 30mm/s sinds dann 62µs, da werden die Motore+ Ansteuerung nicht mehr mitmachen. Warum keine Spindel mit größerer Steigung? z.b. 16mm/u sind mit 1600MircoSteps eine Auflösung von 10µm je Schritt. Sollte für ein Hobbygerät ausreichend sein. mfg Pieter
> Bei 30mm/s sinds dann 62µs, da werden die Motore+ Ansteuerung nicht mehr > mitmachen. Ich kenne wir eine "einfache" Fräse (<10000€), die mit ähnlichen Daten ausgestattet ist. Im übrigen ist die hohe Schrittzahl in erster Linie dazu gedacht Resonanzen und Geruckel zu begegnen, so daß der Fräser mehr von einer Position zur nächsten gleitet anstatt zu springen. Kunststoffe kann man durchaus mit 2000mm/min schruppen. Das ganze soll erst mal ein nettes Projektchen werden. Mechanik gibt's noch keine. Erst muß die Steuerung für die Schrittmotore zumindest in meiner Phantasie so funktionnieren, wie ich mir das vorstelle. Bisher habe ich nur eine Treiberkarte mit TMC236 aufgebaut. Und da habe ich beim PIC32 eben das Problem, daß dieser nur 2 SPIs hat. Ich aber 3 bräuchte, um alle Motore parallel anzusteuern. Bei einer Ansteuerung nacheinander würde eine Übertragung ca. 10µs dauern, was mir zu langsam ist. Nun denke ich über eine analoge Ansteuerung nach, um von dem groben Ansteuerraster (10µs) wegzukommen. Ob das jetzt nun notwendig ist oder ob es auch mit einem groberen Raster geht, ist erst mal egal. Wie heißt es so schön? Des Menschen Wille ist sein Himmelreich ;-) Was hat das Ganze mit der oben gestellten Frage zu tun? Ich probiere vorab mir über mögliche Probleme klar zu werden. Die Mechanik ist für mich also erst einmal sekundär. Für mich steht zur Zeit die Ansteuerung im Mittelpunkt der Betrachtung. Vielleicht ruckelt ja auch garnichts. Es gibt ja auch noch die Masseträgkeit nach Newton, wo wir schon mal bei Physiklehrern sind ;-) Das mit 1,41-fache bei schrägbewegungen. Nehmen wir an, ich würde eine Schräge fahren. 1-Schritt nach rechts (1ms) 1-Schritt nach rechts oben (1.41ms) 1-Schritt nach rechts (1ms) 1-Schritt nach rechts oben (1.41ms) 1-Schritt nach rechts (1ms) Das hieße, für 5 Schritte nach rechts und 2 Schritte nach oben würde ich sagen wir mal 5,82ms brauchen. Aber SQRT(5^2 + 2^2) = 5,38. Also 5,82 gleich +8% Fehler. Bei 100x/200y wäre der unterschied 241/223,6 (+7,8%). Bei bei 1000x/2000y wäre der Fehler ähnlich 2410/2236. Also durchaus machbar.
Warum lässt du den Motion Controler nicht einfach auf einem PC laufen? z.B. mit linuxcnc? Da sind solche Berechnungen überhaupt nicht aufwendig, und mit Sicherheit schnell genug. Zudem gibt es da ein ordentliches Dateisystem für die Machinefiles und G-Code. Nicht zu vernachlässigen ist auch die grafische Benutzeroberfläche mit vorheriger visueller Simulation. Ich baue auch gerade so eine Steuerung (für eine Colinbus, deren Originalsteuerung einfach nicht zu gebrauchen ist). Ich habs jetzt so gemacht, dass die Motoren mit meiner DSP-Steuerung im stromgeregelten Mikroschrittbetrieb laufen, solange die Arbeitsgeschwindigkeiten niedrig sind. In den höheren Geschwindigkeiten wird die Bestromungsart zunächst auf Halbschritt und dann auf Vollschritt umgeschaltet um das notwendige Moment aufzubringen. Der PC liefert meiner Steuerung Takt- und Richtungssignale in Mikroschrittfrequenz und die Steuerung entscheidet über die Geschwindigkeit, ob die Mikroschritte gemacht werden oder übersprungen werden. Zum manuellen Fahren und Einmessen/Antasten gibt es zudem 3 Drehgeber (500 Schritte) mit Kurbeln. Soweit mal die Planung. Wie soll denn deine Steuerung aussehen, vielleicht kommt man ja bei bestimmten Sachen auf einen Nenner und muss die nur einmal entwickeln, so könnte man sich die Arbeit aufteilen und am Ende einfach den jeweiligen Teil 2 mal bauen. Grüße, Peter
moin moin, @Bernd & Peter sorry, hat etwas gedauert...habe aus der Bucht "aus versehen" 2 Kugellaufwagen für 2,61€ ergattert:-)) Anbei meine Testversion CNCView, seht Euch die mal an.(Eigenschaften) Kernstück sind 2 UPs (Linie und Kreis) ide die fortlaufenden Positionen berechnen, das Ergebnis landet in einem FiFo. Damit ist die gleichzeitige Ansteuerung aller 3 Motore sicher, das Byte selber wird per SPI übertragen. Der FiFo wird per Timer ausgelesen( wegen Start-StopRampe). Den Timerwert werder ich mal modifizieren. *1 bei 1 Motor *sqrt(2) bei 2Motore *sqrt(3) bei 3 Motore mal sehen was das bringt. Für den Handbetrieb gibt es eine abgesetzte Anzeige-Tastatur-Drehgeber Einheit, läuft mit auf dem SPI-Bus. Mit Gruß Pieter
Versteh ich das richtg. In Dein FiFo kommen alle Rasterpositionen, die Du ergendwie (z.B. mit obigem Algorithmus) ermittelt hast. Du verwendest also keine Vektoren, bzw nur Vektoren der Länge 1 Step. Beim ausgeben testest Du, ob für den jeweils nächsten Schritt 1, 2 oder alle 3 Motore bewegt werden müssen. In Abhängigkeit davon setzt Du den Timer für die nächste Ausgabe auf den Wert für einen einfachen Schritt. Wird mehr als ein Motor gleichzeitig angesteuert, erhöhst Du den Timer Wert, damit die Geschwindigkeit sich nicht nennenswert ändert (also SQRT oder ^1/3). Korrekt?
@Peter Diener: Zur Steuerung habe ich mir noch keine näheren Gedanken gemacht. Auf jeden fall soll der PC das komplette Programm an den Controller übertragen. Danach soll dieser dann auch bei abgeschaltetem PC den Auftrag ausführen. Als Massenspeicher könnte man der MCU ja eine SD-Karte spendieren. Dann hat man genügend MB Platz um auch bereits vom PC aufbereitete Daten zu speichern.
ja Bernd, im FiFo sind immer nur 1Schrittwerte, diese werden Timergesteuert an die Motore gesendet. Anbei mal ein Bild meiner Fräse. Der gesmate G-Code wird zur Fräse übertragen und dann abgearbeitet. Der Timer wird z.B. zur Sart-StoppRampe auch verändert. mfg Pieter
@Pieter: Wo berechnest Du die Rampen. Und wie stellst Du unterschiedliche Geschwindigkeiten ein? Erhält Dein FiFo neben den Schrittinformationen auch noch zusätzliche Daten zu Geschwindigkeiten und zur Rampengenerierung?
moin moin, etwas Stress heute... Rampe nur als sin^2, Timerwerte 16Bit, Timerbasis 1µs, max 65,5ms. In die Drehzahl geht die Steigung (Schrittweite) der Spindel mit ein. Berechnung der Tabelle erfolgt beim F Kommando des GCodes. Der FiFo hat nur die StepByts, Start-Stop wird aus dem FiFoZeiger bestimmt. Ablauf ungefähr so: Loop: NextPos While TimerStop do; Steps := FiFo[FoFoPos] Case Anzahl_Motor(Steps) of 0: Timer :=1 1: Timer := Tabelle[FifoPos] 2: Timer := Tabelle[FifoPos]* sqrt(2) 3: Timer := Tabelle[FifoPos]* sort(3) SPI := Steps TimerStart JUMP Loop Beim Start wird erst ab FiFoPos=Full ausgegeben Bei Stop wird noch bis FiFoPos=0 ausgegeben mfg Pieter
Nachtrag, warum ich sin^2 als Rampe nehme, bei linear ist mir der Sprung bei Beschleunigung oder Reichtungsumkehr einfach zu groß, das knallt richtig. Eventuell kann ja jemand die Rechnung für diskrete Schritte umstellen.
moin moin, @Bernd, keine Fragen mehr? mfg Pieter
Moin Pieter, die Fragen kommen noch. War am Wochenende nur etwas busy andererseits;-) Grüße, Bernd
@Pieter: Noch mal zur Rampe. Als ich nach der Berechnung der Rampe gefragt hatte, meinte ich nicht, welche Form die Rampe hat, sondern, woher Dein FiFo überhaupt weiß, daß es eine Rampe zu berechnen gibt. Ich meine, nehmen wir mal an, Du fährst erst mit maximaler Geschwindigkeit in X-Richung. Dann ab einem gewissen Punkt geht es abrupt in Y-Richtung weiter. An dieser stelle muß ja erst einmal in X-Richtung gebremst werden, und dann wieder in Y-Richtung beschleunigt. Wie detektierst Du frühzeitig, daß es zu einer abrupten Richtungsänderung kommt, die eine Bremsrampen erforderlich macht? Die andere Frage wäre: Es gibt beim Fräsen die Möglichkeit zwischen spitzen Ecken (Fräser kommt in der Ecke zum stehen, und beschleunigt nachher in andere Richtung) und der Möglichkeit Ecken zu verrunden, um die Fräsgeschwindigkeit zu steigern (kein abbremsen bis zum Stillstand an den Ecken). Wie gehst Du damit um?
moin Bernd, der Fifo ist dumm, von Rampe und so hat der keine Ahnung. Die Richtungsänderung kann doch nur durch den GCode erfolgen, z.B.: G01 X100 Y0 Z0 G01 X100 Y100 Z0 1.Zeile, 100mm in X fahren. Bis der FiFo voll ist, wird mit der Rampe die Schrittgeschwindidkeit erhöht ,mit dem Zeiger für den Fifo wird auch die Tabelle für den Timer gelesen. Durch den Fifo "hängt" die Ausgabe z.B. 20 Schritte hinterher. Das ermöglicht die Ende-Erkennung. Ist die Anzahl der X-Schritte erreicht, wird das Füllen des FiFos abgebrochen, der Rest im Fofo (i.d.R. 20 Schritte) wird mit fallender Schrittgeschwindigkeit ausgegeben. Jede Strecke wird also angefahren und abgebremst. In der 2. Zeile wird dann nur Y angefahren und abgebremst. Ein abrupter Richtungswechsel bei linearen Bewegungen ist so nicht möglich. andere Frage, andere Sichtweise? Bei Innenecken wird zur Ecke abgebremst, dann Richtungswechsel mit anfahren. Bei Aussenecken wird ein Hilfskreis (Center ist die Ecke) ausgeführt, vor und nach diesem Hilfskeis wird auch wieder gebremst. Der Winkel einer Ecke spielt dabei keine Rolle. Ohne Fräsradienkorrekur wird genau die Bahn gefräst, abgerundete Ecken sind also in der Bahnbeschreibung anzugeben. Im CNCView sieht man den Unterschied im StepModus. mfg Pieter
Verstehe ich das also richtig, daß Du immer nur eine Zeile G-Code (Linie oder Kreis) an den FiFo übergibtst. Kommt es zu einer Richtungsänderung (neues G-Code Komando), läßt Du den FiFo erst leer laufen. Dann wird er bei einer neuen Zeile (neues G-Komando) erneut gefüllt? Daß ich danach gefragt habe, hat folgenden Hintergrund. Ausgehend davon, daß Kreise sich ja mit beliebig vielen Geraden annähern beschreiben lassen, würde ich bei der Datenaufbereitung Kreise in eine Folge von kleinen Linien umrechnen. Die Richtungsänderung dabei wäre gering. Andererseits möchte ich natürlich nicht, daß der Fräser nach jeder Teilgeraden stehen bleibt. Ich denke daher darüber nach, wie man am besten bestimmen kann, bei welchen Richtungsänderungen wie früh gebremmst werden muß, und auch, bis zu welcher Geschwindigkeit heruntergebremmst werden soll. Es muß ja nicht immer Stillstand sein. Grüße, Bernd
moin moin,
jo, es wird immer eine Zeile G-Code abgearbeitet. Dann kommt die Fräse
zum Stillstand, neue Zeile wird geladen und der nächste Punkt berechnet.
Bei Radienkorrektur dauert das so ca. 50ms, dann gehts weiter.
>>Kreise sich ja mit beliebig vielen Geraden
jo, bei mir sind die Graden immer 1 Schritt lang.
Längere (schräge) Strecken werden durch den Linien-Bresenham doch auch
in X-Y-Z Schritte einzelnt umgearbeitet.
Nicht ganz abbremsen...mag bei Hochgeschwindigkeitsfräsen was bringen.
Bei meiner Hobbyfräse ist die Zeit nicht so wichtig.
mfg
Pieter
Hallo Peter, habe letztes Jahr eine CNC-(Käse)Fräse gebaut ... siehe www.greinert-dud.de Software und Schrittmotoren-Steuerung alles selber gemacht Fräse damit Leiterplatten (Umriss-Isolation-Fräsen) Fräse wird komplett über USB vom PC gesteuert, dabei wird sogar der Strom für die Stepper an die jeweilige Geschwindigkeit angepasst. Gruss Ralf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.