Forum: Mikrocontroller und Digitale Elektronik schwankende Totzeit im Regelkreis


von Christian M. (orca25)


Lesenswert?

Hallo,
ich schreibe derzeit an meiner Bachelorarbeit.
Thema ist die Entwicklung eines Lenkwickelgebers und einer 
Lenkwinkelregelung für ein autonomes Modellfahrzeug.
Auf dem Fahrzeug ist ein PC, welcher die Fahrbahnerkennung und 
Fahrspurberechnung erledigt, verbaut.
Dieser bekommt die Fahrzeugistwerte bzw sendet die Sollwerte an einen 
Mikrocontrollerverbund.
Dieser Verbund besteht aus 2 ARM Controllern. Der Erste ist für die 
Kommunikation zum PC und die Abfrage der Sensoren (I2C) zuständig. Der 
zweite Controller ist für die Erzeugung der PWM-Werte für Lenkservo und 
Motor zuständig. Auf diesem soll auch die Regelung implementiert werden.
Auf den Controllern kommt ein Scheduler zum Einsatz. Das heißt es werden 
alle Tasks in vorgebener Reihenfolge abgearbeitet. So gibt es zB eine 
Task, die die Sensorwerte abfragt und eine Weitere die die Kommunikation 
zu ARM2 tätigt.

Für den Lenkwinkelgeber habe ich einen Sensor auf Basis eines belasteten 
Spannungsteilers entwickelt, der mit dem Lenkservo verbunden ist.
Über die gemessene Spannung lässt sich der Winkel ermitteln.
Der ADC ist über den I2C-Bus an ARM1 angeschlossen.
ARM1 überträgt den gemessenen Wert an ARM2, welcher diesen für die 
Regelung benötigt.

Nun habe ich mehrere Messungen für die Sprungantwort gemacht.
Im ersten Schritt habe ich die Zeit gemessen, die benötigt wird zwischen 
setzen des PWM-Wertes (Triggersignal auf ARM2) und dem Ereichen des 
sationären Endwertes (gemessen am Poti). Im zweiten Schritt habe ich die 
übertragung zwischen Abfrage des Sensors und "Eintreffen" des Istwertes 
in der Reglertask gemessen. Diese Zeit muss ich nach meinem Verständnis 
zur Totzeit zuaddiern.
Zur Sicherheit habe ich jeweils mehrere Messungen getätigt.
Dabei ist mir aufgefallen, dass die Zeit zwischen ARM2 und Poti immer 
gleich ist (39ms Totzeit und 340ms von Linksausschlag nach 
Rechtsausschlag). Jedoch schwankt die Zeit von ARM1 zu ARM2. Mit jedem 
Neustart des Systems erhalte ich andere Zeiten. Zwischen 4ms und 20ms. 
Verändere ich die Reihenfolge der Tasks oder kommen weitere Tasks hinzu, 
kann sich die Totzeit auf bis zu 120ms ausweiten.

Zur Berechnung der Regelung kommt das Verfahren von Takahashi zum 
Einsatz.

Leider wurde das Thema Regelung im Studium nur sehr oberflächlich 
behandelt. Frei nach dem Motto: Regelung gibt es auch.
Somit bin ich etwas aufgeschmissen, da ich nicht weiß wie ich dieses 
Problem angehen soll. Soll ich zur Berechung einfach die längste 
gemessene Totzeit nehmen (In der Hoffnung, dass ich die längste gemessen 
habe)?

Das System darf ich nicht ändern. Es ist also nicht möglich die 
Aufteilung der Aufgaben der ARM's (würde auch mechanische Änderungen 
erfordern) zu ändern, noch darf ich das Taskkonzept aushebeln.

Wo finde ich, für einen technischen Informatiker, leicht verständliche 
Literatur, welche einfache Wege zur Problemlösung aufzeigt bzw mit der 
ich belegen kann, dass eine Reglerimplementation den Rahmen der BA 
sprengen würde.
Bei den millionen von Büchern zum Thema Regelungstechnik sehe ich das 
richtige Kapitel vor lauter Seiten nicht. ;)

Vielen Dank für die Hilfe im Voraus
Christian

