Hallo, ich habe für ein Raspberry Pi ein Aufsteckboard gemacht (tatsächlich wird der Raspberry aufgesteckt, ist aber egal). Das Board kann mehrere Schrittmotoren, Heizungen und Temperatur- und Drucksensoren, Ventile und LEDs ansteuern. Später soll der Mikrocontroller auf diesem Board die Regelung übernehmen, und ein Python Programm auf dem Raspberry die Steuerung. Der Mikrocontroller kann über die SWD Schnittstelle vom Raspberry programmiert und gedebugged werden, eine Kommunikation ist durch SPI sowie UART möglich. Da ich mehrere Regler implementieren muss, welche sich teilweise gegenseitig beeinflussen (MIMO-System) würde ich gerne die Hardware via Simulink ansteuern können. So kann man direkt die simulierte Übertragungsfunktion auf "Realitätsnähe" überprüfen. Ich könnte mir vorstellen ein VI in Simulink zu erstellen, welches via TCP/IP Nachrichten an den Raspberry (auf dem (vermutlich in Python) ein TCP/IP Server läuft) schickt, der dann diese Inputs via SPI an den Mikrocontroller schickt und gleichzeitig die Sensorwerte anfrägt, und diese wieder zurück an Simulink schickt. Ich hätte hier allerdings ein paar "praktische" Probleme, wie ich beispielsweise der Servofrequenz (im Moment sind 100Hz geplant) mit Simulink synchronisiere oder was der Mikrocontroller macht wenn ich die Simulation stoppe. Man findet zwar oft Hardware welche diese Treiber anbieten (Arduino, Speedgoat, auch für "native" Funktionen vom Raspberry) allerdings finde ich nirgends ein Beispiel wie jemand seine eigene Hardware über Simulink ansteuert. Hat das schonmal jemand gemacht oder auch ein Tutorial dazu gefunden?
Ich antworte mit Mal selbst. Ging alles ganz gut wie es geplant war. Also auf dem Raspberry läuft eine Python TCP/IP Server, der auf die Daten wartet, und beim Erhalt schickt er diese via SPI zum Mikrocontroller und die Sensorwerte schickt er anschließend wieder zurück zum Host Rechner. Synchronisieren geht nicht, ist aber bei 50-100Hz Servorate auch nicht nötig.
Cool! Kannst du was über die Latenz sagen? Lässt du in simulink das Modell in Echtzeit laufen oder dient das nur zum Aufnehmen und vergleichen von Messdaten, also nicht Echtzeit? Es gibt auch Echtzeit Module für HiL, z.B. den Simulink https://de.mathworks.com/discovery/hardware-in-the-loop-hil.html braucht aber Echtzeit fähige Hardware und toolbox. Denke TCP und vor allem Python ist zu lahm dafür. Kannst du etwas mehr erzählen? Ich finde das nämlich echt interessant :)
Hi, doch jemand der das liest. Ich habe nun einen Simulink Block den ich normal in Simulink benutzen kann wie alle anderen Blöcke auch. Inputs für die Heizungen sind float und gehen von 0-1 und stehen eben für die Leistung (0% -100%) und die Motoren haben als Input ebenfalls float, hier aber als physikalisch korrekte Einheit ml/s. Ausgänge sind die ganzen Sensoren in ihren Einheiten (meist Grad Celsius) Ich sende und empfange live-Daten in der Simulation. Soo lahm ist TCP/IP jetzt nicht. Typisch habe ich die Antwort in unter 1ms wieder (Wiresshark sagt das) Mein Ziel ist es zunächst die Übertragungsfunktionen aufzunehmen und anschließend im Modell nachzubilden. Dann den Regler dafür auslegen (inkl. Totzeit und Feedforward, eventuell auch predictive) und einstellen, und wenn das Modell gut geregelt wird den Regler in Matlab am echten System zu testen und dann das ganze in C auf dem Mikrocontroller laufen lassen. Den TCP/IP Server kann man auch in C auf dem Raspberry laufen lassen, aber die Zeit zum Ausführen ist vermutlich in beiden Varianten weniger kritisch als das Betriebssystem auf dem Raspberry selbst. Edit: Was übrigens mit am meisten Zeit gedauert hat war es, herauszufinden dass ich nicht mit dem Raspberry gleichzeitig debuggen und die SPI Schnittstelle benutzen kann. Während ich mit dem Raspberry über OpenOCD den Mikrocontroller debugge gibt die SPI Schnittstelle kein Signal von sich. Lediglich der ChipSelect wird getoggelt. Ich musste das Programm auf den Mikrocontroller laden und das debuggen beenden. Dann hat OpenOCD (vermutlich) den Zugriff auf die Hardware Pins freigegeben, so dass die SPI Schnittstelle funktioniert hat.
:
Bearbeitet durch User
Blöde Frage, wenn du nur ein Modell willst warum lässt du den Controller keine Anregung, Sinusförmig mit Bias z.B., erzeugen. Die Systemantwort scheinst du ja ohnehin zu messen. Das ganze kannst du bequem auf dem PI loggen und später offline auswerten. Das ist vermutlich weniger aufwendig und hat weniger Latenz, sofern das irgendwann von Interesse ist. Ich kenne dein System jetzt nicht genau aber alternativ ein ARX Modell mit LMS Algorithmus läuft auch ganz passabel auf einem uC.
Hi, leider gibt es nicht direkt "die eine Impulsantwort", da es sich um ein MIMO System handelt. Ich kann kurz das "Problem" umreisen. Ich habe zwei Durchlauferhitzer (inkl. Temperatursensor) und möchte am Ende, durch Mischen, Wasser in einer bestimmten Temperatur erhalten (auch hier gibt es einen Sensor). Hört sich erst einmal einfach an. Tatsächlich aber ist die Austrittstemperatur am Erhitzer abhängig von der Temperatur des Erhitzers, insbesondere an den Kontaktstellen, sowie der "verweildauer" des Wassers in diesem. Die Temperatur der Blocks selbst ist abhängig von der Heizleistung und der Wärme die durch das Wasser abtransportiert wird. Zu allem Überfluss wird das Wasser in ein Behältnis mit Raumtemperatur gefüllt (Auch hier gibt es einen Sensor). Tatsächlich ist es mein Ziel das Wasser in diesem Behältnis so gut wie möglich bei einer einstellbaren Temperatur zu halten, ohne dass es die Zieltemperatur übertritt, da sonst Verbrennungen auftreten. Das Ganze soll in 25 Sekunden passiert sein, so dass mit einer Totzeit im Bereich einer Sekunde nicht so gut auf den Fehler reagiert werden kann. Der Durchfluss ist annähernd bekannt, und die Zieltemperatur wird vorgegeben. Und ja, das wird eine Espressomaschine. Von der Regelzeit her ist es kein Problem alles live über Matlab rechnen zu lassen. So kann ich iterativ einzelne Antworten messen, mit einem Modell beschreiben, testen ob es passt, einen weiteren Faktor mit einbeziehen usw. und mich so iterativ an das echte System heranarbeiten. Am Ende kann man die Parameter der Regler noch am Model tunen, und zuletzt, vor der Implementierung in C auf dem Mikrocontroller, alles via Matlab regeln lassen. Ich sehe keine Möglichkeit die Querbeziehungen durch wenige Offline Mesungen zu identifieren und so passende Regler zu entwerfen. Lasse mich aber gerne eines anderen belehren.
Zur Synchronisation könnte man triggered Subsystems verwenden. Diese können auch via I/O Hardware oder deinen empfangen Daten gesteuert werden. Wenn du mehrere Subsystems hast, kannst du sie auch priorisieren. Das sollte eigentlich recht einfach gehen.
Ja, das Problem beim synchronisieren ist einfach, dass ich keine direkte Verbindung zwischen Matlab und dem Mikrocontroller habe, sondern dazwischen immernoch ein Raspberry mit Betriebssystem hängt. Ich kann mir aber gut vorstellen, anstatt auf die Abfrage von Matlab zu warten, einfach in jedem Servotakt die Sensorwerte an den Raspberry zu senden. Der leitet sie dann an Matlab weiter, welcher beim Receiver-Block auf "blocking mode" steht. Wenn Matlab mit diesen Werten fertig gerechnet hat (was ja schneller sein sollte als die Zykluszeit, sonst funktioniert es ja sowieso nicht), schickt es die Werte an den Raspberry, der sie dann sogleich an den Mikrocontroller sendet. Dann sollte ja (irgendwann) später wieder ein Zyklus losgehen, bei dem dann die Sensorwerte abgeschickt werden. Die Werte kommen dann zwar nicht synchron bei Matlab rein und raus, die Zeitpunkte wann diese aber gemessen und gesetzt werden sind nur von der Zykluszeit des Mikrocontrollers abhängig und (quasi) jitterfrei.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.