Forum: Digitale Signalverarbeitung / DSP Quadratursignal erzeugen aus zwei Rampensignalen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Signalverarbeitung (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Signalverarbeitung (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Signalverarbeitung (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Signalverarbeitung (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Signalverarbeitung (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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....

von Helmut (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von M. W. (elektrowagi78) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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?

von Signalverarbeitung (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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 Helmut (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Signalverarbeitung (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@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.

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Signalverarbeitung (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.