von Christian M. (orca25)


Lesenswert?

Danke für die qualifizierte Hilfe.

von A. R. (redegle)


Lesenswert?

>Soll ich zur Berechung einfach die längste
>gemessene Totzeit nehmen (In der Hoffnung, dass ich die längste gemessen
>habe)?

Bei Regelungen ist so, dass Systeme mit langen Totzeiten schlechter zu 
regeln sind.
Vereinfacht ausgedrückt (zum Verständniss): Wenn die Regelung schneller 
als die Regelstrecke ist kommt es zum Schwingen. Totzeiten machen die 
Regelstrecke langsamer. Also wenn die Totzeit größer wird muss die 
Regelung langsamer gestaltet werden.

Das heißt beim Auslegen der Regelung musst du den worst case ansetzten 
also die längste mögliche Totzeit.

Dadurch wird dein Gesammtsystem natürlich langsamer aber es wird 
vermieden, dass es zu Resonanzen kommt.

von Purzel H. (hacky)


Lesenswert?

Die Regelung muss ja nicht im Nebel stochern sondern kann von einem 
definierten Verhalten ausgehen.

von Christian M. (orca25)


Lesenswert?

Das war der Hinweis den ich brauchte.
Wenn ich eine Fahrzeuggeschwindigkeit von 7m/s zu Grunde lege, wird im 
worst case (160ms) ja schon eine Strecke von mehr als einem Meter 
während der Totzeit zurückgelegt. Da ist eine Reglung irgendwie nutzlos.
Vielen Dank.

von W.S. (Gast)


Lesenswert?

Christian Möller schrieb:
> Der ADC ist über den I2C-Bus an ARM1 angeschlossen.
> ARM1 überträgt den gemessenen Wert an ARM2, welcher diesen für die
> Regelung benötigt.

Hat sich das dein Prof oder irgendeiner seiner Assi's ausgedacht?

Also - so wie ich das verstanden habe:

Der Ist-Lenkwinkel wird per Poti und ADC von uC1 gemessen und dann 
irgendwann nach einer erheblichen und unvorhersagbaren Pause an uC2 
gesendet, der seinerseits den Soll-Lenkwinkel kennt und anhand des 
gesendeten Ist-Wertes die Nachstellung des Lenkwinkels veranlassen soll.

Schönen Gruß an deinen Prof: Wenn er mein Mitarbeiter wäre, dann würde 
ich ihm seine Idee um die Ohren schlagen bis er begreift, was für einen 
Stuss er sich da ausgedacht hat. Sowas einem Studenten zuzumuten ist 
nach meiner Meinung eine Abart vom Mobbing - er weiß vermutlich sehr 
genau, daß man mit derartigen Vorgaben schlichtweg vor die Wand rennt 
und scheitern MUSS.

Also:
1. der Ist-Winkel sollte direkt mit einem internen ADC vom uC2 gemessen 
werden.
2. Der Wert sollte per Interrupt-Routine abgefragt und sofort zu einer 
entsprechenden Nachstellung des Lenkantriebes führen, also ohne den 
Umweg über langsame und zeitlich unvorhersagbare RTOS-Mechanismen.
3. Sowas muss erlaubt sein, denn der Sinn eines jeden 
Echtzeit-Betriebssystems besteht ja gerade darin, daß es in Echtzeit, 
also zur rechten Zeit reagieren kann.

Wenn dieses für Dinge hoher Priorität (und die Lenkung eines Fahrzeuges 
hat wohl die allerhöchste Priorität) von der Systemstruktur (also der 
Aufgabenaufteilung, der Priorisierung etc.) nicht garantiert werden 
kann, dann ist der gesamte Systemansatz ein Fall für die Mülltonne.

Selbst Shannon läßt hier grüßen. Wahrscheinlich mußt du bei 
anzunehmenden Totzeiten von 200 ms und mehr die Forderung erheben, daß 
die Fahrgeschwindigkeit des Vehikels nicht mehr als 2..3 cm pro Sekunde 
betragen darf, weil sonst nicht mehr für die Lenkung garantiert werden 
kann - eben wegen des Abtast-Therorems.

W.S.

von Purzel H. (hacky)


