Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Zunächst was aufgebaut ist:
Eine lichtdichte Box in der ein Photomultiplier und eine LED liegen. Das Photomultipliersignal
geht in einen vorprogrammierten FPGA (100MHz) mit vielen fertigen VIs (Input/Output, USB Ansteuuerung, Zähler, Discriminator, usw.).
NimBox von WIENER (falls das jemandem was sagt)
Mit den fertigen VI habe ich einen Zähler erstellt, der einfach die Signale oberhalb einer Spannungsschwelle zählt. - siehe Anhang
Lese ich den Zähler VI in einer Schleife aus, fängt er in scheinbar unregelmäßigen Abständen von vorne an. Auch bin ich mir nicht
sicher wie ich eine Auslese erstelle um eine Counts/Sek. anzuzeigen. Schon allerhand rumprobiert, die erwarteten 1500Hz (vom externen Oszilloskop)
erhalte ich jedoch nicht.
Grundsätzliche Unklarheit besteht bei mir über folgendes:
Nach was richtet sich die Wiederholrate des While Loops?
Ob Zählrate oder sonstiges: Wie kann ich sicherstellen, dass die Auslese synchron/zeitnah mit dem FPGA erfolgt?
War mir jetzt nicht ganz sicher, ob ich damit ins FPGA-Forum hätte müssen.
ich hab das Thema mal in den FPGA-Bereich verschoben
Zeitnahes Auslesen bzw. Synchrone Datenübertragung erreichst du in dem Du die Daten vom FPGA zum Host mit einem DMA-FIFO überträgst und zur Synchronisierung einen Interrupt verwendest. Vermutlich wirst du dabei aber auf die fertigen VIs verzichten müssen ...
Die Schleifen-Durchlaufzeit in dem Screenshot richtet sich nach dem VI das da drin steckt, sonst wird die Schleife durch nichts getaktet. Da ich nicht weiß was in diesem VI drinsteckt kann man auch nicht sagen, wie lang das VI braucht ... im schlimmsten Fall handelt es sich um eine ungebremste While-Schleife die so schnell abläuft wie die CPU diesen Code abarbeiten kann.
Der Zähler fängt scheinbar immer wieder von vorne an, weil die dahinter liegende Variable "überläuft". Wenn die Variable z.B. den Datentyp U32 hat, dann ist ihr Werte-Bereich von 0 bis 4294967295. Wenn man nun auf 4294967295 eins dazuaddiert, dann läuft die Variable über und der Wert ist wieder 0 ...
so schwer scheint das doch nicht zu sein... Du hast nen FPGA, der gewisse Sachen kann und nach irgendeiner Vorschrift und mit irgendwelchen Funktionsblöcken funktioniert, die eigentlich der Hersteller dokumentieren sollte. Tendentiell müsste das ganze was mit Abtastraten der Eingänge, Zählerbreiten etc. zu tun haben. Dazu hast Du uns irgendwie noch keine Infos geliefert, daher müsste ich hier spekulieren.
Auf der anderen Seite hast Du LabVIEW, dass wohl per USB mit dem FPGA kommuniziert. In dieser Kommunikation sind ein paar Dinge festgelegt, wie z.B. das Auslesen und Konfigurieren eines Counters. Das ist sogar als VI ausgeführt und damit scheinst Du also ein bisschen arbeiten zu können. Das Problem dass du hast, ist dass das Countersignal eindimensional ist, Dir also keine Zeitinformationen mitliefert. Die musst Du dir irgendwie generieren. Eine Möglichkeit wäre, den Counter in einem festen Abstand auszulesen. Wie kurz oder lang der sein muss, hängt damit zusammen, wofür die Angabe gebraucht wird. Wenn Du nur was ablesen willst, langen ca. 2-5 Hz, mehr kann das Auge eh nicht auflösen. Tendentiell sogar noch langsamer. Ablauf wäre dann
1. Counter auslesen
2. Zeit warten
3. Counter wieder auslesen
4. Ergebnisse von 3. minus 1. und durch 2. Teilen (ergibt momentanen Wert in Pulsen pro Zeit), 3. irgendwo unter 1. zwischenspeichern und mit 2 weiter.
In LabVIEW ist das Schlüsselwort dazu Schieberegister. Außerdem wäre es sinnvoll, den Counter irgendwann rückzusetzen, damit da nix mit dem Überlauf schief geht (könnte auch jedes Mal passieren, das wäre die sicherste Variante) oder man weiß, wie breit der Counter ist und kann dann entsprechend programmtechnisch arbeiten.
Wenn Du noch mehr so Sachen machen willst, solltest Du dir ggf. überlegen, ob Du aus diesen Viel-Funktion-VIS nicht mehrere Machst und z.B. die USB-Referenz geöffenet lässt, das könnte geschwindigkeitstechnisch ggf. problematisch werden - keine ahnung, wie schnell Du am Ende mit allem sein mussst...
ch
PS Bist Du Sicher, dass die Counter-VIs ohne USB-Referenz überhaupt funktionieren? Wüsste nicht, wie das VI sonst den FPGA ansprechen könnte...
zum USB: Die Referenz wird am Anfang mit dem open.vi festgelegt und ist global, so lange nicht ein weiteres Gerät im selben VI
über USB angesprochen wird.
Meine derzeitige Lösung:
Counter auf 0
1sec Warten
Counter auslesen
Counter auf 0.
Nachwievor habe ich folgendes Problem, wenn ich unterschiedliche Wartezeiten verwende und über längere Zeit mittle:
Bei 1sec Warten => ca. 1000 counts/s
Bei 100ms Warten => ca. 150 counts/s (müsste je bei ca. 100 liegen)
Tatsächlich ist der zweite Wert realistischer, trotzdem kann ich mir den Unterschied nicht erklären.
Es würde mir helfen, wenn jemand auf das Bild schauen könnte und mir
sagt, ob dass so von LabVIEW aus gesehen überhaupt vernünftig funktionieren kann
oder schon prinzipiell unglücklich programmiert ist.