LabVIEWForum.de - Regelung Piezo Signal

LabVIEWForum.de

Normale Version: Regelung Piezo Signal
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,
Ich habe gerade ein kleines VI geschrieben um einen Piezoaktor anzusteuern. Ziel soll es sein dem Piezo einen Sinusförmigen Weg vorzugeben. Desweiteren möchte ich den Weg der den Piezoaktor wirklich fährt auslesen und mittels PID regeln. Um das Ganze zu vereinfachen Berechne ich in jedem Schleifendurchlauf den ankommenden Maximalwert von 5000 Werten und vergleiche diesen mit der voreingestellten Amplitude meines Sinusgenerators.

AO und AI über NI-PCI-MIO-16.

Mine Frage ist nun ob das alles so funktioniert wie ich mir das mit der Regelung vorgestellt habe. Oder ob da mittels Erfahrung ( hab ich nicht ) Schwachstellen ausgemacht und ausgemerzt werden können.

PS: Habe schon einige Threads zur Verwendung von PID Gliedern durchgelesen ( Danke auch an GerdW für das entsprechende SubVI ).

Lv10

Edit: Ich habe noch nichts aufgeräumt usw. das mache ich sobald die Funktion gegeben ist.


Vielen Dank für eure Hilfe

Gruß Samuel
Hallo Samuel,

Zitat:Schwachstellen
- du startest die DAQmx-Tasks in der Schleife über eine Case-Struktur (und erst nach den Lese-/Schreiboperationen...). Erledige das vor der Schleife...
- du benutzt den SimplePID mit seinen Standard-PID-Parametern. Das kann, muss aber nicht funktionieren...
- Du gibst eine Samplerate vor, liest dann aber "-1" Samples, d.h. so viele wie vorhanden. Das führt zu ungleichmäßig großen Datenblöcken. Gib lieber eine feste Anzahl Samples zum Lesen vor.
- Du liest Werte ein, bearbeitest diese und gibst dann eine Antwort aus. Je größer du diese Datenblöcke machst, desto größer wird die Verzögerung des Reglers und damit (i.A.) die Regelung schlechter! Du solltest wie im Beispiel-VI in deinem alten Thread für einen Regler möglichst bei Einzelwerterfassung bleiben...
- Wozu eine FOR-Loop, die fest auf "1 Iteration" eingestellt wird? Dann kann man diese Loop auch löschen...
- Um aus einem skalaren Wert ein Array mit einem Element zu erstellen, kann man BuildArray verwenden. InitArray ist hier Overkill...
- Eine flache Sequenz ist besser als eine gestapelte!
- Keine Sequenz ist besser als eine Sequenz...
- Um ein "Nullsignal" auszugeben, muss man keinen Sinus mit Amplitude Null berechnen...
- "#s" ist momentan auf Null gesetzt, das macht sich ungünstig, wenn man Signale ausgeben will...
- Nur den Maximalwert als Istwert zu verwenden fühlt sich irgendwie nicht "richtig" an... Big Grin
Wieder mal schneller als der Blitz......

Hab paar von dir aufgeführte Sachen verbessert. Zu den Parametern des PID Reglers muss ich sagen, dass ich zwar Regelungstechnik in der UNI hatte ( war nichtmal so schlecht ) aber jetzt merkt man mal wieder den Unterschied zur Realität.
Wenn ich das noch richtig weiß müsste ich einen Sprung auf mein System geben ( ist ja nur mein Piezo ) und die Antwort ermitteln. Dann Tu und Tg mit der Wendetangente bestimmen und daraus PID ermitteln. Sind P I und D gleichzusetzen mit KP Tn und TV oder verstehe ich da was falsch?

Und wie mach ich das mit dem Sprung im Realfall. Wir hatten da einfach immer einen Kurve vorgegeben.

Nur die Max Werte zu verwenden hat sich irgendwie komisch angefühlt. Leider wusste ich nicht welchen Wert ich sonst nehmen soll. Mir erschien das als eine akzeptable Lösung.

Gruß
Hallo Samuel,

