Forum: Mikrocontroller und Digitale Elektronik einfache Berechnung


von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Michael L. schrieb:

> t nun bei der Kreis Interpolation.

Such nach "Bresenham".
Da gibt es auch eine Variante davon für Kreise.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael L. (nightflyer88)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
von robin (Gast)


Lesenswert?

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.

von Reinhard Kern (Gast)


Lesenswert?

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

von Michael L. (nightflyer88)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von robin (Gast)


Lesenswert?

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?

von Michael L. (nightflyer88)


Lesenswert?

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