Hi!
Ich möchte mit LabVIEW (2016) und einem NI USB-6343 Gerät eine mechanische Schwingung auslesen und gleichzeitig erzwingen.
Genauer möchte ich folgendes umsetzen:
- Ich möchte eine Sinusspannung einer bestimmter Frequenz(en) ausgeben, um die Resonanzmoden meines mechanischen Oszillators zu ermitteln. Die Details zum Aufbau sind denk ich nicht relevant für mein Problem.
- Neben der angelegten Sinusspannung möchte ich einen Dämpfungsterm realisieren, der von µ*dx/dt abhängt, wobei µ eine Dämpfungskonstante ist, und x der gemessenen Amplitude bzw. Auslenkung meines Oszillators entspricht. Dieser Term soll also auf den Sinus draufaddiert werden (Vorzeichen der Dämpfung beliebig). Die Resonanzfrequenzen sollen also in Abhängigkeit der Dämpfung ermittelt werden.
- Das Produkt der Ableitung und der Dämpfung soll dann als Spannung ausgegeben werden.
Ich habe nun Probleme bei der Umsetzung. Der Code besteht natürlich aus einem While Loop, in dem die Datenverarbeitung stattfindet. Meine Fragen wären die folgenden, und sie beziehen sich auf zwei verschiedene Ansätze:
- Ansatz 1: Ich messe nur 1 Messwert pro Iteration und berechne meine Ableitung "manuell", indem ich A[i]-A[i-1] rechne. Mache ich das so, vergeht allerdings zu viel Zeit zwischen dem Lesen von Sample 1 und Sample 2, denn bevor ich Sample 2 messe, kommt die oben genannte Berechnung der Ableitung etc. – Hinzu kommt, dass ich die vorherigen Messdaten alle mitschleppen muss, um auch visuell was ausgeben zu können. Ich möchte den berechneten Wert ja dann als "Dämpfung" in meinen Oszillator "füttern" und ihn bremsen/beschleunigen. Bis ich die passende Spannung zu Messwert 1 ausgebe, ist mein Oszillator längst Phasenverschoben, und die Spannung, die ich ausgeben würde, ist "veraltet". Im Prinzip legt also die Geschwindigkeit meiner While-Schleife meine Abtastrate fest. Das scheint mir bei so einer Applikation einfach zu langsam zu sein. Was ich bisher gemessen habe, liegt die Dauer einer Iteration bei 0,00015–0,0015. Ich habe also hier auch keine konstante zeitliche Differenz zwischen meinen Samples. Ist die Idee, pro Schleifendurchgang einen Messwert zu ermitteln, damit durchgefallen? Oder gibt's da Möglichkeiten, das alles zu beschleunigen? Das Plotten meiner Daten beispielsweise geschieht außerhalb des Loops. An anderen Stellen weiß ich nicht, wie ich deutlich schneller werden könnte.
- Ansatz 2: Ich messe pro Iteration N Samples als Waveform. Ich hätte dann beispielsweise "schnell" N samples gemessen, und dt sollte konstant sein. (Meine Hardware hat laut Spezifikationen eine Samplerate von 500.000 Samples pro Sekunde). Im Code kann ich dann bequem mit den vorhandenen VIs eine Ableitung meiner Waveform ermitteln, mit einer Dämpfungskonstante multiplizieren und ein Sinussignal generieren (gleiche Samplerate und #Samples wie mein "DAQ-mx Read"), das ich dann auf meine Waveform der Ableitungen addiere. Das klingt ja alles sehr schön. Aber da bleibt im Grunde das gleiche Problem wie oben. Ich müsste also auch hier beispielsweise Messwert 2 aufnehmen, Ableitung bilden, berechneten Wert als Spannung ausgeben und DANN erst Messwert 3 aufnehmen. Meine aufgenommenen Samples sollen ja alle meinen Dämpfungsterm "enthalten" bzw meine an den Oszillator angelegte elektrische Kraft widerspiegeln.
- Kriege ich irgendwie diese Phasenverschiebungen in den Griff?
Ich hoffe, dass ihr ein oder zwei Ideen/Vorschläge habt und bedanke mich schonmal dafür und wünsche eine gesunde Zeit