Signal erstellen und gleichzeitig Regeln? - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Module (/Forum-LabVIEW-Module) +---- Forum: LabVIEW FPGA (/Forum-LabVIEW-FPGA) +---- Thema: Signal erstellen und gleichzeitig Regeln? (/Thread-Signal-erstellen-und-gleichzeitig-Regeln) |
Signal erstellen und gleichzeitig Regeln? - Knulf Arnulfson - 17.11.2010 16:54 Hallo, ich würde gerne mit meinem FPGA einen Sinus erstellen und gleichzeitig einen PID Regler nutzen um das Sinus Signal zu Regeln. Ich betreibe einen Elektromagnetischen Shaker und möchte über meinen RT Controller Amplitude und Frequenz an den FPGA geben. Meinen Sinus erstelle ich ueber einen Memory mit 1024 Plätzen im I16 Format den ich per Autoinitialisierungsfunktion mit einem Sinus versehe. Meine Idee ist es eine Schleife zu bauen die entsprechend oft wiederholt wird und dabei den Speicher Zeile für Zeile ausliest. Amplitude und Frequenzwechsel macht der RT Controller. Allerdings möchte ich die Schleife wesentlich langsamer laufen lassen als die PID Reglerschleife. Ist diese Parallelität möglich und wenn ja mit welcher Schleife arbeite ich am besten. Sollwert erhalte ich aus der Sinusschleife, Stellwert geht per AO 9263 raus und Istwert erhalte ich per Lasersensor auf dem AI 9205. Danke schonmal fürs lesen. Gruß Knulf P.S.: Ich arbeite mit LV 8.6.1 und einem cRIO 9014 Signal erstellen und gleichzeitig Regeln? - chrissyPu - 18.11.2010 09:10 Also, - Double auf FPGA geht nicht. Warum auch immer du das Programmieren kannst. Auf Fixpoint würde ich auch verzichten, die Ausgabe ist sowieso integer-basierend, da spart man Slices... - Die Übergabe zwischen den Schleifen funktioniert so nicht. Am Ausgang der oberen Schleife liegt (und das ist LabView-allgemein, nicht FPGA-spezifisch) erst nach Ende der Schleife ein Wert an. Daher: Übergabe zwischen den beiden muss anders geregelt werden. Da ich das noch nicht gemacht habe, nur ein Tipp: Globale Variable. Laut NI auf FPGA der Lokalen vorzuziehen. Alternativ ein Melder, wobei ich nicht weiß, ob das auf dem FPGA funktioniert. - Über das Speichern von Soll-, Ist- und Ausgabewert des Reglers würde ich nochmal nachdenken, könnte zu Laufzeitproblemen führen. alternativ: Die drei Zahlen in ein Array (bzw. besser einfach die entsprechenden Bits zusammen packen,d as geht auf dem FPGA instantan) packen und das Array/Bitmuster einmal in den FiFo schreiben. KÖnnte mir vorstellen, dass die Fifo-Zugriffszeit dadurch besser wird, Mechatronik-Ingenieur hat da aber sicher Erfahrungswerte zu... Soviel dazu, Grüße, ch Signal erstellen und gleichzeitig Regeln? - Knulf Arnulfson - 18.11.2010 10:53 Hi, danke für die schnelle Hilfe. Aber nochmal meine Frage. Kann ich die beiden Schleifen einfach so nebeneinander hinstellen und die werden mit der eingestellten Verzögerung unabhängig schnell ausgeführt? Ich habe zu diesem ersten Anlauf jetzt mal ein bischen weiter gebastelt, bin von FXP Zahlen weg (der PID Regler verlangt FXP Zahlen) und habe nun folgendes gebaut (s. Anhang). Wie schnell sind denn so Memoryblöcke und macht es Sinn für diese eine Variable einen anzulegen? Und Wo muss ich die Globale Variable erstellen, damit ich die auf dem FPGA nutzen kann(bzw. was von beidem ist schneller)? Ausserdem bin ich nicht dazu in der Lage den FIFO mit einem Array zu versehen bzw. irgendwelche bits zusammen zu schieben. Gruß Knulf Signal erstellen und gleichzeitig Regeln? - chrissyPu - 18.11.2010 13:28 Hi, - Generell geht das, zwei Schleifen auf einem FPGA unabhängig voneinander laufen zu lassen. In Deinem ERSTEN Screenshot wartet die zweite Schleife aber auf die Ausgabe von der ersten und wird daher nur einmal gestartet werden bzw. keine synchronisierten Daten bekommen. - Ob die Datenübergabe mit einem Memoryblock schnell genug klappt, wage ich zu bezweifeln, so wegen Arbitrierung. Wie gesagt, ich hab's noch nicht gemacht, würde aber über eine globale Variable gehen (ist im BD in der Structures-Palette zu finden und laut NI auf FPGAs schneller als die Nutzung von Lokalen Variablen) - siehe Anhang. Screenshot ist aus Standard LV, nicht aus dem FPGA-Modul, daher nicht wundern,w enn bei Dir da weniger drins teht. - Wegen PID: Schau mal, ob du den Ausgang nicht auf "Gleiches Zahlenformat wie der Eingang" stellen kannst - geht zumindest bei allen anderen FPGA-"Express-VIs"... - Bzgl. Array und so: Array würde ich sein lassen, es sei denn, du initialisierst das vorher und das braucht dann wieder Speicher. Daher vielleicht das angehängte Split/Joint-Number versuchen, logischerwesie zweimal hintereinander. Grüße, ch [attachment=30716] Signal erstellen und gleichzeitig Regeln? - Knulf Arnulfson - 19.11.2010 15:09 Danke nochmal für die Hilfe, Zitat:Daher vielleicht das angehängte Split/Joint-Number versuchen, logischerwesie zweimal hintereinander. Hat geklappt. Habe jetzt 4 I16 zu 1 U64 zusammengefügt. Lässt sich auch auslesen. Zitat:- Wegen PID: Schau mal, ob du den Ausgang nicht auf "Gleiches Zahlenformat wie der Eingang" stellen kannst - geht zumindest bei allen anderen FPGA-"Express-VIs"... Das habe ich nicht erreichen können, da ich diese Einstellung nicht vornehmen kann, und wenn doch dann habe ich diese nicht gefunden. Aber sollte ich nicht mit "einfachem" in I16 umwandeln "genug" Genauigkeit erreichen? Nun eine Frage zum Timing, wenns gestattet ist. Wie erreiche ich es denn, dass meine Signalschleife in dem Zeitlchen Abstand ausgeführt wird den ich möchte? Also wenn 1024 ausführungen der Schleife 1 Sinus sind. Dann müsste ich ja die Schleife alle 1/1024 Sekunden ausführen um 1 Hz zu erreichen. Das erreiche ich doch, wenn ich dem Loop-Timer sage: Alle 1000000/1024 uSec ausführen?! Jetzt meine Ungewissheit. Wie schnell geht das ganze von statten und wie hoch kann ich wohl in meiner Frequenz gehen. Bzw. wie schnell macht das wohl der Memory mit? Weiterhin s.u. was ich gebastelt habe und ich würde mich über eine Abschätzung und Beurteilung meines Programmierstils freuen. Gruß Knulf |