Forum: Mikrocontroller und Digitale Elektronik Elektronik mit Simulink steuern?


von Gerald M. (gerald_m17)


Lesenswert?

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?

von Gerald M. (gerald_m17)


Lesenswert?

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.

von Jan K. (jan_k)


Lesenswert?

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 :)

von Gerald M. (gerald_m17)


Lesenswert?

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
von Kevin M. (arduinolover)


Lesenswert?

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.

von Gerald M. (gerald_m17)


Lesenswert?

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.

von Antenne (Gast)


Lesenswert?

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.

von Gerald M. (gerald_m17)


Lesenswert?

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
Noch kein Account? Hier anmelden.