Hallo Labview Gemeinde,
Ich habe ein DC-Motor mit Inkrementalgeber, welcher zwei um 90° phasenversetzte Rechtecksignale ausgibt. Anhand dieser Rechtecksignale will ich in Labview einen Counter zählen lassen, der je nach Drehrichtung des Motors hoch oder runterzählt.
Mein Problem ist nun, dass die Rechtecksignale in Labview nicht richtig angezeigt werden.
Eigentlich sollten sie so aussehen:
http://zone.ni.com/cms/images/devzone/tu...4dcae9.gif
Bei mir kommt folgendes an:
[
attachment=32752]
Man sieht, dass die Rechtecke sich nicht überschneiden. Außerdem kommt es manchmal vor, dass in einem Kanal zwei Rechteckimpulse hintereinander kommen.
Was mache ich falsch?
Ich verwende ein CRIO 9004 Controller, ein CRIO 9104 8-slot chassis mit FPGA und ein 9401 Digital In/Out Modul.
Die verwendete Labview Version ist 8.5
Angehängt habe ich zwei VIs, fpga_test läuft auf FPGA-Ebene, main_test auf rio Ebene.
Viele Grüße
zwieback
Hallo zwieback,
die Signale sehen ja schön "lupenrein" aus. Der Quadraturencoder ist ja einmal dafür da, dass man sich die Geschwindigkeit errechnen kann und andererseits die Drehrichtung. Ist bei dem Inkrementalgeber noch irgend eine Leitung frei, quasi etwas noch nicht angeschlossen oder falsch? Wie sieht das Signal aus, wenn man in die andere Richtung dreht? Kann es sein, dass die zwei Impulse dann kommen, wenn eine Umdrehung vollständig ist? Benötigst Du die Drehrichtung? Jedenfalls, kannst Du ja schon eine Berechnung starten und schauen, ob dies in etwa hinkommt, denn Impulse bekommst Du ja schon.
Gruß snuz
P.S. Die Umwandlung von Digital/ Werte so im FPGA würde ich anders realisieren.
Die Abtastrate ist zu niedrig. Das theoretische Minimum sind 4 Samples pro Periode - das gilt aber nur für den Fall, daß beide Signale ideal mänderförmig sind, und natürlich bezogen auf die höchste vorkommende Drehzahl. Du solltes den Abtastrate erst mal verdoppeln, dann werden wir weiter sehen. Das scheinbare "Bilderbuchmäßige" der Impulse ist das, was LV im Diagramm aus den wenige Meßpunkten macht und hat mit der realen Impulsform überhaupt nichts zu tun.
Hi
in diesem Fall würde ich die Interrupt Fähigkeit von Hardware nutzen. Selbst ein PC benutzt Interrupts um Deine Mausbewegungen sicher zu registieren.
Gruss
Hallo,
danke für die Antworten.
@snuz: Bei meinem Inkrementalgeber habe ich noch 2 Leitungen mit den invertierten Kanälen A und B und noch einen Indexkanal, der pro Umdrehung des Motors einen Impuls erzeugt. Die Drehrichtung benötige ich. Der Geber liefert eigentlich 1024 Impulse pro Umdrehung. Wenn ich die Motorwelle in die andere Richtung drehe, sieht das Signal immer noch so aus.
Wo kann man denn die Abtastrate einstellen?
Und ist für diese Anwendung (Impulse zählen) noch zusätzliche Hardware erforderlich?
Viele Grüße
zwieback
Hallo zwieback,
wenn Du ein Oszilloskop zur Verfügung hast, schau dir mal die Signale an die aus den anderen beiden Adern "kommen" und finde die beiden Richtigen. Dann zur Programmierung, Lucki hat das ja schon festgestellt, such mal bei NI.com nach Quadcounter, der erledigt für Dich quasi alles, Du musst ihm halt nur die richtigen Signale zur Verfügung stellen (s.B.). Für die Zählung brauchst Du meines wissen keine zusätzliche Hardware - was die Abtastrate... musst Du warten bis hier jemand kommt und es weiß.
Gruß snuz
P.S. Du nutz ja das NI9401 Modul - das kann bis 10MHz, wenn die Frequenz des Impulsgebers höher (>10MHz) wird, wirst Du nicht alle Impulse zählen können, bleibst Du darunter ist es kein Problem.
Abtastrate: 10 Mhz - so schnell das 9401 eben arbeiten kann, dafür muss man den Encoder-Auswerte-Code in einer SCTL laufen lassen, mit einer "normalen" Loop geht das nicht. Im Example-Finder oder auf ni.com gibt's die entsprechenden Beispiele für eine Encoder-Auswertung, die benutzte ich seit Jahren quasi unverändert als Ausgangs-Basis wenn ich einen Encoder einlesen will.
Für eine Geschwindigkeits-Messung interessiert einen ja gar nicht der einzelne Tic des Encoders, sondern nur wieviel Tics innerhalb einer festgelegten Zeiteinheit gezählt wurden. Darum macht das aus meiner Sicht gar keinen Sinn Interrupts zu verwenden. Ich glaube nicht, dass es sinnvoll ist die CPU des Controllers damit auszulasten, dass man bei jedem Encoder-Tic eine neue Drehzal berechnet. Sinnvoll aus meiner Sicht sind Zeitfenster von 100 ms (schon relativ starke Schwankungen der Drehzahl) bis 1 Sek (schon sehr langsame Aktualisierung der Drehzahl) in denen man die aufgelaufenen Tics zählt (im FPGA) und dann durch die Zeit-Basis teilt ...
Das Problem bei den Signalen wird vermutlich sein, dass das 9401 die nicht als TTL-Signale erkennt, weil die Spannungs-Pegel nicht stimmen. Darum wird sich vermutlich auch zwischendrin mal ein "Sprung" ergeben, in der Form, dass mal Pulse fehlen, bzw. auf einer Spur keine Pulse vorhanden sind während die andere Spur in der Zeit 2 Pulse liefert. Da wird vermutlich noch etwas Elektronik von Nöten sein um die Signale auf TTL-Pegel zu wandeln ...
viele Grüße
CB
Hallo
danke für die Hilfe! Mit dem Quadratur Encoder Beispiel hat es nun geklappt. Ich hatte außerdem noch ein Wackelkontakt am Kabel
Viele Grüße
zwieback