Lesenswert?

Mir scheinen die Zeiten fuer die trivialen Operationen viel zu hoch zu 
sein. Mir erscheint 0.5 .. 1ms grad noch tragbar zu sein. Zwei ARM 
Controller haben ja eine derart hohe Rechenleistung, das sollte moeglich 
sein. Wo geht die Zeit drauf ? Ist das System preemptiv ? Dann mit 10kHz 
clocken.

von Christian M. (orca25)


Lesenswert?

@ W.S.
Ja das hat sich einer meiner Professoren ausgedacht. Ist aber kein 
Informatiker.
Die Vermutung, dass das Konzept Mist ist wurde schon früher geäußert 
(nicht nur von mir).
Aber welcher Student widerspricht schon gerne seinem betreuenden Prof.
Leider kann kein interner ADC verwendet werden, da diese mit der 
Überwachung der Akkus betraut sind. Dies ließe sich codetechnisch wohl 
leicht ändern, aber die elektronische Komponente nicht. Zumindest nicht, 
wenn man die Überwachung nicht weglassen will.
Das Konzept alles in Tasks zu machen wurde meines Wissens gewählt, weil 
dadurch alle Funktionen klar abgetrennt sind und wohl leichter zu 
verstehen. Das Fahrzeug wird in studentischen Projekten eingesetzt, in 
denen die Studierenden ein Semester mitarbeiten.
Deshalb kann ich da auch nicht einfach das Konzept ändern und über 
Interrupts Daten senden oder abfragen.
Zum Glück kann die Erkenntnis das etwas nicht realisierbar ist (auch 
wenn man es vorher wusste) das Resultat einer BA sein. Somit ist die 
Annahme zumindest belegt.
Nicht schön für mich, aber zumindest habe ich ein Sensorsystem 
entwickelt. Das wohl bei den vorherschenden Laufzeiten nur als informell 
bezeichnet werden kann. Sieht doch in einer Telemetrieoberfläche schick 
aus.

@ Mega Oschi
Soweit ich das Scheduling durchblicken konnte (ich hab mich nicht so 
tiefgreifend damit beschäftigt), bekommt eine Task x ms Laufzeit zur 
Verfügung gestellt. Ob sie diese nun braucht oder nicht ist egal. Der 
Timer läuft ab und der Taskwechsel erfolgt. Des Weiteren wird in jedem 
Zyklus jede Task durchlaufen. Egal ob sie etwas zu tun hat oder nicht. 
Zum Beispiel Licht steuern: Wenn das Licht schon leuchtet schalte es 
nochmal ein. Bei mehreren Tasks, welche zw 10ms und 25ms Zeit bekommen, 
summiert sich dies halt entsprechend auf. Durch umsortieren habe ich die 
Zeit für meinen Fall ja schon drücken können. Aber sollte jemand auf die 
Idee kommen eine andere zeitkritische Anwendung zu implementieren ...
Leider ist der Scheduler nicht preemtiv.

Ich denke das Konzept ist in dem Fall richtig, wenn man nur ein paar 
Fahrwerte setzen will und keine Rückmeldung benötigt. Auch das 
Hinzufügen neuer Funktionen ist somit ja leicht. Definiere die Variablen 
im Datencontainer die du brauchst, schreib deine Task, trage diese in 
der main-Funktion ein und füge einen case zur Abfrage bzw zum Senden in 
die entsprechende Task ein. Fertig.
Nur wie gesagt bei zeitkritschen Sachen wie Regelung versagt der Ansatz.

Ich danke nochmals allen für die Hilfe.
Viele Grüße
Christian

von Purzel H. (hacky)


Lesenswert?

Wofuer geht denn die Rechenzeit drauf ? Floatingpoint matritzen ? Man 
kann solche Tasks auch abkuerzen, indem man nur die halbe Matrix pro 
Zeitscheibe rechnen laesst.
Das Wesen eines Echzeitsystems ist, dem wichtigen Prozess die noetige 
Rechenzeit zur Verfugung zu stellen. Und das Steuern des Fahrzeuges ist 
wichtig. Falls die Rechenzeit nicht reicht, muss man eben langsamer 
fahren.

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.