LabVIEWForum.de - Pause zwischen zwei Sinc Signalen generieren

LabVIEWForum.de

Normale Version: Pause zwischen zwei Sinc Signalen generieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Hallo,

ich möchte mit meinem Programm mehrere Sinc-Impulse mit jeweils einer Pause dazwischen erzeugen. Diese Pulse der ersten zwei Pulse sollten eine Pause von 2,1 ms dazwischen haben und die weiteren jeweils eine Pause von 5,7 m. Ich bin mir leider nicht sicher, wie ich die Pause am besten erzeugen kann. Zurzeit wird in meinem VI eine Fehlermeldung angezeigt, weil das mit dem Wait VI leider nicht klappt.

Haben jemand einen Vorschlag wie ich das umsetzten kann?

Danke im Voraus!
Hallo Lea,

leider hast du, wie schon im NI-Forum, nur ein LV2021-VI bereitgestellt. (Crossposts bitte immer selbst anzeigen!)
Wenn du mehr Antworten haben willst, solltest du das VI für LV2020 oder älter konvertieren…
Hallo GerdW,

im Anhang findest du mein Vi mit der downconverted Version.

Vielen Dank.
Hallo Lea,

Zitat:ich möchte mit meinem Programm mehrere Sinc-Impulse mit jeweils einer Pause dazwischen erzeugen. Diese Pulse der ersten zwei Pulse sollten eine Pause von 2,1 ms dazwischen haben und die weiteren jeweils eine Pause von 5,7 m. Ich bin mir leider nicht sicher, wie ich die Pause am besten erzeugen kann.
Dein VI hat ein paar Mängel:
- Du definierst eine Samplerate von 150S/s, damit liegt der Abstand zwischen 2 Samples bei 6.67ms. Wie willst du damit definierte Pausen von 2.1ms oder 5.7ms erreichen???
- Du legst einen Samplemodus von "Finite samples" fest, willst aber in der danach folgenden Schleife so lange Samples ausgeben, bis der User irgendwann die Schleife beendet: das passt nicht. Verwende "Continuous samples"…
- Du startest deinen AO-Task, ohne vorher eine Waveform zur Ausgabe definiert zu haben!?
- Du hast da eine Case-Struktur zum Erzeugen der Samples mit 6 Ausgangstunneln: wozu ist das hier nötig? Würde es nicht ausreichen, wenn jeder Case das Samplearray an den selben Tunnel ausgibt???
- Du verwendest in den einzelnen Cases noch diverse Wait-Funktionen, mit Zeiten von 1ms bis 6ms. Du weißt schon, dass das unter Windows nur "Wunschangaben" sind?
- Diese Waits sind außerdem sinnlos, da sie nicht einstellen, wie lang das ausgegebene Signal ist! Dies legst du über die Anzahl der Samples fest!
- Diese "delta T"-Controls legen zwar fest, wie die Sample-Werte berechnet werden - aber nicht, mit welchem dt (bzw. welcher Samplerate) dein DAQmx-Task arbeitet! Den hast du ja deutlich früher mit eben 150S/s definiert!!!
- Wozu musst du das Samplearray in einen DDT-Draht umwandeln, nur um es in einem Graph anzuzeigen???
- Dein Statemachine-Enum sollte IMMER typdefiniert sein - und alle Instanzen dieses Enums dann natürlich von dieser Typdefinition abstammen…
- Diese Statemachine ist hier IMHO unnötig, und damit auch das Enum…

Vorschläge:
- Wenn du Signale erzeugen willst, deren Samples in einem Raster von 0.1ms (=100µs) auseinander liegen, dann solltest du mit einer Samplerate von 10kS/s arbeiten.
- Wenn du einen Pause von 2.1ms haben willst, dann gibst du einfach ein Array von 21 Samples (bei 10kS/s) mit konstanten Werten aus. Bei 5.7ms wären das dann nach Adam Riese genau xxx Samples… (Wirst du sicherlich selbst ausrechnen können!)
- Schau dir die BeispielVIs zum Thema "AO-Task" und "Continuous Samples" an!

