INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
PID ohne Library
28.04.2016, 15:09
Beitrag #1
PID ohne Library
Moin zusammen,

da ich momentan einen Linienfolger Roboter mit einem QTR-8A von Pololu und eine Temperaturregelung für Teile eines 3D-Druckers (Nicht Hotend und nicht Heiztbett) baue und Programiere, kommt man natürlich nicht um PID drum herum.

Da ich PID allgemein verstehen will, möchte ich nicht auf die Library zurück greifen.

Beispielcode habe ich noch nicht wirklich, will auch keinen fertigen Code o.ä.

Momentan Regle ich einen Lüfter mit map(); aber das finde ich ziemlich blöd. Ich nutze es wie folgt: map(temperatur, 30, 70, 0, 255);.

Ich finde die Lösung ist sehr einfach und naja.. Tut seinen Job auch, aber damit kann ich mich nicht zufrieden geben.

Die Softwareformel für den PID kenne ich, verstehe ich aber absolut nicht:

Code:
esum = esum + e
y = Kp * e + Ki * Ta * esum + Kd * (e – ealt)/Ta
ealt = e

Dann dachte ich, nunja, der PID Regler ist so kompliziert, da kann man ja auf PD oder PI zurück greifen, reichen würden sie, allerdings wieder das selbe Problem:

PD
Code:
y = Kp * e + Kd * (e – ealt)/Ta
ealt = e

PI
Code:
esum = esum + e
y = Kp * e + Ki * Ta * esum

Meine fragen sind jetzt... Wie definiere ich die Variablem?

Kp, Ki, Kd sind mir klar, das ist ja einstellungssache.

Aber e, esum, ealt und Ta.

Wie kann ich Ta definieren? Messe ich das mit millis() ?

Meine erste überlegung dazu war so:
Code:
int e = 0;
int ealt = 0;
int esum = 0;
int sollTemp2 = 60; // 60 grad
int isttemp2 = 0;
int Kp = 1;
int Ki = 1;
int Kd = 1;
int Ta = 0;
int fanSpeed2 = 0;

void setup()
{
  // put your setup code here, to run once:

}

void loop()
{
  e = sollTemp2 - istTemp2
  esum = esum + e;
  fanSpeed2 = Kp * e + Ki * Ta * esum
}

Den Code habe ich einfach mal eingetippt wie mein gedankengang gerade war.

Beim Linienfolger bekomme ich dank Library von Pololu einen Kalibrierten Wert von 3500 wenn der Sensor mittig auf der Schwarzen Linie fährt. Keine Linie gibt dann 7000 aus, und komplett schwarz gibt 0 aus. Also müsste ich irgendwie mit den differenzen von 3500 ins + und - die abweichungen für den PID nutzen.

Mir fehlen irgendwie die Ansätze, zu wissen wie ich die Variablen, falls nötig, ermitteln muss, bzw wie ich sie definiere, wie ich sie abhängig mache?

Wäre froh wenn ich hilfe bekommen würde Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.04.2016, 17:13
Beitrag #2
RE: PID ohne Library
Hallo MeisterQ,

habe mal ein bisschen quergelesen.
Ta ist die Zeit zwischen zwei Messungen. Ta = 0.1 bedeutet wohl 10 Messungen pro Sekunden. Kann man über millis() - Differenz prüfen.
"e" ist die Differenz zwischen Soll und Ist, also die Abweichung. "esum" daher wohl die Summe der Abweichungen. "ealt" dann wohl die letzte Abweichung.
Vielmehr kann ich auch nicht sagen Huh

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.04.2016, 17:25
Beitrag #3
RE: PID ohne Library
Hm, Also kann ich Ta eigentlich weg lassen, weil das sich mit dem Programcycle eigentlich deckt, wenn man z.b. einen 100ms delay einbaut?. Wäre ja dann eh nur x 1 genommen?

Code:
x = analogRead(A0);
  x = map(x, 0, 1023, 0, 255);                  // anpassen der Regelgröße 1024->255
  e = w  -x ;                //bilden der Regeldifferenz
  esum = esum + e;
  y = (Kp*e) + (Ki*esum*Ta);            
    if (y >254)  
      {
        y = 255;
      }
      if (y < 0)
      {
        y = 0;
      }
  
  Serial.print(x);            
  Serial.print("; ");
  Serial.print(y);
  Serial.println(" ");
delay(100);                //entspricht der Abtastzeit

So gibt er mir schon zumindest brauchbare werte raus, wenn ich auf A0 einen Poti einlese und die Analogwerte vom Poti und die PID werte ausgeben lasse.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.04.2016, 20:27
Beitrag #4
RE: PID ohne Library
Hallo MeisterQ,
Zitat:wenn man z.b. einen 100ms delay einbaut?.
naja, kommt ein wenig darauf an was du sonst noch in deinem Code so tust.
delay() schaltet etliches an Komponenten des arduino für die angegebene zeit abHuh
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.04.2016, 21:22
Beitrag #5
RE: PID ohne Library
(29.04.2016 20:27)rkuehle schrieb:  Hallo MeisterQ,
Zitat:wenn man z.b. einen 100ms delay einbaut?.
naja, kommt ein wenig darauf an was du sonst noch in deinem Code so tust.
delay() schaltet etliches an Komponenten des arduino für die angegebene zeit abHuh
Grüße Ricardo

...delay...richtig, die Alternative wäre die verstrichene Zeit zwischen den Reglerberechnungen in die Gewichtung des Ergebnises mit einzubeziehen. Dann kann das Programm noch so umfangreich sein...die Werte passen dann einfach...so die Theorie.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.05.2016, 09:23
Beitrag #6
RE: PID ohne Library
Der delay stört erstmal nicht. Kann man ja anders lösen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  C++ Library Datenübergabe Problem jose_ph 9 442 08.05.2018 14:10
Letzter Beitrag: Tommy56
  Library Tellen 8 403 01.05.2018 13:31
Letzter Beitrag: Tellen
  Leds dimmen ohne delay jennerlein 9 627 20.04.2018 02:04
Letzter Beitrag: Corvus
  Arduin Radio Head Library driver Probleme gandalf7588 3 453 08.04.2018 13:05
Letzter Beitrag: gandalf7588
  Adresse MCP23008 mit Library? DL1AKP 5 270 29.03.2018 13:07
Letzter Beitrag: DL1AKP
  Struct mit Defaultdaten ohne initalisieren nutzen? da_user 14 582 22.03.2018 19:11
Letzter Beitrag: da_user
  Ucglib Library Problem Bully 26 1.196 05.03.2018 18:47
Letzter Beitrag: Tommy56
  Library math.h Tellen 6 450 16.02.2018 23:07
Letzter Beitrag: Tellen
  Verständnisprobleme bei der Bounce2.h library Flap 1 261 07.02.2018 20:47
Letzter Beitrag: rkuehle
  Buzzer ohne Delay Harry 9 812 23.01.2018 12:30
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste