Forum: Mikrocontroller und Digitale Elektronik PID-Regelung im open-loop?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Karl-alfred R. (karl-alfred_roemer)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

in der PID-Library für Arduino
gibt es ein Code Beispiel, in dem PID-Regelung scheinbar ohne Feedback, 
also Open-Loop verwendet wird. Macht das überhaupt Sinn?

Hier der Link zum Beispiel-Code: 
http://playground.arduino.cc/Code/PIDLibaryBasicExample

Danke und viele Grüße
Karl

von Waldemar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Es ist "closed-Loop", das Feedback ist das Poti welches per Hand 
gesteuert wird. Die PID-Lib generiert ein Tastverhältnis / Dutycycle um 
die Änderung die durch das Poti vorgegeben wird auszugleichen.
Im Prinzip ist dieses Beispiel in Betracht der PID-Regelung Mist. Es 
generiert einfach eine PWM mit Dutycycle anhand des Eingestellten Wertes 
des Potis.

Poti-ADC 0...1023
Dutycycle 0...100% (mit mir unbekannter Frequenz)

Gruß

von Waldemar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ps. steht sogar im Code-Schnippsel:
"Reading analog input 0 to control analog PWM output 3"

von Info (Gast)


Bewertung
1 lesenswert
nicht lesenswert

von MaWin (Gast)


Bewertung
3 lesenswert
nicht lesenswert
Das Beispiel ist natürlich Unsinn. Es hat mit einer PID-Regelung nichts 
zu tun. Es ist lediglich eine Filterung des Eingangs.
Man kann sich auch ein Loch ins Knie bohren, eine Erbse reinwerfen und 
als Trillerpfeife nutzen. Einen Sinn ergibt es trotzdem nicht.

von Harald W. (wilhelms)


Bewertung
1 lesenswert
nicht lesenswert
Karl-alfred R. schrieb:

> Es gibt es ein Code Beispiel, in dem PID-Regelung scheinbar ohne Feedback,
> also Open-Loop verwendet wird.

Eine Regelung ist nur dann eine Regelung, wenn eine
Rückkopplung über das Ausgangssignal der Schaltung
vorliegt. Ansonsten handelt es sich um eine Steuerung.
Streng genommen ist auch der "Lautstärkeregler" am
Radio kein Regler, sondern ein Steller. Allerdings gibt
es hier eine Rückkopplung über den hörenden Menschen.
Andererseits sind die meisten NF-Verstärker Regler, da
sie auf eine konstante Verstärkung unabhängig von der
Betriebsspannung geregelt werden.

von Falk B. (falk)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
@Karl-alfred Römer (karl-alfred_roemer)

>gibt es ein Code Beispiel, in dem PID-Regelung scheinbar ohne Feedback,
>also Open-Loop verwendet wird.

Das Beispiel ist maximaler Unsinn und wahrscheinlich auch nie getestet, 
nur einfach hingeschrieben.

> Macht das überhaupt Sinn?

Nein!

>Hier der Link zum Beispiel-Code:
>http://playground.arduino.cc/Code/PIDLibaryBasicExample

Die Knalltüten hätten einen Servo nehmen sollen, dort kann man die Soll- 
und Ist-Position schön über einen Poti darstellen (einer am Servo, einer 
vom Menschen bedient).

Das vermukste Beispiel sieht so aus, siehe Anhang. Das KANN nicht 
funktionieren, schon gar nicht mit I-Anteil!