Hier mal ein paar Vroschläge für Ideen:
[attachment=62269]
(Ich bezweifele, dass das VI so wie gezeigt fehlerfrei laufen wird…)
Hallo Gerd,
vielen Dank für die Hilfe!
Ich habe mir nochmals die Beispiel VIs angesehen und habe noch ein paar Fragen zu deinen Aussagen:
Zitat:Du startest deinen AO-Task, ohne vorher eine Waveform zur Ausgabe definiert zu haben!?
Wie genau meinst du das? Wo genau soll ich die Waveform vorher definieren?

Für die letzte Sequenz habe ich nun eine For-schleife eingefügt, da die Sequenz jeweils in Abstand von 5,7 ms 17-mal wiederholt werden soll. Leider wird dies gerade nicht angezeigt, weil die Anzeige des Waveform Graphs irgendwie nicht weiterläuft. Woran könnte das liegen?
Ich habe jetzt die Sample Rate auf 10kS/s gesetzt und damit liegt der Abstand zwischen zwei Samples bei 0,1 ms. Leider werden die Sinc Pulse auch nur Rechteck Signale angezeigt. Weißt du woran das liegen könnte?

Den Rest habe ich soweit umgesetzt. Die finite samples war nur ein Versehen. Ich hatte vorher immer continous eingestellt. Big Grin

Vielen Dank noch mal.
Gruß
Lea
Hallo Lea,

Zitat:Für die letzte Sequenz habe ich nun eine For-schleife eingefügt, da die Sequenz jeweils in Abstand von 5,7 ms 17-mal wiederholt werden soll. Leider wird dies gerade nicht angezeigt,
Das ist jetzt eine Frage, die diese Antwort erzwingt: schau dir bitte die LabVIEW-Grundlagenkurse an.
Lerne die Grundlagen von Schleifen und Arrays!

Du hast da zwar eine FOR-Loop, die 17mal iterieren soll, nutzt aber nur die Daten der letzten Iteration. Irgendwie sinnfrei…

Zitat:Ich habe jetzt die Sample Rate auf 10kS/s gesetzt und damit liegt der Abstand zwischen zwei Samples bei 0,1 ms. Leider werden die Sinc Pulse auch nur Rechteck Signale angezeigt. Weißt du woran das liegen könnte?
Ja. Big Grin

Hast du mal versucht, einen vernünftigen Sinc-Pulse eigenständig zu erzeugen? Wenn das klappt, dann kannst du überlegen, wie du das dann in deinem VI umsetzt:
[attachment=62271]

Tipp: arbeite nach Möglichkeit mit Waveform statt mit einfachen Samplearrays. In den Waveforms ist gleich die Timing-Information enthalten - und DAQmx kann damit umgehen!
Hallo Gerd,

ich habe mir schon einen Sinc nachgebaut ohne DAQmx und da hatte es funktioniert.

Zitat:Tipp: arbeite nach Möglichkeit mit Waveform statt mit einfachen Samplearrays. In den Waveforms ist gleich die Timing-Information enthalten - und DAQmx kann damit umgehen!
Das würde ich gerne machen, da es viel einfacher ist dort die Sampling Info anzugeben. Aber leider kann man mit den Bausteinen nicht wirklich einen Sinc erstellen. Ich hatte es mal mit dem Formula Waveform VI versucht und hatte immer eine Fehlermeldung wegen den Klammern bekommen und ich konnte keinen Delay einstellen.
Oder gibt es sonst noch eine Möglichkeit einen Sinc Pulse mit einem Waveform VI darzustellen?

Die For Schleife muss ich mir nochmal angucken. Das war auch noch nicht die Endlösung, da ich zeitgleich noch Trapezsignale Signale (Gradienten) erzeugen muss.
Erstmal geht es mir nur darum das die Sinc Signale vernünftig übertragen werden.

Danke.
Hallo Gerd,

Ich hatte mein VI übrigens noch verändert (neue Version ist angehangen). Die For Schleife habe ich zunächst heraus genommen. Leider wird mein Signal nicht richtig übertragen, wenn ich das delta t so ein stelle wie du es Bild gemacht hast (siehe Bild).

Meine Frage ist nun leider immer noch, wie ich es schaffe Pausen von z.B. 2,1 ms zwischen den beiden Sinc Signalen einzubauen. Gibt es für die Arrays irgendwelche Timing Funktionen um mit dem zweiten Signal zu warten oder wie könnte ich das umsetzen?

Danke im Voraus.
Lea
Hallo Lea,

