PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auswerteelektronik für Inkrementalgeber



cmorgen
22.03.2006, 16:07
Hallo allerseits,

ich baue mit an einem car-like Roboter. Zur Positionsbestimmung will ich 2 Inkrementalgeber auf der angetriebenen Achse benutzen, einen links und einen rechts vom Differential. So sollte man auch gefahrene Kurven gut nachvollziehen können.
Die ausgewählten Inkrementalgeber liefern wie üblich die Signale A, B, N, ┐A, ┐B, ┐N (TTL-kompatibel).
Üblicherweise macht man die Auswertung ja wohl mit dem μC, aber um den μC nicht nur mit Interrupts zu beschäftigen, denke ich darüber nach, die Auswertung mit externer Elektronik zu realisieren.
Gibt es für diese Anwendung spezielle Auswerteelektronik (wenn ja wo und zu welchem Preis), oder muss ich das aus Einzelkomponenten (D-FF für Richtungserkennung, Zähler usw.) zusammenbasteln?
Ich würde das Ergebnis dann gern über die serielle Schnittstelle des μC einlesen.

Ich warte gespannt auf eure Antworten.
Christiane

Manf
22.03.2006, 20:53
Der Algorithmus dafür ist hier diskutiert.
Manfred

https://www.roboternetz.de/phpBB2/viewtopic.php?t=10007

