Projekt 40: Regelung eines fertigen Laborversuchsaufbaus "Lageregelung": Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
Zeile 4: | Zeile 4: | ||
Betreuer: [[Benutzer:mirekgoebel| Prof. M. Göbel]] | Betreuer: [[Benutzer:mirekgoebel| Prof. M. Göbel]] | ||
[[Datei:Versuchsaufbau1.jpg| | [[Datei:Versuchsaufbau1.jpg|350px|thumb|right|Abbildung 1: Versuchsaufbau Lageregelung ]] | ||
- | ==Aufgabe== | ||
Die Aufgabe in diesem Projekt bestand darin, einen Regler für einen fertigen Laborversuchsaufbau zu entwickeln, welcher die Lage eines Schlittens regelt. Der Regler soll auf der Hardware eines Arduino Uno Boards laufen, dieser soll sich außerhalb des Aufbaus befinden und über einen 50 poligen Stecker angeschlossen werden. Sowohl der Aufbau, als auch das Arduino-Board waren zum Projektbeginn vorhanden, wodurch keine Beschaffung von Hardware notwendig war. | |||
Die Vorgehensweise bei diesem Projekt richtete sich klassisch nach den vier Projektphasen: Vorbereitung, Planung, Durchführung und Präsentation/Dokumentation. | |||
===Erwartungen an die Projektlösung=== | ===Erwartungen an die Projektlösung=== | ||
Zeile 16: | Zeile 17: | ||
*Recherche zu bestehenden Lösungen | *Recherche zu bestehenden Lösungen | ||
*Systemidentifikation (Übertragungsfunktion der Regelstrecke bestimmen) | *Systemidentifikation (Übertragungsfunktion der Regelstrecke bestimmen) | ||
*Vergleichen und bewerten Sie verschiedene Regleransätze ( | *Vergleichen und bewerten Sie verschiedene Regleransätze (P, I, D), Darstellung der Soll-/Istgrößen. | ||
*Programmiersprache: C | *Programmiersprache: C | ||
*Test und wiss. Dokumentation | *Test und wiss. Dokumentation | ||
Zeile 27: | Zeile 28: | ||
==Vorbereitung== | |||
== | |||
Zur Vorbereitung auf das Projekt wurde der aktuelle Stand des Projekts analysiert. Dazu wurde die Dokumentation auf der HSHL-Wiki Seite zur Rate gezogen, sowie die Informationen, die im Projektordner abgelegt wurden. | Zur Vorbereitung auf das Projekt wurde der aktuelle Stand des Projekts analysiert. Dazu wurde die Dokumentation auf der HSHL-Wiki Seite zur Rate gezogen, sowie die Informationen, die im Projektordner abgelegt wurden. | ||
Zeile 51: | Zeile 34: | ||
Im Gegensatz zu der letzten Projektbearbeitung sollte dieses Mal selber Softwaretechnisch ein Regler entwickelt werden, d.h. ohne Unterstützung einer Library. Dazu wurden die Ansätze eines digitalen Zeitdiskreten PID Reglers recherchiert. Daraus ergab sich: QUELLE. Aus der Vorlesung Mess- & Regelungstechnik wurde entnommen, dass der D-Anteil gefiltert werden muss, hierzu wurde aus den Vorlesungsunterlagen das PT1-Filter entnommen. | Im Gegensatz zu der letzten Projektbearbeitung sollte dieses Mal selber Softwaretechnisch ein Regler entwickelt werden, d.h. ohne Unterstützung einer Library. Dazu wurden die Ansätze eines digitalen Zeitdiskreten PID Reglers recherchiert. Daraus ergab sich: QUELLE. Aus der Vorlesung Mess- & Regelungstechnik wurde entnommen, dass der D-Anteil gefiltert werden muss, hierzu wurde aus den Vorlesungsunterlagen das PT1-Filter entnommen. | ||
===Versuchsaufbau=== | |||
Der Laborversuch(Abbildung) ist so aufgebaut, dass durch einen Servomotor eine Spindel angetrieben wird. Dieser Motor lässt sich im Links- und Rechtslauf antreiben. Auf der Spindel befindet sich ein Schlitten, welcher sich durch die Drehung der Spindel auf dieser nach links und rechts bewegt. Durch ein Linearpotentiometer, das parallel zur Spindel angebracht ist, lässt sich die Position des Schlittens bestimmen. An den Endpositionen des Potentiometers befinden sich Endschalter, welche die Stromversorgung für den Motor ausschalten, um einen Überlauf des Schlittens zu verhindern. | |||
Über vier Drehpotentiometer, die sich an der Vorderseite des Aufbaus befinden lassen sich zum einen die gewünschte Sollposition, sowie die verschiedenen Regleranteile einstellen. | |||
Der Versuchsaufbau wird über ein Arduino Uno Board gesteuert, welches mit einem PC verbunden ist. | |||
Die Pinbelegung des ist in der nachfolgenden Tabelle dargestellt: | |||
Board | |||
==Planung== | |||
Bei der Planung des Projektes sollte die Regelung des Aufbaus bestimmt und simuliert werden. Dafür wurde die Theorie dargestellt, ein Regelkreis entworfen und das System mithilfe von Matlab/Simulink simuliert. | |||
Da die Programmieroberfläche von Arduino keine Logging Funktionen bietet wurde hier auf das Tool Terminal.exe zurückgegriffen. Daamit wurden die Messergebnisse aufgenommen, um sie mit Excel oder Matlab zu visualisieren. | |||
===Theorie=== | |||
Die Übergangsfunktiontionen der Regler P, PI und PID lauten wie folgt: FORMELN | |||
Die Regelstrecke weist ein I-Verhalten auf. Dies wurde experimentell ermittelt, indem ein Einheitssprung in die Regelstrecke eingeführt wurde. Praktisch bedeutet dies, den Motor anzuschalten. Das bedeutet wiederum, dass der zurückgelegte Weg sich über die Zeit aufintegriert. Die Messdaten wurden visualisiert (Abbildung), über die Steigung der Geraden konnte der Faktor <math>K_i</math> der Regelstrecke bestimmt werden. | |||
===Regelkreis=== | |||
[[Datei:RegelkreisLageregelung.jpg|500px|thumb|right|Abbildung 4: Regelkreis ]] | |||
Die Sollgröße wird über das Drehpotentiometer bestimmt und in den Regelkreis eingebracht. Die Regelabweichung wird an den Regler, welcher als P, PI oder PID-Regler realisiert werden soll, übergeben. Dieser übergibt dann ein PWM-Signal an die Regelstrecke. Diese besteht aus dem Motor und der Spindel. Durch das Linearpotentiometer wird die Ist-Position bestimmt, welche als Rückführgröße wieder in den Regelkreis eingeht. | |||
===Simulation mit Matlab/Simulink=== | |||
Mithilfe von Matlab/Simulink wurde die Regelstrecke simuliert. Mithilfe dieser Simulation konnten die Einflüsse der verschiedenen Reglertypen und die Veränderung von ihren Kennwerten prinzipiell veranschaulicht werden. Dadurch wurden die Abläufe im Regelkreis deutlich. | |||
==Durchführung== | |||
Bei der Durchführung wurde zunächst der Regler in der Programmiersprache C umgesetzt. | |||
Version vom 28. Januar 2016, 09:58 Uhr
Autoren: Madleine Kahr, Adam Fankhauser
Betreuer: Prof. M. Göbel
Aufgabe
Die Aufgabe in diesem Projekt bestand darin, einen Regler für einen fertigen Laborversuchsaufbau zu entwickeln, welcher die Lage eines Schlittens regelt. Der Regler soll auf der Hardware eines Arduino Uno Boards laufen, dieser soll sich außerhalb des Aufbaus befinden und über einen 50 poligen Stecker angeschlossen werden. Sowohl der Aufbau, als auch das Arduino-Board waren zum Projektbeginn vorhanden, wodurch keine Beschaffung von Hardware notwendig war. Die Vorgehensweise bei diesem Projekt richtete sich klassisch nach den vier Projektphasen: Vorbereitung, Planung, Durchführung und Präsentation/Dokumentation.
Erwartungen an die Projektlösung
- Darstellung der Theorie
- Entwurf eines Regelkreises
- Recherche zu bestehenden Lösungen
- Systemidentifikation (Übertragungsfunktion der Regelstrecke bestimmen)
- Vergleichen und bewerten Sie verschiedene Regleransätze (P, I, D), Darstellung der Soll-/Istgrößen.
- Programmiersprache: C
- Test und wiss. Dokumentation
- Live Vorführung während der Abschlusspräsentation
Schwierigkeitsgrad
Anspruchsvoll (***)
Vorbereitung
Zur Vorbereitung auf das Projekt wurde der aktuelle Stand des Projekts analysiert. Dazu wurde die Dokumentation auf der HSHL-Wiki Seite zur Rate gezogen, sowie die Informationen, die im Projektordner abgelegt wurden. Aus den Unterlagen des letzten Projektes ging hervor, dass schon einmal ein funktionierender PI-Regler entwickelt wurde, dieser wurde zur Einarbeitung analysiert und getestet. Dabei sind mehrere Sachen aufgefallen. Zum einen wurde in der Programmierung des Arduino der Befehl digitalWrite() benutzt, um den Motor mit einem PWM-Signal anzusteuern . Die Funktion lässt aber nur zu, dass der Ausgang die Signale HIGH und LOW liefert, was in der Regelung nur genauso lange funktioniert, wie der I-Anteil des Reglers klein bleibt. Die eigentliche Funktion des Ausgangs zur Erzeugung eines PWM-Signals wird mit der Funktion analogWrite() erzeugt, welche Werte von 0 bis 255 als Eingangsgrößen akzeptiert. Im Gegensatz zu der letzten Projektbearbeitung sollte dieses Mal selber Softwaretechnisch ein Regler entwickelt werden, d.h. ohne Unterstützung einer Library. Dazu wurden die Ansätze eines digitalen Zeitdiskreten PID Reglers recherchiert. Daraus ergab sich: QUELLE. Aus der Vorlesung Mess- & Regelungstechnik wurde entnommen, dass der D-Anteil gefiltert werden muss, hierzu wurde aus den Vorlesungsunterlagen das PT1-Filter entnommen.
Versuchsaufbau
Der Laborversuch(Abbildung) ist so aufgebaut, dass durch einen Servomotor eine Spindel angetrieben wird. Dieser Motor lässt sich im Links- und Rechtslauf antreiben. Auf der Spindel befindet sich ein Schlitten, welcher sich durch die Drehung der Spindel auf dieser nach links und rechts bewegt. Durch ein Linearpotentiometer, das parallel zur Spindel angebracht ist, lässt sich die Position des Schlittens bestimmen. An den Endpositionen des Potentiometers befinden sich Endschalter, welche die Stromversorgung für den Motor ausschalten, um einen Überlauf des Schlittens zu verhindern. Über vier Drehpotentiometer, die sich an der Vorderseite des Aufbaus befinden lassen sich zum einen die gewünschte Sollposition, sowie die verschiedenen Regleranteile einstellen. Der Versuchsaufbau wird über ein Arduino Uno Board gesteuert, welches mit einem PC verbunden ist. Die Pinbelegung des ist in der nachfolgenden Tabelle dargestellt:
Planung
Bei der Planung des Projektes sollte die Regelung des Aufbaus bestimmt und simuliert werden. Dafür wurde die Theorie dargestellt, ein Regelkreis entworfen und das System mithilfe von Matlab/Simulink simuliert. Da die Programmieroberfläche von Arduino keine Logging Funktionen bietet wurde hier auf das Tool Terminal.exe zurückgegriffen. Daamit wurden die Messergebnisse aufgenommen, um sie mit Excel oder Matlab zu visualisieren.
Theorie
Die Übergangsfunktiontionen der Regler P, PI und PID lauten wie folgt: FORMELN
Die Regelstrecke weist ein I-Verhalten auf. Dies wurde experimentell ermittelt, indem ein Einheitssprung in die Regelstrecke eingeführt wurde. Praktisch bedeutet dies, den Motor anzuschalten. Das bedeutet wiederum, dass der zurückgelegte Weg sich über die Zeit aufintegriert. Die Messdaten wurden visualisiert (Abbildung), über die Steigung der Geraden konnte der Faktor der Regelstrecke bestimmt werden.
Regelkreis
Die Sollgröße wird über das Drehpotentiometer bestimmt und in den Regelkreis eingebracht. Die Regelabweichung wird an den Regler, welcher als P, PI oder PID-Regler realisiert werden soll, übergeben. Dieser übergibt dann ein PWM-Signal an die Regelstrecke. Diese besteht aus dem Motor und der Spindel. Durch das Linearpotentiometer wird die Ist-Position bestimmt, welche als Rückführgröße wieder in den Regelkreis eingeht.
Simulation mit Matlab/Simulink
Mithilfe von Matlab/Simulink wurde die Regelstrecke simuliert. Mithilfe dieser Simulation konnten die Einflüsse der verschiedenen Reglertypen und die Veränderung von ihren Kennwerten prinzipiell veranschaulicht werden. Dadurch wurden die Abläufe im Regelkreis deutlich.
Durchführung
Bei der Durchführung wurde zunächst der Regler in der Programmiersprache C umgesetzt.
PI-Regler
Die Reglergleichung des PI-Reglers ist definiert durch:
Bei der Programmierung des Reglers wurde fertige Funktion aus der Arduino Bibliothek benutzt. Die kp und ki Beiwerte wurden so bestimmt, dass verschiedene Werte eingesetzt wurden und die Sprungantwort beobachtet. In Abbildung 5 ist die Sprungantwort des PI-Reglers dargestellt.
Programmcode
Im Folgenden ist der Programmkode:
#include <PID_v1.h>
double Setpoint, Input, Output;
double Kp=3, Ki=0.01, Kd=0;
double e;
PID myPID(&Input, &Output, &Setpoint,Kp,Ki,Kd, DIRECT);
int MotorENB = 4; // digital in
int MotorRechts = 3; // digital (pwm) in
int MotorLinks = 5; // digital (pwm) in
int PotLi = 4; // analog out
int PotSoll = 0; // analog out
//int PotKp = 1; //Poti I-anteil
//int PotKi = 2; //Poti p-Anteil
//int PotKd = 3; //Poti d-Anteil
double pwm;
void setup()
{
pinMode(MotorENB, OUTPUT);
pinMode(MotorRechts, OUTPUT);
pinMode(MotorLinks, OUTPUT);
Serial.begin(9600);
myPID.SetMode(AUTOMATIC);
}
void loop()
{
Input = analogRead(PotLi); // 115-983
Setpoint = analogRead(PotSoll); // 0-1023
Setpoint = Setpoint/1023*13.5; // Wird in cm umgerechnet
Input = (Input - 126)/803 *13.7; // Wird in cm umgerechnet
Input = abs(Input - 13.7);
e = Setpoint-Input;
Serial.print(millis());
Serial.print("; Ist: ");
Serial.print(Input);
Serial.print(" cm ; Soll: ");
Serial.print(Setpoint);
Serial.println(" cm ,");
myPID.Compute();
pwm = abs(Output);
if(e > 0)
{
myPID.SetControllerDirection(DIRECT);
forward(pwm);
}
if(e < 0)
{
myPID.SetControllerDirection(REVERSE);
backward(pwm);
}
}
void forward(double pwm)
{
digitalWrite(MotorLinks, LOW);
digitalWrite(MotorRechts, pwm);
digitalWrite(MotorENB, HIGH);
}
void backward(double pwm)
{
digitalWrite(MotorRechts, LOW);
digitalWrite(MotorLinks, pwm);
digitalWrite(MotorENB, HIGH);
}
Fazit
Im Laufe dieses Projektes konnten neue Erfahrungen aus der Regelungstechnik gesammelt werden. Es hat sich auch gezeigt, dass es manchmal nicht so einfach das theoretische Wissen in der Praxis umzusetzen ist. Das Projekt ist nicht abgeschlossen, da aus zeitlichen Gründen nicht alle Regelansätze untersucht und nicht alle Erwartungen aus der Aufgabenstellung an das Projekt erfüllt werden konnten.
Quellen
→ zurück zum Hauptartikel: Fachpraktikum Elektrotechnik (WS 14/15)