LabVIEWForum.de - FPGA 3-Phasen Generator, Phasen-Offset

LabVIEWForum.de

Normale Version: FPGA 3-Phasen Generator, Phasen-Offset
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo!


Ich arbeite mit folgender Hardware:

cRio 9054 Gehäuse

S-Serie 9269 Analogausgangsmodul



Das cRio soll als Signalgenerator arbeiten. Es sollen drei Signale mit einem Phasenversatz von jeweils 120 Grad erzeugt werden.
Das Signal wird für ein belieges Zeitintervall T_ein eingeschaltet und dann für ein weiteres Intervall T_aus ausgeschaltet. Nach jedem Durchlauf wird die Signalfrequenz erhöt f= {1Hz,2Hz,...300Hz,305Hz,...1000Hz,1100Hz...20kHz}. Damit die Signale auch bei höheren Frequenzen eine gute Auflösung haben, sollen sie auf dem FPGA generier und mit 100kHz gesamplet werden. Die Signalparameter werden über ein Host.VI auf dem PC vorgegeben (Amplitude, Phasenoffset, "Frequenziteration") und dem FPGA als Variable übergeben. Die Signale werden über Sine Wave Generator erzeugt und anschließend auf dem FPGA ausgegeben.


Nun zum Problem:

Der Phasenversatz der Signale variiert. Er bleibt nicht konstant bei 120 Grad. Ich vermute, dass das Problem in der parallelen Erzeugung der 3 Signale liegt. Da ich relativ neu in der Programmierung auf dem FPGA bin, kenne ich mich hier leider nicht sehr gut mit Timing-Problemen aus. Mein erster Versuch war, die Generator-Funktionen in separate Schleifen zu packen, um die Parallelität besser auszunutzen. Das hat allerdings nur für die ersten 50 Frequenziterationen funktioniert, dann kam es wieder zu einem ungewollten Versatz.
Gibt es eine Möglichkeit, die Phasenverschiebung auf dem FPGA zu regeln?


Vielen Dank für Eure Hilfe!

[attachment=62006][attachment=62005]
Hallo Hoop,

herzlich willkommen im Forum!

Zitat:Ich vermute, dass das Problem in der parallelen Erzeugung der 3 Signale liegt. Da ich relativ neu in der Programmierung auf dem FPGA bin, kenne ich mich hier leider nicht sehr gut mit Timing-Problemen aus.
Warum erzeugst du die Samples denn in 3 parallelen Schleifen und gibst sie in 3 IO-Nodes aus?

Du kannst doch den Sinus gleich dreimal generieren (und dabei den 120° Offset auch gleich auf dem FPGA addieren).
Und dann einfach alle 3 Werte mit einer IO-Node ausgeben.

Bei max. 100kHz Samplerate hast du doch min. 10µs Zeit pro Iteration, das sollte doch für die 3fache LUT-Abfrage ausreichen…

Zitat:Da ich relativ neu in der Programmierung auf dem FPGA bin
Beim FPGA gilt: das Timing wird schon beim Kompilieren festgelegt, du musst dich eher um den verfügbaren Platz (=Fabric) sorgen…

Edit: Crossposts immer selbst anzeigen!
Hallo Hoop,

ich kann Gerd nur zustimmen, die Erzeugung und Ausgabe deiner drei AO gehört in eine Schleife, nicht in drei parallele.

Dann brauchst du auch nur 1x "Initialize", 1x Loop rate, und die 3 Signalparameter-Cluster gehören verheiratet zu 1 Cluster. Nur so kannst du sicherstellen, dass die 3 Schleifen auf Grund mglw. nur 1 Zyklus lang unterschiedlicher Looprates auseinanderlaufen.

Gruß, Jens
Hallo Gerd, Hallo Jens,

Vielen Dank für die schnelle Rückmeldung!
Ich habe eure Vorschläge heute umsetzen können. Die Cluster habe ich "verheiratet" und die Phasenverschiebungen werden jetzt auf dem FPGA addiert.
Die Signale werden jetzt mit einer konstanten verschiebung ausgegeben. Danke!

Zitat: "Warum erzeugst du die Samples denn in 3 parallelen Schleifen und gibst sie in 3 IO-Nodes aus?"
- In meinem ersten Ansatz hatte ich noch alle drei Signalgeneratoren in einer Schleife (allerdings mit 3 Clustern zur Parameterübergabe). Hier kam es nach jeder Frequenziteration zu einer unbestimmten Phasenverschiebung. Nach der Aufteilung trat die Verschiebung nur noch alle 20-30 Iterationen auf...

(Auf Crossposts achte ich ab jetzt, Danke Angel_not )
Hier noch die funktionierenden VIs.
Hallo hoop,

Tipp zum FPGA-VI: die FXP-Konstante gleich invertieren (20/2^15) und statt der Divisionen gleich multiplizieren. Den Ausgang dann so konfigurieren, dass du an der IO-Node keine CoercionDots bekommst...
Referenz-URLs