LabVIEWForum.de - Labview FPGA Probleme mit Timing

LabVIEWForum.de

Normale Version: Labview FPGA Probleme mit Timing
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe seit kurzem ein sbRIO9632 und die FPGA/Realtime Programmierung ist fuer mich neu. Ich bin derzeit dabei ein Programm zu schreiben, welches dass zeitmultiplexte einlesen eines AD-Wandlereinganges erlaubt. Dabei soll alle 100msec ein entprechendes Pin gesetz werden und waehrenddessen der AD-Wandler eingelesen werden. Die dabei erhaltenden Samples (Bsp. 256) sollen dann gemittelt werden.
Nun aber zu meinem Problem:
Die Abtastung funktioniert soweit schon recht gut, ich benutze dafuer einen FIFO. Das eigentliche Problem besteht in dem richtigen setzen der Pins. Der FPGA kann die 100ms nicht schaffen, stattdessen schwankt die Frequenz extrem. Ich vermute, dass ich da noch einen grundlegenden Fehler machen und wollte euch im Rat fragen, wie ich das Problem am Besten angehen kann. Ich habe auch bereits eine timed-loop probiert, jedoch passiert damit der gleich Fehler.

Ich benutze Labview 2009SP1 und auf dem sbRIO laeuft NI-RIO 3.4

Vielen Danke fuer eure Ratschlaege ..
Hi,

ich vermute mal, dass es damit zusammenhängt, dass du in der gleichen Schleife die gleichen DIO schreibst und liest und das ohne eine Zuordnung, was zuerst kommen soll und was nicht. Versuch doch mal, das mit einer Sequenz (jaja, normalerweise böse, ich weiß;)zu definieren. Noch sinnvoller ist wahrscheinlich, wenn du die Anzeigeelemente einfach raus schmeißt oder brauchst du die irgendwo? Falls ja - das könnte auch ein Problem sein, wenn das Schreiben in das Control vom Lesen irgendwie behindert wird...

ch
Hallo,

vielen Dank fuer den Tipp. Ich habe die Anzeigeelemente enfernt, jedoch brauchte das keine Besserung. Die Zaehlung innerhalb der Schleife ist nicht richtig. Ich lasse die Variable "count" ausgeben und daran ist gut zu erkennen, dass dort das Problem liegt. Ich habe die while Schleife gegen eine timed loop gewechselt, jedoch ist das Resultat das Gleiche. Erhoehe ich die LED_time auf 40Mio (enspricht dann 1Hz), funktioniert die Schleife wunderbar.
Ausserdem konnte ich feststellen, dass sich das Programm immer nach genau 10514 Iteration aufhaengt. Was mache ich hier grundsaetzlich falsch? Kommt der Fpga mit den parallen Schleifen nicht klar?

Vielen Dank fuer eure Hilfe
Hallo,

wieso nutzt du denn 2 Warte-VIs bei der Erfassung (1. Screenshot)?
Hier genügt doch das VI "Wait" mit der Zeiteinheit "Millisekunden" und dem Wert 100. Dann musst du nicht mit Ticks herumrechnen. Ich weiß z.B. nicht, wie du auf den Wert "15000" kommst.
Oder eben mit Wert "10 ms" für eine 100-Hz-Schleife.

Das Sequenz-Prinzip, das du im FPGA nutzt (1. Sequenz = Pausieren, 2. Sequenz = Messen) ist korrekt. Das empfielt NI auch so.
Daher glaube ich, dass die Schleife oben links nicht richtig ist. Läuft diese nicht im FPGA-Takt mit x MHz? DU hast dort im Kommentar "100 Hz" stehen.

"FIFO.Write" akzeptiert meines Wissens auch ein Array als Eingang. Da du gleiche Datentypen nutzt, würde ich dir das empfehlen. Dann fallen die beiden For-Schleifen weg.

Wenn das FPGA kontinuierlich läuft, kannst du dich bei "Count" irgendwann auf einen Überlauf einstellen. Sollte es diese Variable wirklich mit 4 MHz hoch zählen, dauert das ca. 35 Minuten bis zum Überlauf (wenn ich keinen Denkfehler gemacht habe). Sind das nur 100 Hz, dauert's ne halbe Ewigkeit.Wink
Hallo,

Könnte es vielleicht sein, dass der Counter an der unteren Schleife nicht groß genug ist (wie viel Bit hat der denn?) und das Programm abstürzt wenn dieser "überläuft"? Immerhin zählt der ja laut deiner Beschreibung mit 4MHz hoch.

Du könntest auch noch versuchen die DIO3 und DIO9 in einer separaten While-Loop zu plazieren, um diese dann über lokale Varibalen aus der SCTL zu befüttern. So könntest du zumindest schonmal ausschließen, dass die Ausgänge zu viel Zeit in Anspruch nehmen. (Für parallele Schleifenausführungen ist der FPGA übrigens gut geeignet)

Hoffe es hilft, viele Grüße

Nico
Danke fuer eure Antworten. Ich habe das Problem mittlerweile anders geloest, indem ich einfach Sequenz genommen habe. Diese Sequenz beschreibt im Groben den Ablauf des Programmes. 100% zufrieden bin ich noch nicht, deshalb wird es nicht die letzte Loesung seinSmile
Sollte ihr noch Interesse an der Loesung hab, kann ich sie gerne noch erlaeutern und einen Screenshot hochladen.
Ja, bitte! Eigentlich immer hier, vielleicht will der Rest ja auch aus den Fehlern und Erkenntnissen lernen, die Du gemacht hast...
Hallo,

nochmal zur kurzen Erklaerung des Programmes:
zunaechst wird ein Port1 gesetzt und danach 8 mal auf sechs ADC ports gesampelt. Daraufhin wird der Port abgeschaltet und erneut 8 Messwerte genommen. Sobald das erldigt ist wird Port 2 eingeschaltet und es werden wieder 8 Messwerte augenommen..

Was haltet ihr von der Loesung? Wie haettet ihr das Problem angegangen? Was wuerdet ihr verbessern?
Mir fällt die For-Schleife in der 3. Sequenz immer noch negativ auf.

Wieso nutzt du das Metronom und eine Wartezeit?

Hier reicht eines davon, je nach Anwendung. In deinem Fall ist das Metronom wohl eher ungeeignet, da der erste Durchlauf kürzer sein wird als alle anderen. Verbinde doch "ADC/DACC" mit dem Warten-VI in der Sequenz. Da ist dann auch gleich der genaue Ablauf definiert.
Referenz-URLs