Forum: Mikrocontroller und Digitale Elektronik Koordinatentisch


von spider (Gast)


Lesenswert?

Hallo,
ich habe einen Koordinatentisch an welchem an der X und der Y Seite
jeweils ein Schrittmotor angebracht ist.

Nur meine Frage wenn ich einen punkt anfahren will mus ich den tisch im
X und Y gleichzeitig bewegen um eine gerade linie zu bekommen. Jedoch
wenn ich zb 400 Schriite in die X Richtung und 300 in die Y muss, wie
schaffe ich es, das diese zugleich am ziel sind ?

Danke in vorhinein

mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Na, Schrittfrequenzen im Verhältnis 4:3 verwenden ...

von Waldemar_P (Gast)


Lesenswert?

Wenn Du beliebige Punkte im Koordinatensystem anfahren wilst soltest Du
dir die Bresenham Linien-Algorithmus anschauen der einfachste weg mit
integer aritmetik den Problem zu lösen.
zB:
Procedure Line (x1, y1, x2, y2: integer);
var
  y     : integer;
  xi,mi : integer;
  xf,mf : integer;
begin
  xi := x1;
  xf := -(y2-y1);
  mi :=  (x2-x1) div (y2-y1);
  mf := ((x2-x1) mod (y2-y1))*2;
  for y := y1 to y2 do
    begin
      WritePixel (xi, y,);
      xi := xi + mi;
      xf := xf + mf;
      if xf > 0 then               { ergibt sich ein Übertrag? }
        begin
          xi := xi + 1;
          xf := xf - 2*(y2-y1)
        end
   end
end;

Gruß

Waldemar

von spider (Gast)


Lesenswert?

Danke für die schnelle antwort, diesen Algorithmus werde ich mir
anschaun.

mfg

von Andi K. (Gast)


Lesenswert?

@Waldemar_P: Habe so was in der Art in AVR-ASM gemacht nur mit einem
Übertrag nach unten hin ( <0 ).

In der Zeile
      if xf > 0 then               { ergibt sich ein Übertrag? }
wird ein Übertrag bei Integer ja erst ab 1 erkannt wobei ein Übertrag
von minus auf plus schon bei 0 ist ( >= 0 ).
Oder ist das Absicht?

Besser wäre es doch, man macht daraus 2 Annäherungs-Algorhytmen, je
nach dem, ob die X- oder Y-Achse zwischen den beiden Endpunkten länger
ist, ansonsten hat man bei einer X-Achse, welche länger ist als die
Y-Achse, nur eine Punktierte Linie bzw. fehlen bei dem Schrittmotor in
X-Richtung die nötigen Bewegungen.

MfG
Andi

von Waldemar_P (Gast)


Lesenswert?

Hallo Andi,
es gibt abwandlungen von diesem Algo die mit reinem Integer arbeiten
ohne fost bzw Gleitkommazahlen meistens auch mit guten Beispielen wie
diese hier von UNI-Fulda :

http://www.fh-fulda.de/caelabor/inhalte/java/Java_Examples/Projekt/LineBres.htm
vor allem Starte den Java APP. da wird eine Simulation gestartet die
dir bestimmt weiter Hilft. Ich habe meine CNC auch mit diesem Algo
ausgestatet und funtzt wunderbar.

Gruß

Waldemar

von Andi K. (Gast)


Angehängte Dateien:

Lesenswert?

Schon klar, wie das funtzt.
Ich habe ja selber so was für eine Line-Funktion für ein GLCD in ASM
ausgearbeitet, wusste aber bisher nicht, dass dieser Algorythmus
"Bresenham" genannt wird da ich selbst darauf gekommen bin, die
Abstufungen der Pixel in der kürzeren Achse aus dem Verhältnis von DX
und DY zu ermitteln in dem man die Länge der kürzeren Achse von der
längeren subtrahiert, bei Überlauf erfolgt dann ein weiterer Schritt in
der kürzeren Achse.

Dein Algorythmus stimmt zwar, aber es fehlt die Abhandlung, wenn die
X-Achse (DX) länger ist als die Y-Achse (DX), oder habe ich da was
übersehen?
Was passiert mit Deinem Code-Schnipsel bei dem Aufruf "Line
(0,0,50,25)"?

Im Anhang ein ASM-Beispiel.

MfG
Andi

von Waldemar_P (Gast)


Lesenswert?

Hallo Andi,
Diese Code bedient nur 1/8 des Koordinatensystems, und dient nur dazu
da die Schrittvfolge der Motoren zu berechnen, da die Motoren immer mit
2 Leitungen angesteuert werden Schritt und Richtung muss man vor dem
Berechnung noch durch andere Routinen festlegen in welche Richtung die
Motoren Laufen sollen und die Routine dann ggf. anpassen durch
vertauschen der Koordinaten oder Spiegelung der Bewegung. Da bei der
Routine die Y-Achse immer die Leitachse ist und entweder = oder > der X
Achse sein muss.

Gruß

Waldemar

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.