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?
> 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.
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)
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.
@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