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 dem magnetischen Feld im Stepper. Unsere sehr einfache Ansteuerung hat diesem Schwingungssystem sogar immer weitere Energie zugeführt und so „am Leben gehalten“.
Damit steigen wir in diesem Teil in ein neues Problemfeld ein: Regelalgorithmen.
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, in wie weit Vorhersage und Realität übereinstimmen.
Besonders bei begrenzten Rechenresourzen ist es dabei wichtig, ein Optimum zwischen Abstraktion und Rechenaufwand einerseits, und Übereinstimmung 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ühr unseres einfaches Beispiel wäre das bei dieser Problemstellung allerdings, „mit Kanonen auf Spatzen zu schießen“. Hier reichen weiter 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 getrennt in unseren Regelkreisen.
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 werdem.
Unsere beiden Modis Verfahr- und Einschwingphase haben damit zwei verschiedene Zielkriterien:
- Verfahrphase: Schnelligkeit
- Einschwingphase: Genauigkeit
Hier liegt auch wieder die unterschiedliche Rolle der Drehgeber.
Ein Drehgeber auf der Motorachse ist vor allem für die Realisierung einer schnellen Fahrt relevant. Er dient der Optimierung der Rotoransteuerung und muss daher vor allem sehr schnell Messwerte ermitteln und übertragen. Die Genauigkeit ist demgegenüber unterpriorisiert, es kommen häufig magnetische inkrementelle Drehgeber mit ABN-Ausgang (auch ABZ genannt) zum Einsatz.
Ein Drehgeber auf der getriebenen Achse dient dagegen dem genauen Anfahren der Zielposition und ihrer Stabilisierung. Hier kommt es auf hohe Genauigkeit des Drehgebers an, Messung und Übertragung dürfen hier dagegen mehr Zeit in Anspruch nehmen, es kommen häufiger absolute Drehgeber mit Bussen wie BiSS oder SPI zum Einsatz.
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 diesen 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 beschleunigen auf seine Maximalgeschwindigkeit, 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, das 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 Verläufe der Fahrt, als sogenannte 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 weiter in den Ableitungen man diese Stetigkeit umsetzt, um so „sanfter“ wird die Bewegung, bei gleichzeitig steigendem Berechnungsbedarf.
Nun schauen wir uns diese Abschnitte einer S-Rampe näher an:
Wie zu sehen ist, hat unsere Rampe 7 Abschnitte. Die Abschnitte 2, 4 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.
Auf Grundlage dieser Abschnitte schauen wir uns nun an, welche Auswirkung immer kürzere Distanzen zwischen Istposition und Zielposition – Delta haben.
Zunächst trivialer Weise 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 Maximalbeschleunigung beschleunigt. Dies geht soweit, bis diese Abschnitte komplett entfallen.
Bei noch kürzeren Distanzen werden die Abschnitte symmetrisch gekürzt.
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
Bis hierher.
Der entscheidende Punkt ist die Rückkopplung: Der Algorithmus misst fortlaufend den tatsächlichen Zustand (Istwert), vergleicht ihn mit dem gewünschten Zustand (Sollwert) und berechnet daraus eine Stellgröße.
Eine Analogie dazu kennt jeder von uns: wenn wir Gläser auf einem Tablett transportieren, dann müssen wir dieses so bewegen, das die Flüssigkeit in den Gläsern nicht zu „schwappen“ beginnt. Der Trick: wir vermeiden schlagartige Bewegungen. Dies reduziert den sogenannten Ruck. Das allein reicht aber nicht. Man kann mit weichen Bewegungen ein System in Schwingungen versetzen, Stichwort Resonanzfrequenz. Beiden Problematiken begegnen wir aber bei unterschiedlichen Phasen.
Bei der Stabilisierung der Endposition wechseln wir quasi ständig zwischen zwei Zuständen: Stillstand und Beschleunigung / Verzögerung. Und dieser Übergang ist in unserem Fall bezogen auch die Beschleunigung „hart“. Besser sieht man dies bei einer globalen Sicht auf eine Fahrt:
Unser Problem liegt im harten „Knick“ im Punkt . Wir arbeiten mit einer festen Geschwindigkeit . Und das bedeutet letztendlich harte Sprünge der Beschleunigung . Unser Mittel gegen Schwingungsanregung sind aber weiche Bewegungen. Unser Feind ist der harte Ruck (englisch jerk).
Die Lösung sind S-Rampen. Hier werden die Übergänge geglättet. Bei der einfachsten Form der S-Rampe betrifft dies die Übergänge beim Wechsel der Beschleunigungen, bei höheren S-Rampen werden auch die Übergänge der Integrale der Beschleunigungsänderungen „abgerundet“.
In unserem einfachen Fall einer S-Rampe können wir grob unterscheiden:
- ist konstant oder
- wird linear vergrößert (Beschleunigung) oder verkleinert (Abbremsen / Verzögerung) mit , wobei . Fall 2 steht dann mit . Wir benötigen lediglich eine Funktion
- es erfolgt ein Wechsel von 1. zu 2. oder von 2. zu 1.
Fall 1 und 2 sind Berechnungsweise sehr einfach. Fall 3 schauen wir uns nun genauer an.
Fall 1 mit ist konstant können wir auch betrachten mit
Fall 2 steht dann mit
Für unsere Formen von S-Rampen brauchen wir also nur für eine Funktion einführen.