cmorgen
23.03.2006, 08:19
Vielen Dank!
Hab ich beim Suchen wohl irgendwie übersehen :(

sigo
24.03.2006, 19:15
Man kann den Algorithmus auch in ein GAL 16V8 brennen, inkl. Impulsvervierfachung. Das Gal muss getaktet werden, z.B. mit 1MHZ o.ä. aus dem Controller.

Wenn die Umgebung sehr verseucht ist, kann ein MC14490 die Signale filtern. (wird aber wohl nicht nötig sein).

Gruß sigo

cmorgen
30.03.2006, 09:02
Ich muss das jetzt doch noch mal aufwärmen.

Wie ich aus den Ausgangssignalen des Inkrementalgebers die richtigen Eingangssignale für den Zähler generieren kann, war nicht nur meine Frage. Trotzdem nochmal vielen Dank für eure Hinweise, die haben mir geholfen meine Gedanken ein bisschen zu sortieren...

Meine ursprüngliche Frage war eigentlich so gemeint: Gibt es ICs, die die Signalaufbereitung und den Zähler in sich vereinen?
Aber mittlerweile bin ich zu dem Ergebnis gekommen, dass es sowas wohl nicht gibt, oder?

Ich habe nämlich das Problem, dass mein uC nur 2 Zähler hat. Das würde für 2 Inkrementalgeber ja grad noch funktionieren, aber dann ist auch Schicht im Schacht. Und da diese Zähler ggf. noch für andere Sachen gebraucht werden...
Was ich also nun suche sind normale IC-Zähler. Da Bauelemente nicht so meine Stärke sind und ich schon das Internet durchforstet und einige Datenblätter gelesen habe, traue ich mich doch noch mal was zu fragen:

Ich muss die Zähler ja hinterher trotzdem mit dem uC auswerten. Brauche ich da Zähler mit TTL-Ausgang oder geht auch CMOS? 12 Bit-Zähler mit TTL-Ausgang scheint es nämlich nicht zu geben...

Danke für eure Geduld!
Christiane

sigo
30.03.2006, 09:17
Hallo Christine,
schau die mal den LM629 von National Instruments an.

Das ist ein Co-Prozessor der u.a. folgendes enthält:

* Quadratur-Signal-Eingang (Inkrementalgeber)
* +/- 30 Bit-Zähler
* Rampengenerator für trapezförmige Geschwindikeitsprofile
* Drehzahl- und Lageregelung (314µs Sampletime)
* PWM-Ausgang


Man gibt dem LM629 die Bewegungsdaten (Position, Vmax und die Beschleunigung) und dann den Startschuß...
Der Motor fährt auf die gewünschte Position, und der LM629 meldet das mit einem Flag, welches man auf einen Interrupteingang legen kann.
Einfacher gehts nicht.

Leider kostet das Teil ca. 25 EUR

Für die Wandlung der Invertierten und Nichtinvertierten Signal des Inkrementalgebers, kannst du einen RS-422 Empfängerbaustein vorschalten. Wenn du eine stark störende Umgebung hast, kannst du zusätzlich noch den MC14490 dazwischen schalten (digitales Störfilter).

Gruß sigo

ogni42
30.03.2006, 09:19
Du kannst zum Impulse Zählen den INT0 und INT1 Eingang des AVR nehmen (bei neueren auch jeden anderen beliebigen IO-Pin) und per Interrupt auswerten. Hier zählst Du die Impulse des Zählers. Ein Timer gibt Dir eine Zeitbasis vor, mit der Du dann den Softwarezähler auswertest. Gezählte Impulse/Zeitbasis = Geschwindigkeit.

cmorgen
30.03.2006, 10:37
@sigo: Klingt interessant, zugegeben nicht ganz preiswert, aber anschauen werde ich mir das auf jeden Fall mal.

@ogni42: Über Interrupt zu zählen kommt für mich leider nicht in Frage, auch wenn es nicht kompliziert wäre. Aber bei ca. 350 U/s und min. 100 Pulsen/U ist der arme Controller ja dauernd nur mit Zähl-Interrupts beschäftigt. ;(

ogni42
30.03.2006, 11:05
mann muss ja nicht direkt an der Achse messen. Sofern Du die damit einher gehende Genauigkeit nicht benötigst, kannst Du den Inkrementalgeber ja direkt an den Rädern anschliessen, was immer noch eine Genauigkeit von 3,6°/Impuls ist. Dann sparsst Du Dir immerhin das externe TTL Grab.

cmorgen
30.03.2006, 12:51
* Die Räder machen bei fahren mit Maximalgeschwindigkeit (2m/s) 341U/min.
* Wenn ich nach der Auswerteelektronik 400 Pulse/U bekomme entspricht das 136400 Pulsen/min oder 2273 Pulsen/s (bei nur 100 Pulsen entsprechend nur 1/4).
* Wenn ich davon ausgehe, dass ich gleichzeitig in der Grundversion noch 8 Infrarotsensoren, einen Kompass und einen Beschleunigungssensor auswerten muss und das alles über Interrupts mache, fürchte ich, dass ich irgendwann vor lauter interruptgesteuertem Pulszählen nicht mehr rechtzeitig mitbekomme, wenn ich vor die Wand fahre. Schließlich kann mein uC keine Parallelverarbeitung. Aber vielleicht habe ich da ja auch unbegründete Sorge...

ogni42
30.03.2006, 13:54
Also wenn Du die Inkrementalgeber direkt mit den Rädern koppelst hast Du 3341 U/min à 100 Impulse/Umdrehung macht 568,3 Impulse/Sekunde. Das geht ganz locker mit dem INT0. Die Interruptroutine ist ja sehr kurz: Variable um eins erhöhen. Dauert in Assembler maximal 10 Takte Laden, inkrementieren und speichern. Bei 20MHz Takt wären das z.B. 500 ns. Da bleibt also noch viel Luft. Wichtig ist, dass alle ISRs insgesamt so kurz sind, dass die Zeit für zwei aufeinander folgende Inkremente nicht überschritten wird, in Deinem Fall also: 1.76ms.

Bedeutet, innerhalb von 1.76 ms müssen alle ISRs abgearbeitet sein, damit Dir keine Inkremente verloren gehen. Das ist natürlich nur für den schlimmsten Fall angenommen, dass alle ISRs ständig und nacheinander abgearbeitet werden.

sigo
30.03.2006, 16:48
@sigo: Klingt interessant, zugegeben nicht ganz preiswert, aber anschauen werde ich mir das auf jeden Fall mal.

@ogni42: Über Interrupt zu zählen kommt für mich leider nicht in Frage, auch wenn es nicht kompliziert wäre. Aber bei ca. 350 U/s und min. 100 Pulsen/U ist der arme Controller ja dauernd nur mit Zähl-Interrupts beschäftigt. ;(

Der LM629 schafft diese Impulsrate locker. Ich hab mal ca. 150U/s * 500 Impulse / Umdrehung damit sicher betrieben.

Weitere interessante Bausteine:

von HP:
HCTL-1000 (ähnliche Funktion wie LM629)
HCTL-2000 Nur der Quadraturdecoder mit Zähler, entlastet den Prozessor auch schon gewaltig

Du kannst natürlich heutzutage auch die Decodierung mit Zähler in einen programmierbaren Logikbaustein packen. Bei mehreren Achsen gleiche alle in einen Baustein...

Bez. Interrupt:
Man muss ja nicht gleich bei jedem Zählimpuls einen Interrupt auslösen.
Du kannst auch mit einem GAL die Quadratursignale in Takt und Sign umwandeln und dann damit auf einen Zählereingang gehen. Diser löst dann halt nur beim Überlauf eine Interrupt aus, oder wenn das vorgegebene Limit erreicht ist. Und du liest den Zähler halt aus, wenn du den Zählerstand brauchst... Das nimmt dem µC schonmal reichlich Stress.

Da Zähler knapp sind, µC billig, kannst du auch für jede Achse einen Controller nehmen, der nix anderes tut. Beim AVR- z.B. den Timer 1 zum Zählen nehmen und dann halt über SPI kommunizieren..

Das kosten dann nur 2-3 EUR für den COntroller und ggf. ein GAL für die Decodierung.

Vie Erfolg

sigo

cmorgen
31.03.2006, 10:01
Vielen Dank für eure Hilfe. Ich glaub ich hab jetzt ne gute Lösung gefunden:

LS7366 (Quadrature Counter mit SPI-Schnittstelle) von LSI/CSI - sind zwar nicht so leicht zu bekommen, aber über scantec kann man mit etwas Geschick Samples anfordern...

sigo
31.03.2006, 14:50
@cmorgen: prima Teil. Danke für den Hinweis

PasstScho
31.03.2006, 16:31
Hallo,
Ich habe gestern erst etwas gesucht und gefunden um mit nur einem Interrupt und einem oder auch zwei normalen Pins so ein Signal zu bekommen(mein Mega8 hatte keine 2 Ints frei).
http://www.elektrik-trick.de/sminterf.htm
Wer da an CLOCK und DIR einen Zählerbaustein macht, der kann damit sehr einfach, mit überall erhältlichen Teilen so etwas in der Art bauen.

MfG Alex

cmorgen
03.04.2006, 14:10
Hallo Alex,

ne nette Seite hast du da gefunden.
Das Problem ist nur, wenn man an so ne Schaltung nen normalen Zählerbaustein macht, hat man ein paralleles Ausgangssignal entsprechend der Bit-Breite des Zählers. Wenn man das dann an den Controller hängen will, war´s das mit 1-2 Pins...

Gruß Christiane

Geri
21.09.2006, 23:24
Hallo zusammen

Der LS7366 scheint sich sehr gut für Inkrementalgeber zu eignen. Das Datenblatt habe ich mir auch schon angeschaut, bin aber noch nicht so schlau geworden wie man das Teil ansprechen muss/kann. Hat von Euch vielleicht einer Erfahrungen gemacht und würde mir bitte ein kleines Beispielprogrämmchen schicken?

Wäre toll, vielen Dank im Voraus und beste Grüsse
Geri