Im Folgenden soll ein Überblick gegeben
werden, welche Softwaremodule für das Auslesen und Ansteuern, sowie
der Realisierung der Regelung nötig sind.
Im Rahmen des Projekts wurde eine Datei
„GlobalDefinitions.h“ entwickelt, um Variablen in ihr zu deklarieren
und definieren. Die verschiedenen Klassen (CEncodermotor, PID,
TaskHandle) greifen alle auf „GlobalDefinitions.h“ zu und benötigen
den Zugriff auf die in ihr gespeicherten Variablen, um volle
Funktion zu gewährleisten.
Programmablauf
Mit Start des Programms FT32_Encoder werden
in der Setup-Funktion 2 eigenständige Tasks gestartet, auf welche im
Weiteren näher eingegangen wird. Die Regelung wird aktiviert und
wichtige Einstellungen, wie Interrupts, vorgenommen. In der
Loop()-Funktion wird die Geschwindigkeit des Fahrzeugs gesetzt und
die Tasks übernehmen die Regelung, sowie die Motoransteuerung.
CEncodermotor
Ein kurzer Überblick soll über die Klasse
CEncodermotor gegeben werden. Auf Konstruktoren/Destruktoren wird
nicht eingegangen, da es sich jeweils um Standard
Konstruktoren/Destruktoren handelt.
-
Start()
o
Setzt die
Startbedingungen um die Encodermotoren zu betreiben
-
printMotors()
o
Gibt
Informationen, wie wichtige Laufvariablen (i, turnSpeed) oder
aktuelle Werte der Regelvariablen für beide Motoren, aus.
-
setMotorScale()
o
Setzt die
Motordrehrichtung und einen Skalierungsfaktor bei unterschiedlichen
Drehzahlen der beiden Räder
-
setMotorSpeeds()
o
Fragt ab,
ob die Geschwindigkeitsvorgabe mit einer Anfahrtsrampe kommt. Ruft
setMotorScale() auf.
PID-Library
Wichtige Funktionen der PID-Library sollen
hier kurz erklärt werden.
-
PID-Kontruktor()
o
Baut ein
Objekt des Typs PID. Dabei werden Variablen, wie Input, Setpoint und
Output referenziert und Regelparameter übergeben.
-
SetSampleTime()
o
Zeitintervall mit welchem ein neuer Output errechnet wird.
-
SetOutputLimits()
o
Output-Spannweite wird hier übergeben.
-
SetMode()
o
An-/Ausschalten der Regelung
TaskHandle
Mit Start des Programms „FT32_Encoder“
werden, wie schon vorgehend erwähnt, in der setup()-Funktion zwei
eigenständige Tasks gestartet. Der ESP32 besitzt 2 Rechenkerne. Auf
Core 1 wird die setup()-Funktion, sowie die loop()-Funktion
abgearbeitet. Um weitestgehend unabhängig von den Arduino-Funktionen
zu sein, benutzen beide Tasks den Core 0.
Task „RegelTask“
Mit Start des RegelTasks werden Flags zur
Überprüfung der Fahrrichtung kontrolliert. Laufvariablen werden
gesetzt um den Setpoint der Regelung vorzugeben. Dabei wird auf eine
Anfahrtsrampe überprüft. Im Fall Anfahrtsrampe werden die
Laufvariablen kontinuierlich erhöht/erniedrigt, sowie ein neuer
Setpoint mit jeder Erhöhung/Erniedrigung der Laufvariable gesetzt.
Falls keine Anfahrtsrampe vorliegt, wird der Reglerinput sofort
gelesen/gesetzt. Anschließend berechnet der Regler den Output,
welcher im nächsten Schritt auf den PWM-Channel geschrieben wird.
Task „FeedbackTask“
Um
kontinuierlich Feedback der Encoder zu erhalten, wurde ein eigener
Task mit dieser Aufgabe entwickelt. Dieser wartet ein bestimmtes
Intervall ab, liest die Motorumdrehungen, berechnet hieraus die
aktuelle Raddrehzahl und setzt den Encodercounter wieder auf Null.
So kann gewährleistet werden, dass selbst Teilumdrehungen des Rades
wahrgenommen werden.
|