Im Teil 1 unserer Serie starteten wir mit den Grundlagen von Echtzeit, führten in unser Motion-Control Beispiel ein und endeten am Beispiel eines einfachen Pulses, erzeugt mittels der PIO (Programmable Input Output) unseres SoC.
Im Teil 2 stiegen wir weiter in die Programmierung unserer PIO ein und realisierten damit den Empfang von ACURO-Paketen unseres Drehgebers. Damit erhielten wir als Ergebnis die Grundlagen für Sensorik und Aktorik unseres Motion Control Beispiels: Winkelwerte lesen und einen Stepper ansteuern.
Im Teil 3 betteten wir unsere PIO-Ansteuerung des Drehgebers in einen Treiber ein, um von höheren Schichten auf den Drehgeber zugreifen zu können. Hier war das Zusammenspiel von höheren Schichten, ISR und PIO das Zentrum.
Im Teil 4 verbanden wir erstmals Sensorik und Motorik. Wir haben gesehen, wie unser System beim Versuch, eine Zielposition zu erreichen, in Dauerschwingung versetzt wurde. Der Grund liegt im federnden Verhalten sowohl von Mechanik z.B. im Wellengetriebe, als auch des magnetischen Feldes im Stepper. Unsere sehr einfache Ansteuerung hat diesem Schwingungssystem sogar immer weitere Energie zugeführt und so „am Leben gehalten“.
Damit steigen wir in ein neues Problemfeld ein: die Bewegungsplanung und die anschließende Regelung.
Ein Regelalgorithmus ist ein Algorithmus, der eine physikalische oder technische Größe automatisch auf einen gewünschten Wert bringt und dort hält, auch wenn Störungen auftreten. Grundlage dafür ist die Modellbildung:

Die physikalische Realität wird mit Hilfe eines mathematischen Modells abgebildet. Im mathematischen Modell werden Vorhersagen getroffen. Die Qualität des mathematischen Modells bestimmt, inwieweit Vorhersage und Realität übereinstimmen.
Besonders bei begrenzten Rechenressourcen ist es dabei wichtig, ein Optimum zwischen Abstraktion und Rechenaufwand einerseits und Übereinstimmung von Vorhersage und Realität andererseits zu erhalten. Diese Aufgabe nimmt in bestimmten Bereichen der Softwareentwicklung relevante Größenordnungen ein und wird daher mit entsprechenden Werkzeugen wie Simulink unterstützt.
Für unser einfaches Beispiel wäre das bei dieser Problemstellung allerdings, „mit Kanonen auf Spatzen zu schießen“. Hier reichen weitere Messfahrten und ihre statistische Auswertung.
Wie bereits in Teil 4 beschrieben, unterscheiden wir bei der Positionierung zwischen der Verfahrphase (move) und der Einschwingphase (settle). Diese betrachten wir nun hinsichtlich ihrer unterschiedlichen Anforderungen getrennt.
Zunächst, da unter physikalischen Gesichtspunkten einfacher, beschäftigen wir uns mit der Verfahrphase.
Wir haben eine Startposition und wollen eine Zielposition erreichen. Dabei haben wir zwei Ziele:
- Die neue Position soll schnell erreicht werden
- Die neue Position soll genau angefahren werden
Unsere beiden Modi, Verfahr- und Einschwingphase, haben damit zwei verschiedene Zielkriterien:
- Verfahrphase: vorrangig schnelle Bewegung unter Einhaltung der dynamischen Grenzen
- Einschwingphase: vorrangig genaue und stabile Positionierung
Hier liegt auch wieder die unterschiedliche Rolle der Drehgeber.
Bei einem motorseitigen Drehgeber stehen je nach Regelung schnelle Aktualisierung und geringe Latenz im Vordergrund. Er dient der Optimierung der Rotoransteuerung. Es kommen häufig magnetische inkrementelle Drehgeber mit ABN-Ausgang (auch ABZ genannt) zum Einsatz.
Bei einem abtriebsseitigen Drehgeber sind für die präzise Positionierung insbesondere Auflösung, Genauigkeit und Wiederholbarkeit entscheidend. Er dient dem genauen Anfahren der Zielposition und ihrer Stabilisierung. Auch hier muss die Latenz zur Dynamik des Regelkreises passen. Diese ist in der Regel allerdings höher als auf der Motorachse. Es kommen häufiger absolute Drehgeber mit Bussen wie BiSS oder SPI zum Einsatz.
In unserem vereinfachten Beispiel arbeiten wir nur mit einem Drehgeber auf der getriebenen Achse. Weiter beschäftigen wir uns zunächst nur mit der Berechnung einer geeigneten Sollwerttrajektorie für die Verfahrphase. Dabei wird noch keine Rückkopplung durch einen Drehgeber eingebunden, es ist also noch kein Regelalgorithmus.
Wird von einer Position zu einer anderen gewechselt, so wird erst in die Nähe der Zielposition gefahren und dann die Feinpositionierung durchgeführt. Ein Grund dafür sind Hysterese-Effekte. Wenn möglich, sollte man wegen dieser Effekte Richtungswechsel vermeiden.
Die Verfahrphase sollte also VOR der Zielposition enden. Dazu wird ein sinnvolles Delta definiert. Und aus diesem Delta folgt bereits: nicht immer findet eine Verfahrphase statt. Liegt die Startposition schon im Delta der Zielposition, wird gleich per Einschwingphase gewechselt.
Nun betrachten wir das andere Extrem, zwei weit entfernte Positionen. Um von einer Position zur anderen zu wechseln, muss unser Stepper aus dem Stand zunächst auf seine Maximalgeschwindigkeit beschleunigen, mit dieser einen gewissen Winkel unserer getriebenen Achse (wir haben ein Wellengetriebe 100:1) fahren und dann wieder negativ beschleunigen bis zum Stillstand am Anfang unseres Deltas für die Einschwingphase.
Bereits hier steigt die Komplexität des Problems. So wie eben beschrieben ergibt eine solche Fahrt zwischen den Abschnitten mit und ohne Beschleunigung einen Ruck. Eine Analogie dazu kennt jeder von uns: wenn wir Gläser auf einem Tablett transportieren, dann müssen wir dieses so bewegen, dass die Flüssigkeit in den Gläsern nicht zu „schwappen“ beginnt. Der Trick: wir vermeiden schlagartige Bewegungen. Dies reduziert den sogenannten Ruck. Dies bedeutet einen sanften Übergang zwischen den Abschnitten mit und ohne Beschleunigung.
Was aber bedeutet in unserem Fall „sanft“? Genau darin unterscheiden sich die verschiedenen Bewegungsprofile, die sogenannten Rampen. Unsere Grafik zeigt dazu eine klassische 4-Punkt-Rampe und eine S-Rampe. Die Geschwindigkeit ist dabei die erste zeitliche Ableitung des Weges. Die Beschleunigung ist wieder die zeitliche Ableitung der Geschwindigkeit, also die zweite zeitliche Ableitung des Weges. Der Ruck ist schließlich die zeitliche Ableitung der Beschleunigung.
Und genau über diese Ableitungen lässt sich der Unterschied zwischen einer linearen Beschleunigungsrampe (Trapezprofil) und einer S-Rampe sehr gut erklären.
| Größe | Mathematische Definition | Einheit |
|---|---|---|
| Position (Weg) | \(s(t)\) | \(\mathrm{m}\) |
| Geschwindigkeit | \(v(t)=\frac{ds(t)}{dt}\) | \(\mathrm{m/s}\) |
| Beschleunigung | \(a(t)=\frac{dv(t)}{dt}=\frac{d^2s(t)}{dt^2}\) | \(\mathrm{m/s^2}\) |
| Ruck (Jerk) | \(j(t)=\frac{da(t)}{dt}=\frac{d^3s(t)}{dt^3}\) | \(\mathrm{m/s^3}\) |
Es geht letztendlich um Stetigkeit in den Ableitungen. Je mehr höhere Ableitungen stetig gestaltet werden, desto stärker lassen sich abrupte Änderungen des Bewegungsverlaufs vermeiden. Die mathematische Beschreibung wird dabei aufwendiger, was jedoch, wie wir sehen werden, nicht zwangsläufig einen höheren Berechnungsaufwand zur Laufzeit bedeutet.
Nun schauen wir uns diese Abschnitte einer S-Rampe näher an:
Wie zu sehen ist, hat unsere Rampe 7 Abschnitte. Die Abschnitte 2 und 6 sind Beschleunigungsphasen, Abschnitt 4 ist Maximalgeschwindigkeit. Mathematisch sind diese Abschnitte trivial.
Komplex sind die Übergänge zwischen diesen Abschnitten, welche in den Abschnitten 1, 3, 5 und 7 erfolgen.
Aber gerade diese Bereiche lassen sich immer wieder auf die Transformation EINES Verlaufs zurückführen:
Und damit lassen sich diese Abschnitte in einer LUT vorrechnen. Die LUT muss lediglich neuberechnet werden, wenn der Ruck als Parameter verändert wird. Wird der Ruck in der Firmware fest vorgegeben, kann die LUT zur Compilezeit berechnet werden. Ansonsten wird die LUT zur Laufzeit einmal nach dem Laden oder Ändern des Rucks berechnet.
Anmerkung: Man könnte argumentieren, werden die Verläufe normiert in der LUT abgelegt, können sie durch geeignete Skalierung auf unterschiedliche Ruckwerte und Phasendauern übertragen werden. Eine Neuberechnung der Tabelle wäre somit nicht zwingend erforderlich. Aber gerade voll vorberechnete LUTs ermöglichen sogar ISRs ein schnelles „Neuladen“ eben ohne Berechnungen, welche womöglich sogar mit Fließkommazahlen arbeiten. Genau das ist einer der Vorteile von LUTs an dieser Stelle.
Auf Grundlage dieser Abschnitte schauen wir uns nun an, welche Auswirkungen immer kürzere Distanzen zwischen Istposition und Zielposition – Delta haben.
Zunächst trivialerweise verringert sich der Abschnitt 4 der Maximalgeschwindigkeit, bis dieser Abschnitt gänzlich entfällt.
Bei noch kürzeren Distanzen werden die Beschleunigungsabschnitte 2 und 6 reduziert. Es wird also nicht mehr auf Maximalgeschwindigkeit beschleunigt. Dies geht soweit, bis diese Abschnitte komplett entfallen.
Bei noch kürzeren Distanzen werden die Abschnitte 1, 3, 5 und 7 symmetrisch gekürzt. Der maximal zulässige Ruck bleibt dabei unverändert, während die erreichte Spitzenbeschleunigung sinkt.
Die Reihenfolge der Reduktion ist also:
- Abschnitt 4 bis 0
- Abschnitte 2 und 6 bis 0
- Abschnitte 1, 3, 5 und 7 immer zu gleichen Teilen
Die Abschnitte werden nun jedoch immer sequentiell durchlaufen, von 1 bis 7. Und bei den Durchläufen in jedem Abschnitt ist vor allem eine Funktion zeitkritisch: die Berechnung der nächsten Weckzeit für den nächsten (Teil)Step des Steppers, ausgeführt über eine ISR, ausgelöst vom vorher geladenen Timer.
Die Berechnung dieses jeweiligen Wertes zum „Neustellen“ des Timers ist dabei zeitkritisch. Diese Berechnung innerhalb aller Abschnitte muss auf Effizienz und kurze Berechnungszeit getrimmt werden. Um diese Effizienz zu erreichen, werden die Berechnungen zerlegt in zwei Gruppen:
- Vorberechnungen, die einmalig erfolgen können
- Unbedingt nötige Berechnungen, die zu jedem einzelnen (Teil)Step erforderlich sind
Im nächsten Teil werden diese Berechnungen genauer betrachtet.