Hallo Zusammen, ich gerade ganz neu in VHDL Programierung und muss ein VHDL Programm machen, indem dies die impulse A und B von einem Encoder zählt ich habe die Vorwährts schon programiert und jetzt habe ich das Problem, dass ich nicht weiß wie das programm Rückwährt mit die gleichen Conditionen zählt. Code und Ausgabe des Signals sind im Anhang. Danke!
Dafür gibt's hier in der Artikel Sammlung einen prima VHDL Code: https://www.mikrocontroller.net/articles/Drehgeber#Beispielcode_in_VHDL
Der ist aber schwer prellanfällig wie mir scheint(?). Da werden nur Änderungen der Eingangssignale betrachtet, die sich aus alten und neuen Werten ergeben. Diese wiederum werden mit dem Systemtakt eingetaktet, als viel zu schnell. Da muss wenigstens ein Zähler hinein, der das abremst!
Eine sehr pauschale Aussage! Keiner schreibt hier wie hoch der Systemtakt sein muss/soll. Du gehst einfach mal von einigen MHz aus. Das muss aber so nicht sein. Es könnten ja auch 100kHz sein. Die Frage war auch nicht: Wie entprelle ich richtig. Die Frage richtete sich nach dem Up/Down Counting.
FPGA-Experte schrieb im Beitrag #7353666: > Der ist aber schwer prellanfällig wie mir scheint(?). Da werden > nur Änderungen der Eingangssignale betrachtet, die sich aus alten und > neuen Werten ergeben. Diese wiederum werden mit dem Systemtakt > eingetaktet, als viel zu schnell. Da muss wenigstens ein Zähler hinein, > der das abremst! Naja, selbst wenn es prellt, wackelt es höchstens +-1 Schritt herum, aber zählt insgesamt korrekt. Ich halt die Variante für sehr robust, wir setzen die seit Jahren leicht abgewandelt (Dual und Single Abtastung noch dazu) in industriellen Messgeräten ein, System Takt ist so 40 bis 125MHz je nach System, und die Systeme laufen einwandfrei und ohne Schrittfehler an optischen und magnetischen Drehgebern auch bei hohen Frequenzen. Elektrisch sind die natürlich per RS422 angeschlossen. Für eine Menü Steuerung per Alps Bastel Encoder kann es natürlich sein, dass es nicht optimal ist, hab ich nie probiert.
FPGA-Experte schrieb im Beitrag #7353666: > Da muss wenigstens ein Zähler hinein, der das abremst! Im Gegenteil: je schneller die Abtastung, um so zuverlässiger die Erkennung. Natürlich zappelt bei einem schlechten Geber der Zähler auf dem letzten Bit wie blöd, aber je schneller er abgetastet wird, umso mehr entspricht es der (schlechten) Realität.
:
Bearbeitet durch Moderator
Jens W. schrieb: > Keiner schreibt hier wie hoch der Systemtakt sein muss/soll. Du gehst > einfach mal von einigen MHz aus. ... was bei FPGAs aber nicht so ganz ungewöhnlich ist, oder? Wie niedrig muss der Takt denn sein, dass es funktioniert? Und wieso dann überhaupt einen FPGA? Christian R. schrieb: > Naja, selbst wenn es prellt, wackelt es höchstens +-1 Schritt herum, > aber zählt insgesamt korrekt. Na geil. >Ich halt die Variante für sehr robust, Eine neue Definition von "robust" Habe es kurz simuliert: Ja, der Zähler zählt richtig, aber er springt: - 100 MHz Taktfrequenz - 5 ms Nachschwingen - Dreh von 200 ms Bei 10 MHz sieht es kaum besser aus
FPGA-Experte schrieb im Beitrag #7353979: > Habe es kurz simuliert: Ja, der Zähler zählt richtig, aber er springt: Signalnamen wären ganz hilfreich! Das Netz für up_dn, ce und err hinter den registrierten Encodersignalen darf natürlich glitchen. Und der Clock muss f_max erfüllen bzw. setup, hold und delays entsprechend klein sein.
Verstehe jetzt das Bild. Zuerst wird ein prellendes Encodersignal gebastelt und wenn der Clock schnell genug ist, wird das Prellen eins-zu-eins weitergereicht. Um das wegzubekommen, darf man erst einen 2er-Abstand durchreichen. Beispiel einer digitalen Entprellung: 5-6-5-6-6-6-6-6-7-6-7-7-6-7-7-7-7-8-7-8-8-8-8-8... => 5-5-5-5-5-5-5-5-6-6-6-6-6-6-6-6-6-7-7-7-7-7-7-7...
Läuft auch unter dem Begriff Hysterese oder Mitkopplung.
Beitrag #7354221 wurde von einem Moderator gelöscht.
dfIas schrieb: > Das Netz für up_dn, ce und err hinter den registrierten Encodersignalen > darf natürlich glitchen. Eben und das tun sie, bei 100,10 und 1 MHz. Nur wenn der Takt so langsam ist, dass er das Prellen überliest, dann verschwindet der Effekt. Er zählt aber dann falsch, denn er bekommt nur Teile des Prellens mit, was zu dem bekannten springen führt. Lothar M. schrieb: > aber je schneller er abgetastet wird, umso mehr entspricht > es der (schlechten) Realität. Das ist aber die Kontakt-Realität. Was benötigt wird, ist die Dreh-Realität. Man sollte den Code erweitern oder den Nutzer darauf hinweisen. dfIas schrieb: > Zuerst wird ein prellendes Encodersignal > gebastelt und wenn der Clock schnell genug ist, wird das Prellen > eins-zu-eins weitergereicht Erst wird das nichtprellende Signal erzeugt, dann das Prellen addiert unten ist der Zähler, der aufbund abwaerst läuft. dfIas schrieb: > m das wegzubekommen, darf man erst einen 2er-Abstand durchreichen. > Beispiel einer digitalen Entprellung: Was heisst "2-er Abstand"? Eigentlich macht man das ganz anders und baut die Decodierung in die state machine ein, indem eine erkannte Richtung mit implementiert wird.
FPGA-Experte schrieb im Beitrag #7354430: > dfIas schrieb: >> Das Netz für up_dn, ce und err hinter den registrierten Encodersignalen >> darf natürlich glitchen. > Eben und das tun sie, bei 100,10 und 1 MHz. > Nur wenn der Takt so langsam ist, dass er das Prellen überliest, dann > verschwindet der Effekt. Er zählt aber dann falsch, denn er bekommt nur > Teile des Prellens mit, was zu dem bekannten springen führt. Du verwechselst aber den Glitch, der durch Racing Conditions im Schaltnetz entsteht und den man durch eine CLK-Registrierung wegbekommt, mit dem Nutzsignal. Das Netz glitcht, das Nutzsignal prellt! FPGA-Experte schrieb im Beitrag #7354430: > Erst wird das nichtprellende Signal erzeugt, dann das Prellen > addiert > unten ist der Zähler, der aufbund abwaerst läuft. Ja, und das macht er ganz korrekt. Glitch ist in dieser Auflösung nicht erkennbar und/oder wird auch vom Zähler nicht erkannt, nur das konstruierte (sehr langsame im Verhältnis zur Logik) Prellen. Alles ok. Wie man so einen Zähler entprellt, hatte ich beschrieben. Benutze einen bidirektionalen Schleppzeiger, den du bei 2er-Abstand um einen Schritt weiterbewegst. Ein 2er-Abstand bedeutet, dass du erst beim angedeuten Wechsel des alternierenden Encoder-Signals (erste Flanke des prell-Bursts ist hinreichend) sicher bist, um mindestens 90° weitergerückt zu sein (denn du bist bereits bei 180° angekommen). Und natürlich baut man alles in ein einziges Schaltwerk ohne externes Extra. Das ist in diesem verlinkten Beispiel tatsächlich sehr schlecht realisiert, insbesondere, da das Schaltnetz nicht frei von Racing ist. CE kann/wird früher oder später umschalten als UP_DN und muss zwingend auf CLK synchronisiert werden. Eigenständig ohne externe Registrierung ist das Signal-Tripel dort nicht konsistent. (Was ein CE und ein UP_DN zwar nicht müssen, aber wenn man nur den VHDL-Code betrachtet, fällt das sofort ins Auge.)
FPGA-Experte schrieb im Beitrag #7354430: > Erst wird das nichtprellende Signal erzeugt Es ist nicht nötig, die beiden Spuren zu entprellen. Es reicht aus, wenn sie über 2 Flipflops einsynchronisiert und auf die Taktdomäne des Zählers gebracht werden. dfIas schrieb: > Das ist in diesem verlinkten Beispiel tatsächlich sehr schlecht > realisiert, insbesondere, da das Schaltnetz nicht frei von Racing ist. > CE kann/wird früher oder später umschalten als UP_DN und muss zwingend > auf CLK synchronisiert werden. Dort kann es beim Umschalten tatsächlich Glitches geben. Das ist dann nicht schlimm, wenn dahinter im FPGA die weitere Verarbetung taktsynchron ist. Zusätzliche Synchronisationsregister für diese ausgangssignale brächten da nur Ressourcenverbrauch und einen Takt Latency. Viel interessanter wird es, wenn der (hier recht unwahrscheinliche) Fall eintritt, dass die Register a_in bzw. b_in dupliziert werden, denn dann hat man auf einmal zwei unterschiedliche z.B. a_in Signale.
:
Bearbeitet durch Moderator
Lothar M. schrieb: > iel interessanter wird es, wenn der (hier recht unwahrscheinliche) Fall > eintritt, dass die Register a_in bzw. b_in dupliziert werden, denn dann > hat man auf einmal zwei unterschiedliche z.B. a_in Signale. Ganz sicher nicht: Wenn die Schaltung sinnvoll constrained wurde (und dazu gehört das Schützen eines IO-FFs vor dem wegbewegt werden) ist das nur sehr theoretisch der Fall, wenn dieses FF metastabil sein sollte, was es bei modernen FPGAs zu 99,9999% nicht ist. Nur dann würden divergente Informationen weitergetaktet werden und selbst dann hätte man einen theoretischen Verzähler, der sicher unerheblich ist, gegenüber einer manuellen Fehlbedienung des Encoders. Etwas anderes ist es bei eingetakteten Resets. Bei denen würde ich das Argument noch zulassen, dass man noch ein FF dazu setzt. Entscheidend ist jedenfalls, dass das IO-FF genutzt wird. Ansonsten eben zwei FFs mit "don't touch" gegen Anfassen schützen. Lothar M. schrieb: > Zusätzliche Synchronisationsregister für diese > ausgangssignale brächten da nur Ressourcenverbrauch und einen Takt > Latency. Klar, das geht natürlich nicht. 2 LUTs für 2 Signale sprengen den FPGA und einen ganzen Takt Latenz fällt bei 3 Mikrosekunden, in denen Superman den Regler dreht, natürlich sofort auf. :-) Jetzt mal zum Eigentlichen: Wir sprechen doch von etwas anderem: Wir drehen (oder lassen drehen) einen physikalischen Geber nach vorne und der Zählerwert springt hin und her. Kein Mensch braucht das. Ich möchte ein Signal haben, das sagt "zähle eines hoch" und ein zweites "zähle eins runter". Mit einem einfachen diskreten Filter lässt sich das leicht beheben und die Werte ohne großes TamTam direkt interpretieren, sofern nicht schon ein RC-Glied an den Pins montiert wurde. Es braucht natürlich einen alten Wert, um eine Richtung zu erkennen und einen Zähler zu bedienen. Eine solche CASE-FSM hat 4 Eingänge und genau 8 Optionen von 16*15 möglichen Übergängen, die durch Schalten, Prellen, miese Kontakte oder EMV auftreten können. Die anderen sind Error und werden ignoriert. Die Schaltung ist einfach kein gutes Code-Beispiel. Schon auch deshalb, weil sie encoder heißt, aber eigentlich ein Decoder ist. Was es eigentlich bräuchte, wäre ein fertige Decoder-IP, die die Drehbewegung analysiert, die Beschleunigung berechnet, den Zähler entsprechend bedient und auch ausgibt.
Wenn man sich gegen ´Verzählen´ durch Störungen absichern möchte, kann man das Encoder-Signal direkt für die beiden unteren Bits des Zählers übernehmen (Gray => Binary) und sich nur noch um die Überträge kümmern. Man nutzt so quasi die Redundanz in den beiden unteren Stellen aus. In dem verlinkten Beispiel werden ungültige Wechsel mit ERR geflagt. Ich habe dort nicht weitergelesen, wie dieses ERR später ausgewertet wird. Ohne Störeinflüsse wäre ERR ja ein Zeichen dafür, dass die Abtastung mit der Sensorfrequenz nicht mehr standhält. Ansonsten entscheidet die Länge eines Störbursts, ob der Fehler behebbar ist oder nicht. Ähnliche Betrachtungen gibt es bei der Sicherung serieller Codes. Aus dem Stand würde ich sagen, dass +/-1 behebbar ist, ab +/-2 geht die Richtungsinformation verloren, wenn man nicht weitere Redundanz heranzieht. Als weitere Redundanz wäre die Stetigkeit in der Bewegung zu sehen - also mechanische Redundanz, da Massen bzw. Momente nicht Null sind. Man müsste sich dazu mal ansehen, wie digitale Messschieber so arbeiten.
FPGA-Experte schrieb im Beitrag #7354878: > Ganz sicher nicht: Wenn die Schaltung sinnvoll constrained wurde (und > dazu gehört das Schützen eines IO-FFs vor dem wegbewegt werden) ist das > nur sehr theoretisch der Fall, wenn dieses FF metastabil sein sollte, > was es bei modernen FPGAs zu 99,9999% nicht ist. Solange du mit einem asynchronen Signal auf ein einzelnes IO-FF gehst, geht es in der Tat nur noch um Metastabilität. Allerdings hat man sehr häufig auch asynchrone Signale innerhalb eines FPGA (z. B. mehrere Clock Domains für dies und jenes). Bei hohen Fanouts neigen einige Synthese-Tools gerne zur sogenannte Replication. Um hier ebenfalls ein einzelnes FF zur Abtastung zu erzwingen, müssen spezielle Signalattribute für die Synthese in den Code gesetzt werden. (Ich meine, dass man das nicht zu den sonst üblichen Constraints zählt.) Ein Syntax-Beispiel aus einer FIFO-Implementation:
1 | ... |
2 | library synplify; |
3 | use synplify.attributes.all; |
4 | ... |
5 | -- preserve *_oppog from replication |
6 | attribute syn_preserve of wr_oppog : signal is true; |
7 | attribute syn_preserve of rd_oppog : signal is true; |
8 | ... |
dfIas schrieb: > In dem verlinkten Beispiel werden ungültige Wechsel mit ERR geflagt. Nee, wird es interessanterweise nicht, wie die Simuation zeigt. Das Springen und Wackeln ist danach ein gültiger Vorgang. Das err kommt nur am Anfang ein paar mal, wenn die Signale noch gleiche Werte haben. Das kann real eigentlich nur dann passieren, wenn eine Leitung tot geht. dfIas schrieb: > Solange du mit einem asynchronen Signal auf ein einzelnes IO-FF gehst, > geht es in der Tat nur noch um Metastabilität Die Thematik ist mir bestens bekannt und ich hatte auch erklärt, wie es verhindert wird, nämlich mit EINEM FlipFlop in der IO-Zelle, das nicht wegbewegt werden darf. Danach kannst du duplizieren, bis du blau wirst. META als solches ist kein reales Problem, weil in der Praxis nicht vorkommend. Wenn es vorkäme, würde es zu einem Verzählen in 100.000 Jahren führen. Kann man sich sparen. Dass in kritischen Anwendungen trotzdem Angst-FlipFlops gesetzt werden, hatte ich angefügt. dfIas schrieb: > Man müsste sich dazu mal ansehen, wie digitale Messschieber so > arbeiten. Die haben z.B. Schwingungen auf der Welle, die im Bremsbetrieb wegen rutschender Reibung massive Störungen machen, jedenfalls auf eng tolerierten optischen Scheiben.
FPGA-Experte schrieb im Beitrag #7355560: > dfIas schrieb: >> In dem verlinkten Beispiel werden ungültige Wechsel mit ERR geflagt. > Nee, wird es interessanterweise nicht, wie die Simuation zeigt. Das > Springen und Wackeln ist danach ein gültiger Vorgang. Das err kommt nur > am Anfang ein paar mal, wenn die Signale noch gleiche Werte haben. Das > kann real eigentlich nur dann passieren, wenn eine Leitung tot geht. Ach, was schreibst du denn da zusammen?! Ja klar, ist das Prellen eines einzelnen Bits kein Fehler. Ungültig wäre hingegen ein (in Bezug zur Abtastung) gleichzeitiger Wechsel von mehr als einem Bit (Gray-Code!), also hier von 00=>11, 01=>10 usw. Das passiert im störungsfreien System nur, wenn die Abtastfrequenz zu klein für die Bewegung ist. Bei gesteigertem Missverhältnis entsteht Aliasing, bei dem Fehler nur noch quasi statistisch auftreten. Analogie hierzu: Beim Film werden gerne fahrende Autos mit einer Bildfrequenz aufgenommen, bei der sich die Räder scheinbar rückwärts drehen.
dfIas schrieb: > Aus dem Stand würde ich sagen, dass +/-1 behebbar ist, ab +/-2 geht > die Richtungsinformation verloren, Wieso sollte das passieren? Die Richtungsinformation ergibt sich eindeutig aus der Differenz des alten und des neuen Zustands. Es muss lediglich ein stabiles Signal abgewartet werden, bevor eine neue Weitergabe eines Wertes erfolgt.
dfIas schrieb: > Ja klar, ist das Prellen eines einzelnen Bits kein Fehler. Ungültig wäre > hingegen ein (in Bezug zur Abtastung) gleichzeitiger Wechsel von mehr > als einem Bit (Gray-Code!), Das ist das Problem der Interpretation des Wortes "Fehler". Das gesamte Thema ist eigentlich sehr einfach zu behandeln, wenn sich der Entwickler genau vor Augen führt, was an welcher Stelle passieren kann und soll oder wo da der "Fehler" ist und wie man ihn abfängt. Richtig ist, die Zustandswechsel alle genau einmal zu erfassen. Wenn man eine Abtastrate hinbekommt, die es erlaubt, es einzutakten, kann man die Flankenwechsel sehen und zählen und muss hinterher filtern. Geht das nicht, müssen die Zustände mit Nuqist abgetastet werden und die ungültigen Wechsel, die man durch Samplen von Prellvorängen erhält, filtern. Beim Artikel "Entprellen" habe ich dazu einen Tiefpass-Filter empfohlen. In Software ein IIR, in der Hardware ein RC. Dahinter MUSS ein Schmitt-Trigger. Baut man es im FPGA kann man es schlauer machen, wenngleich es mehr Wissen über die Anwendung und die Physik des Encoders braucht, z,B, ein ungefähres Wissen über die Drehgeschwindigkeiten, die Prellzeiten und den Einfluss etwaiger Störungen von Außen, um den trade off der Entscheidungen einzustellen, ab wann eine Änderung eine gewollte oder eine zufällige ist. Thomas U. schrieb: > Es muss lediglich ein stabiles Signal > abgewartet werden, bevor eine neue Weitergabe eines Wertes erfolgt. Im Einfachsten Fall geht das über ein Delay, ja aber dann ist das eben immer drin und die Encodersoftware reagiert verschleppend. Musiker kennen das von ihren MIDI-Keyboards. Sollte man aber nicht so einfach lösen. Wegfiltern muss man die spikes aus elektrischer Sicht und das Prellen aus funktioneller Sicht und zwar mit zwei unabhängigen Filtern mit unterschiedlichen Einstellungen, die sich funktionell überlappen können - z.B. wenn die Störungen lange ausgeprägt sind. Angenommen es gibt keine Störungen auf den Leitungen oder sie wurden weggefiltert, dann wird einfach die erste Information der Bewegung weitergegeben und das weitere Prellen abgewartet. Damit zählt der Zähler für den Kunden immer korrekt und auch sofort. Bei schnellen Bewegungen gibt es auch wenig oder gar kein Prellen mehr, jedenfalls nicht infolge von Rückwärtslaufen (wohl aber wegen schlechter Kontakte an sich) - daher muss eine Kontaktinterpretation drauf und eine Anpassung des Delays bei schnellen Bewegungen. An der Stelle wird dann schon einmal die erste und auch alle folgenden Bewegungen korrekt weitergegeben. Einfach den internen Hin- und Her zählenden Zähler passend weitergeben. Ab dann muss man sich nur noch die Frage stellen, ob der Encoder stabil genug ist, um Schwingungen zu verkraften oder ob er funktionell rauscht, d.h bei einem Stoß weiterdrehen kann und dann braucht es eine Festlegung, ob man das ignorieren will oder bei einem Präzisionsinstrument mitgeben muss. Angenommen, man ignoriert es, braucht es eben 2 oder mehr gültige Bewegungen in dieselbe Richtung. Notwendig ist dies z.B. bei einem Jog-Wheel, das als Bandtransport im Mix fungiert. Der ist mechanisch erschütterbar und hoch aufgelöst, dass immer ein paar Impulse kommen. Ich verwende in meinem MIDI-Controller z.B. einen Maschinen-Encoder mit 1200 Impulsen je Umdrehung. Das sind mehr als 3 Impulse je Grad. Die sind nötig, um DJ-mäßig den Mix zu modulieren. Beim Hin- und Herrotieren wird der maximal 4x in der Sekunde um 1/3 gedreht. Sind pro Dreh 200 Impulse je Leitung mit einer maximalen Dichte von rund 3000/s. Abgetastet mit Audio-Samplefrequenz, damit es genau ist und gefiltert mit 5kHz -sowie einem diskreten Suppressor mit 20kHz. Letzterer nimmt spikes komplett aus der Leitung und der 5kHz-Filter glättet den häufigeren Fall, daß Einstreuungen den Pegel der Leitung ändern und den Schaltpunkt des FPGA-Eingangs verschieben - also Jitter verursachen. Mit der Einstellungen bekommt man auch eine Welle einer Maschine gemessen, die sich mit 5Hz dreht und auf Promille genau geregelt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.