Projekt 40: Regelung eines fertigen Laborversuchsaufbaus "Lageregelung"
Autoren: Martins, Raza
Betreuer: Prof. M. Göbel
Aufgabe
Entwurf eines Reglers für einen mechanisch und elektrisch fertigen Laborversuch.
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 (2-Punkt, 3-Punkt, P, I, D), Darstellung der Soll-/Istgrößen.
- Programmiersprache: C
- Test und wiss. Dokumentation
- Live Vorführung während der Abschlusspräsentation
Schwierigkeitsgrad
Anspruchsvoll (***)
Einleitung
Dieses Projekt wurde im Rahmen des Elektrotechnikfachpraktikums angeboten und von mir ausgewählt. Die Hauptaufgabe des Projektes besteht darin, einen Regler softwaremäßig zu entwickeln, der am besten für dieses System geeignet ist. Dabei soll das Verhalten verschiedener Regeltypen untersucht und verglichen werden.
Ablauf des Projektes
Im Folgenden ist das Gantt-Diagramm dargestellt. Das Diagramm zeigt den zeitlichen Ablauf des Projektes.
Beschreibung des Versuchsaufbaus
In Abbildung 2 ist die schematische Darstellung des Versuchsaufbaus dargestellt.
Mithilfe des Servomotors 1, der in beiden Richtungen betrieben werden kann, wird die Kugelgewindespindel 2 in die Rotationsbewegung gebracht. Die Rotationsbewegung der Gewindespindel soll den Schlitten 3 in die gew¨unschte Position entlang der Spindelachse bringen. Die aktuelle Position des Schlittens wird mithilfe des Positionssensors (Linearpotentiometer) 4 ermittelt. Für die Betreibung des Versuchsaufbaus sind zwei Spannungsquellen erforderlich. Mithilfe der ersten Quelle werden Sensoren versorgt, während die zweite Quelle die Versorgung für den Motor sicherstellt. Das System wird mithilfe des Arduino-Boards angesteuert. Der Arduino-Board soll mit dem PC verbunden werden, da die Spannungsversorgung des Arduinos durch USB-Anschluss erfolgt.
In der Tabelle 1 ist die Pinbelegung von den verwendeten Pins dargestellt:
Pin an Arduino Uno | Pin/Bezeichnung an dem Laborversuchsaufbau | |
---|---|---|
1 | A0 | Poti - "Sollwert" |
2 | A1 | Poti - "P-Anteil" |
3 | A2 | Poti - "I-Anteil" |
4 | A3 | Poti - "D-Anteil" |
5 | A4 | Poti - Linear |
6 | 3 (PWM) | Motor rechts (an der H-Br?ucke Schaltung) |
7 | 4 (PWM) | Motor ENB (an der H-Br?ucke Schaltung) |
8 | 5 (PWM) | Motor links (an der H-Br?ucke Schaltung) |
Ersatz des defekten Bauteils
Bei den ersten Versuchen den Programmkode auszuführen, hat der Servomotor keine Reaktionen gezeigt. Nach der genaueren Untersuchung und in Absprache mit dem betreuenden Professor hat sich herausgestellt, dass der L298N Motortreiber beschädigt ist. Der L298N Motortreiber ist eine H-Brücke Schaltung, siehe Abbildung 3, die für die Motoransteuerung zuständig ist. Diese Schaltung wurde von mir ausgetauscht. Die Ursache für die Funktionsbeeinträchtigung des Motortreibers ist unklar geblieben.
Realisierung
Im Folgenden wird die Realisierung des Projektes beschrieben.
Regelkreis
In Abbildung 4 ist der Entwurf des Regelkreises des Systems dargestellt. Mithilfe des Potentiometers (Potiwert) an dem Versuchsaufbau wird der Soll-Wert eingestellt. Arduino Board gilt als Regler. Die Regelstrecke ist hier der Servomotor, die Kugelgewindespindel und der PWM-Signal. Der Ist-Wert wird mithilfe des Positionssensors (Potentiometer) ermittelt.
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.
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)