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.