Quadraturzähler auf FPGA läuft weg

Ich versuche, Impulse von einem Quadratur-Encoder in einem Altera-FPGA zu zählen. Ich glaube, ich habe meinen Zähler richtig eingerichtet (Schaltplan unten, nach diesem Tutorial ), aber wenn ich meinen Encoder einschalte, beginnt die Zählung einfach ununterbrochen zu steigen. Wenn ich den Encoder in eine Richtung drehe, beschleunigt sich die Zählung, und wenn ich ihn in die andere Richtung drehe, verlangsamt sie sich, so dass es so aussieht, als ob ich tatsächlich Impulse zähle, aber auch nur aufwärts zähle. Weiß jemand woran das liegen könnte?

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Die Signale count clockund count directiongehen in eine eingebaute 32-Bit-Zählerfunktion ( LPM_COUNTER) auf meinem Altera FPGA ein, das mit Quartus II v9.0 programmiert wurde. Die Ausgabe dieses Zählers wird in einem Puffer ( LPM_BUSTRI) gespeichert und mit einem LabVIEW-Programm gelesen, wann immer der LabVIEW-Code dies benötigt. Ich habe einen ähnlichen LabVIEW-Code, der andere Puffer aus dem FPGA liest, der gut funktioniert, daher bin ich mir ziemlich sicher, dass das Problem irgendwo in meinem FPGA liegt.

Ihre Hilfe wird gerne in Anspruch genommen!

EDIT: Korrigierte die angezeigte Taktfrequenz.

Antworten (1)

Stellen Sie sicher, dass das "Clock Count"-Signal nicht als tatsächlicher Takt in den Zähler verwendet wird. Sie möchten es als "Zählfreigabe" verwenden. Der Takt im Zähler sollte derselbe 25,13-MHz-Takt sein, den Sie an anderer Stelle verwendet haben.

Ein weiteres Problem, das es wert ist, im Auge behalten zu werden ... Wenn sich ein Encoder nicht bewegt, kann er manchmal in einer Art Zwischenzustand stecken bleiben. Was Sie sehen werden, ist, dass entweder der A- oder B-Eingang etwas schnell hin und her schalten kann. In einem richtig entworfenen System sollte dies kein Problem sein (Sie werden nur sehen, dass sich die Anzahl schnell zwischen zwei benachbarten Werten ändert). Möglicherweise sehen Sie auch das Äquivalent eines Schalterprellens bei A und B, wenn sich der Wert ändert. Einige Quadratur-Encoder verwenden mechanische Schalter, aber selbst optische Encoder könnten etwas Ähnliches haben.

Aber dieses Design erfordert, dass sich A und B nicht schnell ändern. Die Eingänge müssen für 2 oder 3 Takte auf einem konstanten Wert sein, bevor sie sich ändern dürfen. Wenn diese Anforderung verletzt wird, funktioniert es nicht richtig. Ich habe nicht die Arbeit gemacht, um herauszufinden, wie es sich genau verhalten wird, aber es ist wahrscheinlich, dass es nicht richtig zählt.

Wenn ich Quadraturdecoder gemacht habe, habe ich es immer mehr mit einer Zustandsmaschine gemacht als wie Sie es hier gemacht haben. Ihre ist in Ordnung, vorausgesetzt, Sie erfüllen alle Anforderungen, aber es gibt bessere Möglichkeiten, dies zu tun.

Sie, mein Herr, sind ein Genie! Das scheint geholfen zu haben, obwohl ich immer noch ein Ausreißerverhalten bekomme. Wenn ich jetzt aufhöre, den Encoder zu drehen, stoppt manchmal die Zählung, aber manchmal läuft sie weiter wie zuvor. Irgendeine Idee, warum dies zeitweise der Fall sein sollte?
Es sieht ziemlich sauber aus, wenn ich es messen kann, aber wenn die gesamte Schaltung angeschlossen ist, ist es möglich, dass ich etwas Rauschen auf der Leitung bekomme. Glaubst du, Lärm könnte die Flucht verursachen, die ich sehe? Ich werde versuchen, mein Zielfernrohr wieder dorthin zu bringen und zu sehen, ob eine der Phasen schwankt, wenn sie still sein sollte.
@Engineero Ich habe meiner Antwort einige hinzugefügt.
Danke für das Update. Haben Sie Referenzen, die Sie verlinken könnten, wie Sie es mit einem solchen FPGA besser machen können? Ich habe es zuvor mit einer Zustandsmaschine auf einem National Instruments FPGA gemacht, aber ich konnte nicht herausfinden, wie ich dieses Schema auf meinem Altera-Board zum Laufen bringen könnte. Gibt es auch eine andere Möglichkeit, meine Phasen zu filtern, um diese Art von Flucht mit dem von mir verwendeten Design zu verhindern?
Ich werde nur eine separate Frage für das Problem stellen, das ich immer noch sehe. Es würde mich interessieren, welche besseren Möglichkeiten es gibt, Impulse zu zählen, die möglicherweise weniger anfällig für diesen Runaway-Fehler sind, aber Ihre Antwort hat das unmittelbare Problem gelöst. Danke schön!