Hallo zusammen, ich suche nach einer schönen/einfachen/eleganten Lösung für folgendes Problem: Ich habe zwei digitale Dreieckssignale mit 45° Phasenversatz. Amplitude der Signale beträgt 100 digits. Aus diesen soll nun ein übliches Quadratursignal entstehen, wobei eine Periode der Dreiecke mindestens 100 Quadratur-Schritte erzeugen soll. Vorwärts/Rückwärts soll natürlich auch gezählt werden. Ich habe schon mehrere Varianten probiert und mit keiner bin ich so richtig glücklich geworden. Meist hängt es an den Übergängen wo man zwischen den Signalen umschaltet. Aber evtl. fällt hier ja jemandem noch die Idee ein. Implementiert ist das ganze auf einem FPGA. Die Dreieckssignale entstehen aus drei Phasenverschobenen Rechtecken durch ein XOR. Falls ich was vergessen habe, einfach Fragen. Wenn man länger an einer Sache sitzt, ist es manchmal schwer bis dahin unbeteiligte direkt mitzunehmen und alle Randbedingungen zu erwähnen. Bin gespannt auf eure Ideen! Viele Grüße, Fabian
Deine Dreiecksignale sind offenbar Stufensignale. Wenn die 100 Digits aka 100 Stufen bei dem einen Signal nicht um 45 Grad aka 1/2 digit phasenverschobene Flanken zum anderen sind, wird das mit der Umsetzung in ein 100 Positions Quadratursignal nichts, höchstens 50. Wenn es phasenverschoben ist, müssten sogar 200 drin sein.
Hm, bei uns nennen alle die Signalform Dreieckssignal, aber egal. Ich hab zur Verdeutlichung mal ein Bild angehängt. Blau und Orange sind relevant. In der Mitte etwa der Richtungswechsel. Die Amplitude lässt sich durch Aufsummieren über mehrere Perioden der ursprünglichen Rechtecksignale auch noch erhöhen, das ist nicht das Problem. Es geht primär um die Wandlung in einen Zähler oder eben direkt die Quadratursignale. Aus einem kontinuierlichen Zähler könnte ich mir die Quadraturflanken ja leicht erzeugen. Viele Grüße, Fabian
Du hast also ein auf +/-2 verrauschtes 100er Signal. Sei froh, wenn du hinterher 25 Positionen pro Umdrehung auswerten kannst. Vergiss 100, dein Signal ist nichtmal um 1/2 phasenverschoben.
Hallo MaWin, Kann es sein, dass wir immernoch aneinander vorbeireden? Ich hätte gerne bei jeder Änderung von dem blauen Signal um ein digit eine Flanke am Quadratursignal. Für die Bestimmung der Zählrichtung (hierfür ist das orangene Signal gedacht) ist es doch egal ob das Signal 90° oder 45° versetzt ist. Die nachher resultierenden Quadratursignale müssen natürlich 90° versetzt sein.
Signalverarbeitung schrieb: > Ich hätte gerne bei jeder Änderung von dem blauen Signal um ein digit > eine Flanke am Quadratursignal. Was ist, wenn das blaue Signal um 2 oder mehr Digits springt? Dann müssten ja innerhalb eines Abtastzyklus gleich mehrere Flanken des Quadratursignals erzeugt werden.
Der Messschrieb is das Ergebnis einer langsamen UART Übertragung, es fehlen somit viele Werte. Im fpga läuft die Abtastung und Verrechnung mit 200MHz. Die ursprünglichen Rechtecksignale haben 4MHz, und die finale Ausgaberate des Quadratursignals liegt bei 250kHz. Sprünge von mehr als einem Schritt, müssen natürlich verarbeitet werden.
Die Sache mit den Mehrfach-Schritten hatte ich bisher so gelöst, dass ich aus dem blauen und orangenen Signal einen Zähler kreiert habe, und das Quadratur-Ausgabemodul diesen mit 250kHz in Einzelschritten verarbeitet. Hauptproblem is eher die Generierung des Zählers....
Falls ich das Problem richtig verstanden habe, scheint mir die Lösung einfach. Du legst einfach eine Schwelle auf den Wert 25 und machst mit der Schwelle aus jedem Signal ein binäres Rechtecksignal. Die beiden Rechtecksignale sind dann wie gewohnt als Quadratursignal auszuwerten.
Helmut schrieb: > Du legst einfach eine Schwelle auf den Wert 25 und machst mit der > Schwelle aus jedem Signal ein binäres Rechtecksignal. Die beiden > Rechtecksignale sind dann wie gewohnt als Quadratursignal auszuwerten. Das ist die beste Möglichkeit, das zufällige Rauschen auch wirklich maximal ins Spiel kommen zu lassen. Signalverarbeitung schrieb: > Implementiert ist das ganze auf einem FPGA. Die Dreieckssignale > entstehen aus drei Phasenverschobenen Rechtecken durch ein XOR. Kannst du das mal zeichnen, bitte?
Hallo Zusammen, also ich probiers mal nochmal ausführlicher: Es geht um den Bau eines Sensors der als Ausgabe ein Quadratursignal liefert. Hierzu liefert der Aufbau drei Rechtecksignale Ref, Sig1 und Sig2 mit je 4MHz. Sig1 und Sig2 haben einen festen Phasenversatz von 90° zueinander und ändern ihre Phase gleichförmig zum Signal Ref je nach Position des Sensors. Bei Position 0 ist die Phasenverschiebung von Ref und Sig1 "0", bei Position 50 ist die Phasenverschiebung von Reg und Sig1 180°, bei Position 100 ist die Phasenverschiebung von Ref und Sig1 360°/0° und bei Position 150 ist die Phasenverschiebung wieder 180°.... Habe mal drei Oszibilder erzeugt (Türkis entspricht dem Signal Ref, Gelb entspricht Sig1 und Lila entspricht Sig2). Nun werden die Rohsignale im FPGA digitalisiert durch eine PLL gefiltert/geglättet und anschließend folgende Signale gebildet: Sig3 = Ref XOR Sig1 und Sig4 = Ref XOR Sig2. Durch die Abtastung mit 200MHz ergeben sich pro Phase maximal 50 Zählwerte, wenn man nicht über mehrere Phasen aufsummiert. Sig3 und Sig4 entsprechen dem blauen und orangenen Signal aus dem obigen Messplot. Dass es hier nur 45° Phasenversatz zwischen dem blauen und orangenen Signalen waren, liegt momentan an der Einstellung der PLL, sollte aber eigentlich keinen Unterschied machen. Hoffe es war nun verständlicher, sonst bitte weiterfragen*g* Gruß Fabian
von M. W. (elektrowagi78) Benutzerseite 05.02.2020 15:40 >Das ist die beste Möglichkeit, das zufällige Rauschen auch wirklich >maximal ins Spiel kommen zu lassen. Dann mache halt zwei Hysteresschwellen bei 20 und 25 und gut ist.
@Helmut ich glaube du hast mein Ziel noch nicht ganz verstanden. Ich will nicht direkt aus dem blauen und orangen Dreieckssignal das Quadratursignal machen. Jeder Zählwert des blauen Signals entspricht quasi einer Flanke im Quadratursignal das ich generieren möchte.
Signalverarbeitung schrieb: > Jeder Zählwert des blauen Signals entspricht quasi einer Flanke im > Quadratursignal das ich generieren möchte. Na toll. Wenn du das wenigstens schon erkannt hast, dann solltest du dich als erstes Fragen: Wozu, zum Teufel, brauch' ich eigentlich das "orange Signal"... Die korrekte Antwort darauf ist: zu garnix. Das ist über, unsinnig, nutzlos. Unter der Voraussetzung, dass garantiert ist, dass das "blaue Signal" jeden "Zählwert" auch tatsächlich durchläuft, brauchst du nur genau die untersten zwei Bits dieses Signals, um ein korrekt "quadraturencodiertes" Signal daraus zu erzeugen. Oder anders ausgedrückt: die ganze Zählermimik ist zu 6 Bits ebenfalls vollkommen nutzlos, da du ja nur genau zwei davon brauchst... Sprich: Ein lächerlicher Witz. Wenn man verstanden hat, was man da eigentlich tut... Komplizierter wird es allerdings, wenn es keine Garantie gibt, dass der Zähler des "blauen Signals" wirklich jeden Zählschritt durchläuft. Dann (und nur dann) ist es kein Witz mehr, sondern erfordert wirklich etwas Gehirnschmalz.
Hallo c-hater, wenn ich mal die (mehr oder weniger gerechtfertigten) spitzen Kommentare ignoriere bleibt folgendes: Es gilt leider die Variante welche mehr Hirnschmalz erfordert. Es kann durchaus passieren, dass mal zwei Werte übersprungen werden. Aus den unteren zwei bits die qdec_A und qdec_B Signale generieren schaffe ich gerade so... is ein 12-Zeiler in VHDL... Wichtig wäre, wie schon gesagt, aus den verrauschten Rohsignalen den durchlaufenden Zähler zu erhalten, aus dem ich dann die Quadratursignale erzeuge. Und nach Möglichkeit ohne 100 If-Abfragen sondern "schön". Zudem will ich ja nicht, dass das Quadratursignal bei zwei Perioden des blauen Signals folgendes macht: hochzählen bis 100, runterzählen bis 0, hochzählen bis 100, runterzählen bis 0, ... Er soll folgendes machen: hochzählen bis 100, weiterzählen bis 200, weiterzählen bis 300, weiterzählen bis 400, ... Ich glaube noch nicht, dass ich auf das orangene Signal verzichten kann, lasse mich aber gerne eines besseren belehren. Gruß Fabian
Signalverarbeitung schrieb: > Es gilt leider die Variante welche mehr Hirnschmalz erfordert. Es kann > durchaus passieren, dass mal zwei Werte übersprungen werden. Dann hast du dein Problem schlicht falsch dargestellt. Es ist dann eben kein ZÄHLER. > Aus den > unteren zwei bits die qdec_A und qdec_B Signale generieren schaffe ich > gerade so... is ein 12-Zeiler in VHDL... 12 Zeilen, tatsächlich?! > Wichtig wäre, wie schon gesagt, aus den verrauschten Rohsignalen den > durchlaufenden Zähler zu erhalten, aus dem ich dann die Quadratursignale > erzeuge. Und nach Möglichkeit ohne 100 If-Abfragen sondern "schön". Wieviele "if" du brauchst, hängt schlicht davon ab, welche maximale Sprungweite dieses Nicht-Zählers du garantieren kannst. Das ist doch klar. > Zudem will ich ja nicht, dass das Quadratursignal bei zwei Perioden > des blauen Signals folgendes macht: > hochzählen bis 100, runterzählen bis 0, hochzählen bis 100, runterzählen > bis 0, ... > Er soll folgendes machen: > hochzählen bis 100, weiterzählen bis 200, weiterzählen bis 300, > weiterzählen bis 400, ... Du brauchst schlicht wirklich einen echten Zähler mit eigener Taktdomain. Das Problem ist: der muss schnell schneller sein als dein Pseudozähler. Wieviel schneller, sagt dir die o.g. (von dir selbst zu treffende) Spezifikation der maximalen Sprungweite seines Pseudo-Zählers und Shannon/Nyquist.
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.