Forum: Digitale Signalverarbeitung / DSP / Machine Learning Zustandsmodell (Regelung) auf C8051


von Paul (Gast)


Angehängte Dateien:

Lesenswert?

Hallo.

Ich bin absoluter Neuling auf dem Gebiet der Mikrocontroller. Bin mir 
nicht mal sicher ob ich im richtigen Forum bin...

Hier meine Frage: Ich habe ein Zustandsmodell für ein inverses Pendel 
aufgestellt und den Rückführvektor sowie den Vorfilter erfolgreich 
berechnet. Jetzt habe ich alles in den z-Bereich (diskret) umgerechnet 
und freue mich das es in der Simulation (Matlab/SImulink) stabil 
funktioniert.
Jetzt kenne ich es aus anderen Sachverhalten, dass man mit dem 
RealTimeWorkshop einfach den C-Code eines Subsystems Compilieren kann, 
aufs C8051 hochlädt und fertig ist der Braten.

Falls die Frage jetzt bissl blöd ist, sei mir das verziehen. Wie bekomme 
ich jetzt die Zustandsregelung auf den µC? Was muss ich compilieren, wie 
läuft es? Woher weiß der Controller, was er machen soll?
Danke!

von Michael (Gast)


Lesenswert?

Dein Simulink Modell weiss ja gar nicht wie deine Peripherie aussieht - 
und wir auch nicht.

Selbst wenn Du C-Code heraus bekommst, wirst Du nicht um eine händische 
Einbettung in ein Programmgerüst deiner spezifischen Hardware kommen.
Dazu gehören Initialisierung, Ports aufsetzen  usw.

Hast Du denn einen C-Kompiler, ein uController Board, die 
Motoren/Sensoren schon zusammen?

von Paul (Gast)


Lesenswert?

Ja, das Rahmenprogramm und die Ports usw. ist schon klar.

Aber was soll der µC denn mit den Eingängen machen? Irgendwie muss ich 
den diskreten Rückführvektor und den Vorfilter ja abarbeiten. Das ist 
mir irgendwie noch nicht so klar.

von Whitespace (Gast)


Lesenswert?

Du musst bei jedem Abtastschritt (z.B. durch einen Timerinterrupt 
ausgelöst) auf dem uC folgendes berechnen:

u = P*soll - ft1*phi - ft2*phi_strich - ft3*p - ft4*p_strich - ft5*l;

Also einfach das, was das Blockschaltbild in Simulink auch berechnet.

Wobei ft1..ft5 deine berechneten Konstanten des Rückführvektors, soll 
der Sollwert (in deinem Blockschaltbild die Konstante mit 0)
und der Rest deine Systemzustände, sind, die du z.B. durch Messungen 
(Drehwinkelgeber, etc.) bestimmen musst.

u musst du wieder ausgeben. Wie und wohin musst auch du wissen.

Wie du deinen Sollwert und deine Zustände in den uC bekommst, das hängt 
von deiner Aufgabenstellung ab und von deiner Hardware, aber dazu hast 
du nichts geschrieben.

Dabei gehe ich mal davon aus, dass das System nicht im uC implementiert 
werden soll (geht auch), sondern ein physikalisch vorhandenes System 
ist, das du regeln willst. (Hätte sonst ja nicht viel Sinn, weil die 
komplette Simulation nur vom PC auf den uC verlagert werden würde ohne 
wiklich etwas reales zu regeln.)

   mfg Whitespace

von beobachter (Gast)


Lesenswert?

Kleine Frage:

Misst du den kompletten Zustandsvektor (5 Größen) oder nicht?

Falls nicht brauchst du noch ein etwas zur Zustandsrekonstruktion z.B. 
Beobachter oder Kalmanfilter.

von Michael (Gast)


Lesenswert?

Außerdem sieht dein System sehr Zeitkontinuierlich aus.
Aus einem uController kannst Du aber nur in diskreten Zeitabständen die 
aktuellen Messdaten aufnehmen und für die Berechnung der 
Zustandsregelung verwenden.
Daher musst Du deine Regelung in Simulink so anpassen, dass Sie stabil 
im Zeitdiskreten läuft.

von Paul (Gast)


Lesenswert?

Hallo!

Vielen Dank für die Antworten! Ich merke ihr habt Ahnung. War nämlich 
alles ungefähr das was ich benötige! Zustandsbeobachter ist korrekt, 
brauch ich auf jeden Fall, weil ich nur 2 der 5 Dinge messen kann. Ich 
hab bei der Suche etwas gefunden.

http://www.imrtweb.ethz.ch/users/geering/PRAKTIKA/Pendel.pdf

Das müsste doch in etwa genau so laufen, oder?

Vielen Dank!

von beobachter (Gast)


Lesenswert?

Ja, prinzipiell.

Wahrscheinlich brauchst du nur ein Integrator und den Beobachter für 4 
Zustände. Beides zeitdiskret.

Alternativ kannst du versuchen einfach 2 Differenzierer zu verwenden um 
auf die Geschwindigkeiten zu kommen.

von Paul (Gast)


Lesenswert?

@ Whitespace:

Vielen Dank für die "Formel". Ich verstehe langsam wie es laufen könnte.
Allerdings ist mir die ganze Sache mit dem Zustandsbeobachter nicht so 
klar. In Lunze oder Unbehauen sind da fiese Matrizen aufgeschrieben. 
Keine Ahnung wie das im µC umgesetzt werden soll.

Gibt es irgendwo eine einfache verständlcihe Version wie man einen 
Zustandsbeobachter in C umsetzen kann!?

Danke!

von beobachter (Gast)


Lesenswert?

Ein Beobachter besteht nun mal aus "fiesen" Matrizen.
Naja so fies ist es nicht.... du musst nur Matrizen addieren, 
subthrahieren und multiplizieren (also nichts "kompliziertes")

Bei dieser niedrigen Ordnung kannst du es direkt ausrechnen,  also 
elementweise ohne Matrizen Rechnung explizit zu programmieren.

Aber evtl kannst du einen "reduzierten" Beobachter nehmen, der ist 
(evtl) einfacher zu implementieren. (im Lunze ist es drin, Unbehauen 
habe ich nicht  zur Hand)

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.