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
  Library unter Linux Mint installieren atmel900 1 93 22.11.2016 14:12
Letzter Beitrag: rkuehle
  Dallas Temp Library und LiquidCrystal_i2c relay 20 467 27.10.2016 12:20
Letzter Beitrag: hotsystems
  Problem mit SD Card Library BennIY 4 193 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library) avoid 4 382 05.06.2016 14:16
Letzter Beitrag: avoid
  [Suche] Library Programmierer/in für privates Projekt avoid 8 578 19.05.2016 15:01
Letzter Beitrag: avoid
  nur ein URL aufruf ohne PHP toto1975 3 607 05.04.2016 08:26
Letzter Beitrag: iks77
  Problem mit Pin Change Interrupt in Library Retian 0 321 10.02.2016 23:37
Letzter Beitrag: Retian
  433 MHZ RCSwitch Library Frage Marc2014 5 712 11.01.2016 16:28
Letzter Beitrag: hotsystems
  Library - Variable in Memberfunktion Scheams 1 408 10.01.2016 22:40
Letzter Beitrag: Rene
  Rampe ohne Delay DC-Motor de_flexus 3 1.944 22.11.2015 13:07
Letzter Beitrag: frank2000

Gehe zu:


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