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!
Ich brauche ganz ganz dringend eure Hilfe. Arbeite an einem Abschlussprojekt für die Schule und habe mit LabVIEW noch nicht allzu viel Erfahrung und stehe außerdem schon sehr unter Zeitdruck.
Ich arbeite an einer Vibrationsprüfung. Es funktioniert bereits dass ich Sinusförmige Schwingungen ausgebe und die Frequenz ändere. Das Programm soll jetzt allerdings so verändert werden, dass die Frequenz nicht mehr einstellbar ist, sondern von selbst durchläuft im Bereich von 5- 200 Hz. Die Sweep Geschwindigkeit sollte eine Oktave pro Minute sein ( in einer Minute Frequenzverdoppelung--> von 5 bis 10 Hz in einer Minute, von 10-20 Hz in der nächsten Minute usw), dadurch ist die Anzahl der Lastwechsel für jede Frequenz gleich.
Allerdings weiß ich nicht so recht wie ich dieses Problem angehen soll. Vielleicht hat jemand von euch damit Erfahrung oder weiß es einfach so.
Im Anhang ist mein Programm (Funktionsgenerator) das ich nun verändern soll.
im Anhang ist eine überarbeitete Version Deines VIs, das einen Frequenzdurchlauf innerhalb von ca. 5 Minuten durchführt und dabei pro Okave 60 Messwerte erfasst.
(Ich habe mir das mal aus Deinem anderen Post zusammengereimt)
Das VI selbst erzeugt nun aus einer Start- und einer Stop-Frequenz zusammen mit einer vorgegebenen Anzahl von Schritten eine Frequenzliste, die beim Durchlaufen der While-Schleife nach und nach abgearbeitet wird.
Nach jedem Aktualisieren der Frequenz wartet die Schleife nun darauf, dass der Timer von LabVIEW auf eine volle Sekunde springt => Synchronisierung auf 1s.
Zur Erzeugung der Frequenztabelle:
Bei bekannter Start- und Stopfrequenz und vorgegebener Anzahl von Schritten berechnet sich die Frequenz des n-ten Frequenzpunktes wie folgt:
f_n = f0 * (N_sqrt(f1/f0))**n (Formel dient auch zur Berechnung von Tonhöhen für Stimmung von Instrumenten)
N_sqrt bedeutet hier die N-te Wurzel, sorry, es ist schon spät
Der Algorithmus kann derzeit nicht automatisch berechnen, wie viele Schritte notwendig sind, dies muss von Hand geschehen. Bin einfach zu müde, um das noch zu implementieren, hier ist wohl etwas Handarbeit angesagt.
Die Start-Frequenz habe ich jetzt mal auf 6,5Hz gesetzt, dann sind es genau 5 Oktaven
Ach ja, schau das VI lieber noch mal genau an (gebrochene Verbindungen zu DAQ-VIs); ich habe die Dummheit begangen, die Arbeiten auf einem Rechner ohne DAQ durchzuführen
Bin erst am Montag im Geschäft, wo ich Zugang zu DAQ habe.
Hoffe, dass dir die Änderungen weiter helfen und viel Erfolg mit der Arbeit.
gruß
lynx
hallo
Also erstens mal Danke! Dein Programm funktioniert schon fast und hat mir echt weitergeholfen, allerdings hätte ich noch ein paar kleine Fragen dazu, hab mich zwar schon den ganzen Tag damit beschäftigt, aber ich komm einfach auf keine Lösung.
Die Frequenz läuft jetzt schon von Start- bis Stopfrequenz durch, allerdings noch nicht mit den richtigen Schritten und somit stimmt die Zeit auch noch nicht.
Also was genau darf ich unter der Schrittanzahl verstehen? Im Grunde soll sie einfach der Anzahl der Sekunden entsprechen, wie lange der Sweep dauert(+1), sehe ich das richtig?
Ja und die Frequenzsprünge stimmen auch noch nicht. Beginne ich zB bei 5 Hz, so ist laut deinem Programm der nächste Wert 5,06 Hz. Er sollte allerdings 5, 0833 Hz sein, da die Sweep Geschwindigkeit für die Oktave von 5-10Hz, 0,08333Hz/s ist. Die Sweep Geschwindigkeit ändert sich mit jeder Oktave und berechnet sich wie folgt:
vs=(f2-f1)/60
Das ergibt für meine Oktaven:
Da bei deinem Programm das nicht so ist, dauert der Durchlauf einer Oktave bei deinem Programm natürlich zur Zeit auch nicht 1 Minute, so wie es sein sollte.
Kann natürlich auch sein dass ich irgendwas falsch verstanden habe und bei deinem Programm nur eine kleine Einstellung ändern müsste. Wie gesagt, als LabVIEW Anfänger ist das nicht so leicht.
Also falls du mit meinen Angaben etwas anfangen kannst, wäre ich sehr dankbar wenn du mir sagen könntest was ich noch ändern muss, damit dies so funktioniert.
Hoffe auf eine Antwort, wäre wirklich ziemlich dringend, da das ganze bis Montag funktionieren sollte!
ok, da habe ich dich wohl am Anfang falsch verstanden; ich bin davon ausgegangen, dass die Frequenzpunkte äqudistant auf der logarithmischen Skala verteilt werden sollten, ähnlich wie es ein analoger Wobbel-Generator auch machen würde. Wenn ich Dich jetzt richtig verstanden habe, wolltest Du aber lineare Abstände zwischen den einzelnen Frequenzpunkten innerhalb der Oktave.
D.H. du erzeugst auch wie gehabt die Frequenzliste; der Algorithmus hierfür ist jetzt aber ein bisschen anders.
Wenn Du alles einstellbar haben willst, würde ich mal sagen, wir nehmen die Start-Frequenz und die Anzahl der Okaven, die durchlaufen werden sollen; die Anzahl der Schritte wird fest auf 60 eingestellt.
Damit ergibt sich folgende Vorschrift für die Erzeugung der Tabelle:
float start_f = 5; //Hz
for (i=1;i<Oktaven;i++) {
float stop_f = start_f *2; //Ende der Oktave berechnen
float delta_f = (stop_f - start_f) / n; //Schrittweite berechnen
for (z=0;z<60;z++) {
float f = z*delta_f + start_f;
}
start_f = stop_f; //Neue Start-Frequenz setzen
}
(Ist in Pseudo-C abgefasst, schneller, als das ganze in Worten zu schreiben)
Mit diesem Algorithmus erzeugst Du dir dann die neue Frequenzliste und schiebst sie auf den DAQ.
Es sind zwei ineinander geschachtelte For-Schleifen, die innere indiziert das Frequenzarray, die äußere nicht!
Hoffe, das hilft dir erst mal weiter, VI folgt.
gruß
lynx
06.01.2007, 17:07 (Dieser Beitrag wurde zuletzt bearbeitet: 06.01.2007 17:09 von lynx.)
So, da bin ich wieder.
Habe jetzt ein modifiziertes VI geschrieben, das die Frequenzpunkte linear innerhalb einer Oktave verteilt.
Habe ich jetzt als Sub-VI ausgeführt, kannst Du über die Werkzeugpalette -> Vi Öffnen auswählen und dann verwenden.
Als Parameter verwendet der Algorithmus die Anzahl der Oktaven, die Start-Frequenz und die Anzahl der Frequenzpunkte pro Oktave (Schritte)
Eine Hilfe ist im VI auch hinterlegt, schau es mal an.
Das VI ersetzt den gesamten Schmu, den ich gestern in Dein VI gebastelt habe => gesamte FOR-Schleife raus und die Frequenzliste dann mit dem Tunnel der While-Schleife verkabeln; die Anzahl der Schritte musst Du dann entweder über Schritte * Oktaven oder über die Grüße des Frequenzarrays berechnen, damit die Whileschleife richtig terminiert.
Viel Erfolg damit.
gruß
Lynx
Hatte das VI vergessen
07.01.2007, 19:46 (Dieser Beitrag wurde zuletzt bearbeitet: 07.01.2007 20:16 von Lucki.)
Wenn ich mich hier mal reinhängen darf:
Ich weiß ja nicht, was Du letztlich eigentlich machen willst, aber falls Dir - und so lese ich Deinen Beitrag - wirklich an einem kontinuirlichem Sweep gelegen ist, anstatt so eines Quasi-Sweeps mit Abarbeitung eine Liste von Frequenzen, dann steht dem überhaupt nichts im Wege.
Im Prinzip läuft das so:
1) Festlegen der Sample-Frequenz: Höchste Frequenz ist 200Hz. Für ein vernünftige Abbildung brauchst Du 8 Punkte/Periode --> fs = 1600Hz, dt=0.615ms
2) 1 Otave/min umrechnen in Frequenzerhöhungs-Faktor pro dt: 2^(1/min*0.615ms)=1.000004369
3) Aktuelle Frequnz = aktuelle Frequenz(vorige Sample) * obiger Faktor
4) Phasendifferenz zur vorigen Sample berechnen = 2Pi*aktuelleFrequenz * dt
5) aktuelle Phase berechnen = vorige Phase + Phasendifferenz
6) Amplitudenwert der Sample = sin(Phase)
Das VI ist angehängt.
Der Haken an der Sache ist: Das Array wird sehr groß, besteht aus 510 000 Samples
Wenn es noch funktioniert (evtl mit single Precision) --> Glück gehabt
Wenn nicht: Die Samples mussen blockweise berechnet werden und blockweise in den Buffer nachgeschopben werden, bei kontinuierlicher Ausgabe. Das geht wunderbar, aber es ist nicht gerade ein Aufgabe für Anfänger.
Damit im Diagramm etwas zu sehen ist, habe ich im Beilspiel die Sweep-Geschwindigkeit von 1 Oktave/min auf 1000 Otave/min erhöht.
Man beachte auch: Bei Abarbeitung ein Frequenzliste kommt es zu Phasen-Diskontinuitäten bei jeder neuen Frequenz. Das System muß jedes Mal neu einschwingen.
' schrieb:Wenn ich mich hier mal reinhängen darf:
Ich weiß ja nicht, was Du letztlich eigentlich machen willst, aber falls Dir - und so lese ich Deinen Beitrag - wirklich an einem kontinuirlichem Sweep gelegen ist, anstatt so eines Quasi-Sweeps mit Abarbeitung eine Liste von Frequenzen, dann steht dem überhaupt nichts im Wege.
Im Prinzip läuft das so:
1) Festlegen der Sample-Frequenz: Höchste Frequenz ist 200Hz. Für ein vernünftige Abbildung brauchst Du 8 Punkte/Periode --> fs = 1600Hz, dt=0.615ms
2) 1 Otave/min umrechnen in Frequenzerhöhungs-Faktor pro dt: 2^(1/min*0.615ms)=1.000004369
3) Aktuelle Frequnz = aktuelle Frequenz(vorige Sample) * obiger Faktor
4) Phasendifferenz zur vorigen Sample berechnen = 2Pi*aktuelleFrequenz * dt
5) aktuelle Phase berechnen = vorige Phase + Phasendifferenz
6) Amplitudenwert der Sample = sin(Phase)
Das VI ist angehängt.
Der Haken an der Sache ist: Das Array wird sehr groß, besteht aus 510 000 Samples
Wenn es noch funktioniert (evtl mit single Precision) --> Glück gehabt
Wenn nicht: Die Samples mussen blockweise berechnet werden und blockweise in den Buffer nachgeschopben werden, bei kontinuierlicher Ausgabe. Das geht wunderbar, aber es ist nicht gerade ein Aufgabe für Anfänger.
Damit im Diagramm etwas zu sehen ist, habe ich im Beilspiel die Sweep-Geschwindigkeit von 1 Oktave/min auf 1000 Otave/min erhöht.
Man beachte auch: Bei Abarbeitung ein Frequenzliste kommt es zu Phasen-Diskontinuitäten bei jeder neuen Frequenz. Das System muß jedes Mal neu einschwingen.
Hallo Lucki
Also erstens mal danke für deinen Beitrag. Nach langem Überlegen verstehe ich jetzt endlich warum der Sweep anders nicht funktionieren kann. Allerdings blicke ich durch dein Programm immer noch nicht ganz genau durch, bzw ich verstehe nicht wie ich dieses jetzt auf mein Programm zur Schwingungsausgabe (siehe Anhang oben) anwenden kann. Außerdem soll der Sweep jetzt bis 1500 Hz gehen und nicht nur bis 200. Ich schätze dann wird die Samplefrequenz aber zu groß oder?? Naja falls das bis 1500 vorerst nicht geht ists auch egal. Vielleicht könntest du mir ja dabei helfen, dass der Sweep wenigstens bis 200 Hz geht und in mein Programm eingebunden wird!!