Forum: Mikrocontroller und Digitale Elektronik CNC Kreis mit konstanter Geschwindigkeit fahren


von Bernd (Gast)


Lesenswert?

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

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von Jacek (Gast)


Lesenswert?

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?

von Pieter (Gast)


Lesenswert?

moin moin,

>>Bresenham-Kreis-Algorithmus ...sehr schnell

warum muß er schnell sein?
Wie schnell wird gefräst?

mfg
Pieter

von Bernd (Gast)


Lesenswert?

> 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.

von Gast (Gast)


Lesenswert?

> 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?

von Pieter (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Pieter (Gast)


Lesenswert?

moin moin,

>>Bei drei Ebenen ist es entsprechend mehr Zeit zwischen den Schritten.
warum??
und welchen Faktor (sag jetzt nicht sqrt(3)!)

mfg
Pieter

von Matthias L. (Gast)


Lesenswert?

>>Bei drei Ebenen ist es entsprechend mehr Zeit zwischen den Schritten.
>>warum??
>>und welchen Faktor (sag jetzt nicht sqrt(3)!)

Warum nicht?

;-)

von Karl H. (kbuchegg)


Lesenswert?

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)

von nurabsal (Gast)


Lesenswert?

>mit konstanter Geschwindigkeit fahren

Wie sagte mein alter Physiklehrer immer:

Die kreisförmige Bewegung ist immer eine beschleunigte Bewegung! ;-)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Pieter (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Pieter (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

> 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.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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?

von Bernd (Gast)


Lesenswert?

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

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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

von Pieter (Gast)


Lesenswert?

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

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Pieter (Gast)


Lesenswert?

moin moin,

@Bernd,

keine Fragen mehr?

mfg
Pieter

von Bernd (Gast)


Lesenswert?

Moin Pieter,

die Fragen kommen noch. War am Wochenende nur etwas busy andererseits;-)

Grüße,
Bernd

von Bernd (Gast)


Lesenswert?

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

von Pieter (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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

von Pieter (Gast)


Lesenswert?

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

von friend-of-rq (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.