www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Koordinatentisch


Autor: spider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, Schrittfrequenzen im Verhältnis 4:3 verwenden ...

Autor: Waldemar_P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle antwort, diesen Algorithmus werde ich mir
anschaun.

mfg

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Waldemar_P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_...
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

Autor: Andi K. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Waldemar_P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.