Zitat:Dann Tu und Tg mit der Wendetangente bestimmen und daraus PID ermitteln.
Genau, Wikipedia erklärt Ziegler-Nichols doch sehr gut...

Zitat:Sind P I und D gleichzusetzen mit KP Tn und TV oder verstehe ich da was falsch?
Jein.
Auch hier kann ich Wikipedia empfehlen: PID gibt es in Reihen- und Parallelstruktur. Der SimplePID ist die reinrassige Parallelstruktur und du kannst die PID-Parameter mit K, Tn und Tv übersetzen... (Wikipedia sagt Ki=1/Tn und Kd=Tv)

Zitat:Leider wusste ich nicht welchen Wert ich sonst nehmen soll. Mir erschien das als eine akzeptable Lösung.
Nehmen wir mal den (unrealistischen?) Fall, dass du 1000 Samples mit 1kHz Samplerate liest. Dann könnte das Maximum schon beim ersten Sample aufgetreten sein, dass zum Zeitpunkt der Verarbeitung aber schon 1s alt ist!

Also würde ich als bessere Lösung den aktuellsten Messwert verwenden: es erscheint mir besser, den Regler auf den aktuellen Wert reagieren zu lassen als auf einen schon deutlich älteren. Noch besser natürlich (wie oben schon gesagt): man liest nur Einzelwerte und reagiert darauf.

Hier muss man auch bedenken, wie schnell die Regelschleife arbeiten soll. Auf einem Windows-PC wirst du mit Einzelwerterfassung und -ausgabe wohl kaum sinnvoll über 500Hz Schleifenrate hinauskommen. Dein Piezo dürfte sehr schnell reagieren, sodass hier eigentlich höhere Schleifenraten sinnvoll wären. Dies müsste man dann aber in festverdrahteter Elektronik (irgendein Mikrokontroller-Platinchen) oder mit einem RT/FPGA-Target (teuer) lösen...

Zitat:Und wie mach ich das mit dem Sprung im Realfall. Wir hatten da einfach immer einen Kurve vorgegeben.
Sprung vorgeben und (ohne Regler) die Reaktion messen...
Wenn ich auf den aktuellsten Messwert reagieren möchte, dann sollte dies ja das Maximum der letzten Schwinung meines Sinus sein ( ich möchte den Wert ja als Amplitudenwert verwenden ). Dazu muss ich ja Frequenz meines Sinus beachten leider stehe ich gerade ein bisschen auf dem Schlauch bezüglich der Implementierung.

Vielleicht sollte ich die Regelung doch dem Servo-Controller im Amplifier überlassen...... Hätte es zu gerne in Labview realisiert. Aber ich denke die Genauigkeit werde ich nicht hinbekommen.

Gruß
Ich habe die Abfrage des Maximums jetzt mal bisschen abgeändert. Meiner Vorstellung nach sollten jetzt immer die letzten eineinhalb Perioden zur Maximalwertberechnung herangezogen werden. Für den betrieb sind Werte von 1kHz und 100 Samples vorgesehen. Bleibt immernoch das Problem mit den Reglerparametern.

Lv10 Version liegt bei ( SIMPLE PID unverändert )

Gruß
Hallo samuel,

Zitat:Meiner Vorstellung nach sollten jetzt immer die letzten eineinhalb Perioden zur Maximalwertberechnung herangezogen werden.
Mir erschließt sich immer noch nicht, wie du einen "sinusförmigen Weg" einstellen willst, wenn der Regler nur irgendwelche Maximalwerte zu sehen bekommt...

Zitat:Bleibt immernoch das Problem mit den Reglerparametern.
Wikipedia durchlesen und in der Praxis nachvollziehen...

Weitere Schwachpunkte:
- Warum verwendest du für "#s", "rate", "frequency" lokale Variablen anstatt von Drähten?
- "#s" ist immer noch auf Null per Default...
- Einzelwerte kann man auch per "1D Array interpolieren" (aus der Array-Palette)...
- Warum dividierst du Fs durch #s in jeder Iteration? Würde es nicht ausreichen, dies einmal vor der Schleife zu erledigen?
- "1/x * 1.5" = 1.5/x...
Vielleicht liege ich da ja falsch aber ich wollte eben nur das Maximum ( Amplitude ) des Sinus regeln. Nehmen wir an die Kraft auf den Piezo wird größer, dadurch verändert sich zwar der ganze Sinus aber eben auch das Maximum und somit der maximale Weg des Piezos. Stelle ich diesen Maximalen Weg über den Regler nach müsste sich doch auch der restliche Sinusförmige Verlauf entsprechend angleichen.

