Projekt 40: Regelung eines fertigen Laborversuchsaufbaus "Lageregelung": Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 28: Zeile 28:




==Einleitung==
==Aufgabenstellung==
 
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.


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.




Zeile 38: Zeile 38:


==Ablauf des Projektes==
==Ablauf des Projektes==
Im Folgenden ist das Gantt-Diagramm dargestellt. Das Diagramm zeigt den zeitlichen
Ablauf des Projektes.
[[Datei:Ablauf.jpg|800px|thumb|center|Abbildung 1: Ablauf des Projektes]]




Zeile 50: Zeile 45:
==Beschreibung des Versuchsaufbaus==
==Beschreibung des Versuchsaufbaus==


[[Datei:Versuchsaufbau.jpg|500px|thumb|right|Abbildung 2: Schematische Darstellung des Versuchsaufbaus ]]
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.
In Abbildung 2 ist die schematische Darstellung des Versuchsaufbaus dargestellt.
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.
 
Mithilfe des Servomotors , der in beiden Richtungen betrieben werden kann, wird
die Kugelgewindespindel  in die Rotationsbewegung gebracht. Die Rotationsbewegung
der Gewindespindel soll den Schlitten  in die gew¨unschte Position entlang der
Spindelachse bringen. Die aktuelle Position des Schlittens wird mithilfe des Positionssensors
(Linearpotentiometer) 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.
 
 
1. Servomotor
 
2. Kugelgewindespindel
 
3. Schlitten
 
4. Positionssensor (Linearpotentiometer)
 
 
 
In der Tabelle 1 ist die Pinbelegung von den verwendeten Pins dargestellt:
 
 
{|width=50% border="2" cellpadding=10px align=center style = "background:rgb(230,240,230);color:rgb(0,0,0)"
|+ Tabelle 1: Pinbelegung
!
! 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-Brucke Schaltung)
|-
! 7
|4 (PWM)
| Motor ENB (an der H-Brucke Schaltung)
|-
! 8
|5 (PWM)
| Motor links (an der H-Brucke Schaltung)
|}
 
==Ersatz des defekten Bauteils==
 
 
 
[[Datei:L298N.jpg|200px|thumb|right|Abbildung 3: L298N <ref>[http://www.amazon.com/Generic-Module-Stepper-Controller-Arduino/dp/B00HHYBW0E]
www.amazon.com/Generic-Module-Stepper-Controller-
Arduino/dp/B00HHYBW0E, abgerufen am 20.01.2015, 10:39</ref>]]
 
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.
 
 
 
 
 
 
 
 
 
 
 
 





Version vom 27. Januar 2016, 18:57 Uhr


Autoren: Madleine Kahr, Adam Fankhauser
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 (***)



Aufgabenstellung

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.



Ablauf des Projektes

Beschreibung des Versuchsaufbaus

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.


Realisierung

Im Folgenden wird die Realisierung des Projektes beschrieben.


Regelkreis

Abbildung 4: 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:

Abbildung 5: Sprungantwort PI-Regler

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)