Zitat:Leider wird mein Signal nicht richtig übertragen, wenn ich das delta t so ein stelle wie du es Bild gemacht hast (siehe Bild).
Was bedeutet "nicht richtig übertragen"?

Zitat:Meine Frage ist nun leider immer noch, wie ich es schaffe Pausen von z.B. 2,1 ms zwischen den beiden Sinc Signalen einzubauen.
Ist doch ganz einfach: bei 10kS/s entsprechen diese 2.1ms eben 21 Samples!
Du musst also zwischen deinen beiden Sinc-Pulsen genau 21 Samples einfügen, um eine "Pause" zwischen den Pulsen zu erstellen…

Zu deinem VI:
"delta t" steht bei dir auf "0.1" - das ist aber was ganz anderes als 0.1ms! Momentan erstellst du Signale, die um den Faktor 1000 "zu langsam" sind…
DAQmxWrite hat einen von dir unbenutzten Input! Wenn du den sinnvoll benutzen würdest, bräuchtest du kein DAQmxStart mehr… (Rtmfx)

Zitat:Das würde ich gerne machen, da es viel einfacher ist dort die Sampling Info anzugeben. Aber leider kann man mit den Bausteinen nicht wirklich einen Sinc erstellen. Ich hatte es mal mit dem Formula Waveform VI versucht und hatte immer eine Fehlermeldung wegen den Klammern bekommen und ich konnte keinen Delay einstellen.
Das mit den Klammern war im NI-Forum…

[quote]Oder gibt es sonst noch eine Möglichkeit einen Sinc Pulse mit einem Waveform VI darzustellen?[/quote
Du erstellst ein Sample-Array (wie du es momentan schon machst) und packst dieses Array in eine Waveform (mittels BuildWaveform)…

Nicht jede "grundlegende" Signal-Funktion gibt es auch schon fertig in der Waveform-Generation-Palette. Aber als Programmierer kann man ja selbst mal ein subVI erstellen, oder!?

Vorschlag:
[attachment=62277]
Tipp: (ausführliche) Hilfe zur Sinc-Funktion durchlesen und den Absatz zu "delta t" beachten…
Vielen Dank für deine Hilfe!

Ich habe jetzt das Samplearray in eine Waveform umgewandelt und die Samples angepasst.
Wie ich bereits ja schon erwähnt habe, möchte ich das zweite Sinc Signal 17 mal wiederholen. (Siehe Abbildung) Also 17 Iterationen mit denselben Werten (Sinc Pulsen) mit jeweils einer Pausenzeit von 5,7 ms (= 57 Samples bei 10kS/s). Ich hatte ja oben im Beispiel die For-Schleife dafür verwendet. Leider verstehe ich auch nach durchlesen der Handbücher von LabVIEW nicht, warum die For-Schleife das Signal nicht 17 mal wiederholt, sondern nur 1 mal. Hat das etwas mit dem Array zu tun? Oder muss ich doch eine andere Schleife verwenden?

Zitat:"delta t" steht bei dir auf "0.1" - das ist aber was ganz anderes als 0.1ms! Momentan erstellst du Signale, die um den Faktor 1000 "zu langsam" sind…
Ich habe mir nochmal die Info zu delta t angeguckt. Also delta t ist ja nur ein Sample-Intervall, je größer delta t ist, desto schmaler wird die Main lobe meines Sinc Signals. Und wenn ich das so wie du in dem Beispiel oben mache und eine Kehrwertfunktion für das delta t verwende und 1/Samplerate teile, dann würde ich bei delta t immer den Kehrwert der Sample Rate einstellen. Also bei 10 kS/s sind das dann 0,0001. Sind das dann 0,1 ms?

Zitat:DAQmxWrite hat einen von dir unbenutzten Input! Wenn du den sinnvoll benutzen würdest, bräuchtest du kein DAQmxStart mehr… (Rtmfx)
Du meinst bestimmt „auto start“ oder?

Zitat:Nicht jede "grundlegende" Signal-Funktion gibt es auch schon fertig in der Waveform-Generation-Palette. Aber als Programmierer kann man ja selbst mal ein subVI erstellen, oder!?
Da hast du Recht! Ich wollte meine Signale jetzt auch als SubVI erstellen.

Vielen Dank im Voraus.
Seiten: 1 2 3
Referenz-URLs