Du könntest mir ja einfach einen Vorschlag machen wie du es gestalten würdest. Du hast ja mein Vi. Wäre nett wenn du mir das mal so ändern könntest wie du es machen würdest.

Restliche Schwachstellen habe ich verbessert. Im Zuge dessen habe ich die Charts gleich durch Graphen ersetzt ( Die Charts nerven mich bisschen Big Grin ). Ich hoffe das funktioniert so mit den Schieberegistern.

Gruß
Hallo samuel,

Zitat:Vielleicht liege ich da ja falsch aber ich wollte eben nur das Maximum ( Amplitude ) des Sinus regeln.
Das hast du bisher aber nicht so gesagt. Bisher hieß es immer "sinusförmiger Weg" - und ein Streckenverlauf ist etwas anderes als die Amplitude einer Schwingung...

Wenn es dir nur um das Maximum geht, musst du dieses natürlich bestimmen - da bist du schon richtig vorgegangen.

Zitat:Im Zuge dessen habe ich die Charts gleich durch Graphen ersetzt ( Die Charts nerven mich bisschen Big Grin ). Ich hoffe das funktioniert so mit den Schieberegistern.
Jein. Zwei Probleme:
- Waveforms kann man nur problemlos zusammenfügen, wenn sie die identischen dt-Einstellung haben. Da du aber das Schieberegister mit einer Konstante initialisierst, könnte es hier Fehlermeldungen geben...
- Du limitierst die Größe der erzeugten Waveform nicht. Hier wirst du dir also über kurz oder lang den Speicher sprengen...

Weitere Vorschläge:
- Du arbeitest mit "N Samples" sowohl beim AI als auch beim AO, was zu Verzögerungen führt. Ich würde beide Tasks in separaten, parallelen Schleifen laufen lassen... (Das nennt sich dann "Producer-Consumer-Schema".)
- Wenn du sicherstellen willst, dass nach dem STOPP auch wirklich Null ausgegeben wird, dann solltest du das nach der Schleife (und vor dem DAQmxTaskDelete) selbst erledigen und dies nicht dem User aufbürden und darauf vertrauen, dass dieser den entsprechenden Button drückt...
Zitat:- Waveforms kann man nur problemlos zusammenfügen, wenn sie die identischen dt-Einstellung haben. Da du aber das Schieberegister mit einer Konstante initialisierst, könnte es hier Fehlermeldungen geben...

d.h. ich müsste dt schon vor der ersten berechung durch die Schleife wissen und initialisieren.... ja wie soll das denn gehen?

Zitat:- Du limitierst die Größe der erzeugten Waveform nicht. Hier wirst du dir also über kurz oder lang den Speicher sprengen...

eine Messung dauert bis zu 40 sec, ich hoffe das schafft der Speicher...

Zitat:Weitere Vorschläge:
- Du arbeitest mit "N Samples" sowohl beim AI als auch beim AO, was zu Verzögerungen führt. Ich würde beide Tasks in separaten, parallelen Schleifen laufen lassen... (Das nennt sich dann "Producer-Consumer-Schema".)

Ich habe bis jetzt etwas anderes unter Producer/Consumer verstanden. Ich dachte in einer Schleife werden Befehle abgearbeitet und in der anderen wird die entsprechende Aktion durchgeführt. Den Zusammenhang mit mit Lesen und Schreiben eines Wertes verstehe ich nicht ganz. Eingentlich brauch ich doch nur für jede der zwei Aufgaben eine While- Schleife....

Bedeuted parallel in diesem Zusammenhang auch snychron?. Ich verstehe glaube ich nicht ganz was du meinst.

Gruß
Seiten: 1 2
Referenz-URLs