Hallo Zusammen Ich programmiere mir gerade eine CNC Steuerung für eine Fräsmaschine. Die Steuerung kann die Achsen immer nur einen Schritt (Inkrement) in X oder Y bewegen. Eine Diagonale wird also bei genauem betrachten als "Treppe" aufgelöst. Bei einem Kries ist es dasselbe. Das Prinzip ist das gleiche, wenn man einen Kreis auf einem Bildschirm darstellen will...(pixel) so weit zur Theorie. Der Knackpunkt liegt nun bei der Kreis Interpolation. Ich suche nun eine möglichst einfache formel mit der ich die anzahl Inkremente zwischen Start- und Endpunkt berechnen kann (länge des Bogens). Im Beispiel währen dies 23. Gegebene Grössen: -Mittelpunkt X0 / Y0 -Startpunkt X-9 / Y4 -Endpunkt X6 / Y8 -Radius R10 Im Beispiel würde ich das mit folgender Formel machen: Ink = (0-Xstart) + (R-Ystart) + (Xend) + (R-Yend) Ergibt 23. Nun Funktioniert dies aber nicht wenn der Endpunkt beispielsweise bei X-6 / Y8 ist. Hat da Jemand einen Lösungsvorschlag ?? Vielen Dank
Michael L. schrieb: > t nun bei der Kreis Interpolation. Such nach "Bresenham". Da gibt es auch eine Variante davon für Kreise.
Alternativ: Da Kreise bzw. Bögen nicht so oft vorkommen, kann man das auch mittels Winkelfunktionen für kleine Winkelinkremente berechnen und dann durch Vergleich mit dem jeweils vorhergehenden Punkt am Bogen bestimmen, ob der Inkrement in X bzw. in Y RIchtung passieren soll. Berechnungsgeschwindigkeit ist dabei auch nicht wirklich ein Thema, denn dein µc kann auch im schlechtesten Fall schneller rechnen als deine CNC Maschine verfahren kann.
Noch eine zusatz Info:
Der Interpolator ansich funktioniert bereits nach dem "Bresenham"
Prinzip. Ich muss jedoch zuvor wissen wieviele Inkremente der Bogen
enthält.
Bei einem 90° Bogen währe die Anzahl Inkrement für den Bogen 2*R = 20
Nur wieviele sind es bei 3°, 132°, 185° oder bei 359° ?
Karl Heinz schrieb:
> Da Kreise bzw. Bögen nicht so oft vorkommen
Stimmt nicht, kommen ziemlich häufig vor...
Michael L. schrieb: > Noch eine zusatz Info: > > Der Interpolator ansich funktioniert bereits nach dem "Bresenham" > Prinzip. Ich muss jedoch zuvor wissen wieviele Inkremente der Bogen > enthält. > > Bei einem 90° Bogen währe die Anzahl Inkrement für den Bogen 2*R = 20 > Nur wieviele sind es bei 3°, 132°, 185° oder bei 359° ? > > Karl Heinz schrieb: >> Da Kreise bzw. Bögen nicht so oft vorkommen > Stimmt nicht, kommen ziemlich häufig vor... Trotzdem: Wie schnell kannst du verfahren und wie schnell kannst du einen sin/cos ausrechnen, bzw. die Werte für einen konkreten Winkel aus einer Tabelle holen bzw aus 2 Werten interpolieren? ... auch mit dem Zusatz, dass für kleine Radien die Winkel (bzw. WInkelinkremente) recht grob sein können.
:
Bearbeitet durch User
Die Anzahl der Inkremente hängt doch nicht von deinem Winkel, sondern von der Auflösung deiner Fräse (Schrittweite) ab. Klar kann man eine Formel bilden, die sich auf Radius und Winkel bezieht, der kleinste Nenner ist aber, wie weit sich deine Fräße pro Schritt bewegt. Für die Winkel wirst du um trigonometrie nicht herum kommen. Du brauchst Anfangs und Endpunkt, dazwischen dann delta X und Y berechnet und durch deine Schrittweite geteilt.
Hallo, für Viertelkreise in den 4 Quadranten und Teile davon ist das trivial, du musst nur den Endpunkt kennen, dann weisst du wieviel Schritte das in X und Y bis dahin sind. Also teil dein Problem in die 4 Quadranten auf und zähl die Schritte zusammen. Bresenham führt auch zum Ziel, aber da weisst du die Schrittzahl erst wenn du angekommen bist. Die Frage ist bloss, was du mit dem Abstand anfangen kannst, du brauchst ja für einen Kreis den Weg. Den liefert Bresenham, der Abstand dagegen ist in jedem Quadranten schlicht der Manhatten-Abstand. Gruss Reinhard
Also pro inkrement bewegt sich eine Achse um 0.001mm Der Maximale Vorschub ist ca. 10000mm/min Das ganze läuft aber auf einem Industrierechner mit 1GHz. @Karl Heinz, so wie ich dich verstehe willst Du den Kreis in ein Vieleck aufteilen ? Dem Interpolator muss ich sagen wo der Mittelpunkt und Startpunk liegen, und wie viele Inkremente bis zum Endpunkt sind. Eine andere Variante währe, dass der Interpolator so lange fährt, bis er den Endpunkt erreicht. Somit bräuchte man die Länge vorher nicht zu berechnen. Das Problem ist dabei aber, dass der Interpolator nicht weis, wann er die Rampe einleiten muss.
Michael L. schrieb: > @Karl Heinz, so wie ich dich verstehe willst Du den Kreis in ein Vieleck > aufteilen ? > > Dem Interpolator muss ich sagen wo der Mittelpunkt und Startpunk liegen, > und wie viele Inkremente bis zum Endpunkt sind. Und der Interpolator kann Kreisbögen? Wenn dem so ist, dann bleibt dir sowieso nichts anderes übrig als rauszukriegen, wie der Kreisbögen auflöst. Oder schreibst DU gerade den Interpolator?
Reinhard Kern schrieb: > Hallo, > > für Viertelkreise in den 4 Quadranten und Teile davon ist das trivial, > du musst nur den Endpunkt kennen, dann weisst du wieviel Schritte das in > X und Y bis dahin sind. Kopfklatsch. Ja, das wär zu einfach gewesen. Da bin ich jetzt auch nicht drauf gekommen :-) Michael: Schau dir in deinem Bild mal nur den Quadranten links oben an. Vom Achsenpunkt links auf der X-Achse sind es IMMER 10 Inkrements in X-Richtung, bis du an der Y-Achse angelangt sind. Und es sind auch IMMER 10 Inkremente in Y-RIchtung, bis du an der Spitze der Y-Achse oben angelangt bist. Und das ist unabhängig vom tatsächlich genommenen Weg. Egal wie du fährst, es sind immer 10 Inkremente in X und 10 Inkremente in Y für diesen Quadranten (weil der komplett durchfahren werden muss). Egaal wie du fährst - das beinhaltet aber auch den angenäherten Kreisbogen.
:
Bearbeitet durch User
> Dem Interpolator muss ich sagen wo der Mittelpunkt und Startpunk > liegen, und wie viele Inkremente bis zum Endpunkt sind. > Eine andere Variante währe, dass der Interpolator so lange fährt, > bis er den Endpunkt erreicht. Somit bräuchte man die Länge vorher > nicht zu berechnen. Das Problem ist dabei aber, dass der > Interpolator nicht weis, wann er die Rampe einleiten muss. Worum geht es eigentlich wirklich? Geht es darum, dass du abschätzen musst, wann eine andere Software mit der Bremsrampe anfangen muss?
So jetz habe ich eine Lösung gefunden !! 1. Umfang (in Inkremente) des Vollkreis berechnen U = R*8 2. Länge c berechnen c = sqr(xdiv^2 + ydiv^2) 3. Winkel g berechnen g = cos((R^2 + R^2 - c^2)/(2 R R)) 4. Verhältnis vom Kreisausschnitt zum Vollkreis a = 360/g 5. Anzahl inkremente berechnen ink = U / a ink = 22.6287 gerundet ink = 23 so würde es funktionieren, jedoch habe ich ein problem beim Programmieren der formel unter Punkt 3 Ich brauche eigentlich cos-1, in der Programiersprache Basic gibt es nur cos, und der Wert wird in RAD zurück gegeben, gut letzteres ist kein Problem, ich kann bei punkt 4, einfach 6.28/g rechnen.
> Ich suche nun eine möglichst einfache formel
Falscher Ansatz.
Die Schrittweiten sind zwar vorgegeben bei der CNC, aber die Zeitpunkte
wann die Schritte passieren sind es nicht so sehr.
Man kann viel besser dem Kreis folgen, wenn man KEINEN Bresenham
verwendet, sondern ausrechnet, wann der Schritt kommen muss, an dem die
nächste Linie genau zu 50% den Kreisbogen schneidet.
Karl Heinz schrieb:
> Worum geht es eigentlich wirklich?
Der Interpolator funktioniert, ich muss nur einen weg finden wie ich die
anzahl Inkremente des Kreisbogens berechne. Also die rote Zickzack
Linie...
Michael L. schrieb: > Karl Heinz schrieb: >> Worum geht es eigentlich wirklich? > > Der Interpolator funktioniert, Ich habs immer noch nicht. Hast du den Interpolator geschrieben? Wenn ja, was hindert dich daran, schlimmstenfalls eine Art 'trockenes Interpolieren' zu betreiben? Also interpolieren ohne die tatsächlichen Inkremente auch auszuführen sondern nur mitzuzählen. Bei 1Ghz sollte das ja nicht wirklich ein Laufzeitproblem sein.
Wie gesagt, Anfang - Endpunkt und das unter berücksichtigung der Quadranten. Für die rote Strecke: Anfang -> 90° deltaX = abs(0-9) = 9 deltaY = abs(10-4) = 6 90° -> Endpunkt deltaX = abs(0-6) = 6 deltaY = abs(10-8) = 2 Ergibt insgesammt 9+6+6+2 = 23 Schritte Warum kann die Steuerung eigentlich nicht diagonal fahren?
@Karl Heinz
Ja den Interpolator habe ich bereits geschrieben, dieser ist einen
Funktion, und braucht eben Bogenlänge sowie Start-, und Mittelpunkt.
Ein Trockendurchlauf währe theoretisch auch möglich, jedoch ist dan die
Rechenzeit immer unterschiedlich (jenach grösse des Radius). Im Beispiel
ist der Durchmesser bei einer Auflösung von 0.001mm nur 0.02mm. In der
Praxis wird es selten so kleine Durchmesser geben. Wenn der Durchmesser
nun 3000mm ist, so geht das viel zu lange.
Deshalb soll das rechnerisch gelöst werde so das die Rechenzeit immer
gleich lang ist.
@robin
Diese Lösung gefällt mir auch sehr gut, und bräuchte evtl weniger Zeit
als mit den Formeln wie ich es gemacht habe.
> Warum kann die Steuerung eigentlich nicht diagonal fahren?
Weil der Prozessor auch nur einen Befehl um den anderen ausführen kann.
So ein inkrement ist nicht ein Meter lang, nur 0.001mm. Die Antriebe
haben auch eine gewisse trägheit, misst man dies Mechanisch nach, so hat
man nie dieses stuffige abbild.
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.