von aSma>> (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Karl-alfred R. schrieb:
> in der PID-Library für Arduino
> gibt es ein Code Beispiel, in dem PID-Regelung scheinbar ohne Feedback,
> also Open-Loop verwendet wird. Macht das überhaupt Sinn?

Mit Verlaub und entgegen Anderer, ja es macht Sinn aber nur bei einer 
Sprungantwort (Systemidentifikation).

von Karl-alfred R. (karl-alfred_roemer)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Eure vielen Antworten!

Das mit der Sprungantwort kann ich zum Teil nachvollziehen. Also dass 
man mit geschickter Wahl der Parameter den Zielwert möglichst schnell 
erreicht ohne zu überschwingen.  Aber so richtig 'geregelt' wird da ja 
eigentlich nichts.

von Falk B. (falk)


Bewertung
1 lesenswert
nicht lesenswert
@Karl-alfred Römer (karl-alfred_roemer)

>erreicht ohne zu überschwingen.  Aber so richtig 'geregelt' wird da ja
>eigentlich nichts.

Baus doch einfach mal auf und miss!!! Das Ding wird jeweils in die Ecke 
rennen, je nachdem ob der Wert vom Poti über oder unter dem Setpoint 
liegt.

von MaWin (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Karl-alfred R. schrieb:
> Aber so richtig 'geregelt' wird da ja
> eigentlich nichts.

Nein wie auch.
Es wird auch nicht funktionieren, wenn ein I-Anteil ungleich 0 vorhanden 
ist.

von THOR (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Falk B. schrieb:
> Das vermukste Beispiel sieht so aus, siehe Anhang. Das KANN nicht
> funktionieren, schon gar nicht mit I-Anteil!

Vielleicht sind I-und D-Anteil gleich groß, dann funktioniert das 
Beispiel solange bis die I-Variable überläuft :P

von Falk B. (falk)


Bewertung
1 lesenswert
nicht lesenswert
http://playground.arduino.cc/Code/PIDLibrary

Hmm, wenn man mal in den Quältext schaut, findet man auch schon den 
ersten Fehler.
1
bool PID::Compute()
2
{
3
   if(!inAuto) return false;
4
   unsigned long now = millis();
5
   unsigned long timeChange = (now - lastTime);
6
   if(timeChange>=SampleTime)
7
   {
8
      /*Compute all the working error variables*/
9
    double input = *myInput;
10
      double error = *mySetpoint - input;
11
      ITerm+= (ki * error);
12
      if(ITerm > outMax) ITerm= outMax;
13
      else if(ITerm < outMin) ITerm= outMin;
14
      double dInput = (input - lastInput);
15
 
16
      /*Compute PID Output*/
17
      double output = kp * error + ITerm- kd * dInput;
18
      
19
    if(output > outMax) output = outMax;
20
      else if(output < outMin) output = outMin;
21
    *myOutput = output;
22
    
23
      /*Remember some variables for next time*/
24
      lastInput = input;
25
      lastTime = now;
26
    return true;
27
   }
28
   else return false;
29
}

> double dInput = (input - lastInput);

>      /*Compute PID Output*/
>      double output = kp * error + ITerm- kd * dInput;

Das mit dem D-Anteil stimmt nicht.

von Horst (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
>> double dInput = (input - lastInput);
>
>>      /*Compute PID Output*/
>>      double output = kp * error + ITerm- kd * dInput;
>
> Das mit dem D-Anteil stimmt nicht.
1
double output = kp * error + ITerm (+) kd * dInput;

so besser?

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Horst schrieb:
> so besser?

nein. D bezieht sich auch auf E.

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@Horst (Gast)

>double output = kp * error + ITerm (+) kd * dInput;

>so besser?

Nur zum Teil.

Eher so.

1
bool PID::Compute()
2
{
3
   if(!inAuto) return false;
4
   unsigned long now = millis();
5
   unsigned long timeChange = (now - lastTime);
6
   if(timeChange>=SampleTime)
7
   {
8
      /*Compute all the working error variables*/
9
      double error = *mySetpoint - *myInput;
10
      double dError = (error - lastError);
11
12
      ITerm += (ki * error);
13
      if(ITerm > outMax) ITerm= outMax;
14
      else if(ITerm < outMin) ITerm= outMin;
15
16
      /*Compute PID Output*/
17
      double output = kp * error + ITerm + kd * dError;
18
      
19
      if(output > outMax) output = outMax;
20
      else if(output < outMin) output = outMin;
21
      *myOutput = output;
22
23
      /*Remember some variables for next time*/
24
      lastError = error;   
25
      lastTime = now;
26
      return true;
27
   }
28
   else return false;
29
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.