Programmieren von PID-Schleifen in C.

11

Ich bin ein Elektrotechniker, der in die digitale Welt hineingestoßen ist und dabei lernt. Ich programmiere einen TI-Prozessor für eine PID-Schleife (Proportional-Integral-Derivative) , die in diesem Diagramm dargestellt ist:

PID-Schleifenbild aus Wikipedia

Ich werde es auch beschreiben:

Operationsverstärker mit negativer Rückkopplung, mit nicht invertierendem Anschluss geerdet. Eingang über Minuspol. Die Rückkopplungsschleife ist eine RE-Reihenschaltung parallel zu einem Widerstand und alles parallel zu einer Kappe.

Hat jemand eine Idee, wie man diese Schaltung in C-Code konvertiert? Ich bin ein bisschen außer meinem Element und könnte die Hilfe gebrauchen.

Jedi-Ingenieur
quelle
Sie können einen Link zu einem Bild erstellen, und jemand wird diesen Link hilfreich in ein tatsächliches Bild für Sie umwandeln.
Joachim Sauer
2
Der Link, den Sie selbst gepostet haben, bietet einen grundlegenden Pseudocode, um dies zu tun. Wenn Ihnen C # nichts ausmacht, finden Sie hier ein Beispiel für eine PID-Schleife in C # .
Neil
1
Neil hat recht. Ich habe fast genau diese Schleife in C auf TI implementiert. Ein Hinweis: Verwenden Sie eine konstante Zeitschleife und faktorisieren Sie die Fixierung dtin die Konstanten, anstatt zusätzliche Teilungen und Multiplikationen in der Schleife durchzuführen.
AShelly
1
@Neil, das war ein Link, den ich in Revision 2 hinzugefügt habe, weil ich nicht wusste, was ein PID-Regelkreis ist, und ich vermutete, dass viele andere dies auch nicht taten.
@ MichaelT, ah, ich entschuldige mich dann.
Neil

Antworten:

18

Die Rennbahn

Ok, ich habe gerade ein Konto hier erstellt, als ich diese Frage sah. Ich kann Ihre Frage nicht bearbeiten, damit ich den Tippfehler korrigieren kann, den Sie gemacht haben. Ich glaube, Sie meinten RC-Serienschaltung parallel statt RE (wenn ja, habe ich keine Ahnung, was das bedeutet)

Die analoge Schaltung, die Sie mit C simulieren möchten, sieht ungefähr so ​​aus

                         Ci
                  |------| |--------------|
                  |           Rp          |
                  |----/\/\/\/\-----------|
                  |          Rd    Cd     |
           Rf     |----/\/\/\---| |-------|
Vin o----/\/\/\---|                       |
                  |    |\                 |
                  |    | \                |
                  |----|- \               | 
                       |   \              |
                       |    \-------------|---------o  Vout
                       |    /
                       |   /
                       |+ /
                   ----| /
                  |    |/
                  |
                  |
               ___|___ GND
                _____
                 ___
                  _

LEGEND:
  Vin is the input signal.
  Vout is the Output.
  Rp controls the propotional term ( P in PID) 
  Ci controls the Integral term ( I id PID)
  Rd and Cd controls the differential term ( D in PID)
  Rf is the gain control, which is common to all of the above controllers.

(Ich konnte meinem Drang, dies zu zeichnen, nicht widerstehen, da ich Ihnen erzählen wollte, wie Elektro- / Elektronikingenieure in Foren und E-Mails ohne Bilder kommunizierten ... und warum wir Kurierschriftarten mit fester Breite einfach lieben.)

Ich muss gestehen, dass die von Ihnen verwendete Schaltung einfach einzurichten ist, aber mathematisch sehr komplex ist, wenn es darum geht, die Propotional-, Integral- und Derivativkonstanten des Systems individuell auf einen gewünschten Wert abzustimmen. Dies ist nicht möglich.

Ich empfehle dringend, dass Sie die Schaltung aus dieser Quelle zum Lernen verwenden.

Obwohl das Einrichten etwas mühsam ist, ist es mathematisch viel einfacher zu analysieren, da Sie es direkt auf die mathematische Standardform anstatt auf die ideale beziehen können.

Zuletzt steuert der Vout einen Motor oder was auch immer gesteuert werden muss. Und Vin ist die variable Prozessspannung.

Bevor Sie Ihre Füße in C (Meer?) Nass machen

Ich gehe davon aus, dass Sie die Signale von einem Analog-Digital-Wandler lesen. Wenn nicht, müssten Sie das Signal als Eingang simulieren.

Wenn wir das Standardformular verwenden, haben wir

Angenommen, die Laufzeit der Schleife ist klein genug (ein langsamer Prozess), können wir die folgende Funktion zur Berechnung der Ausgabe verwenden:

output = Kp * err + (Ki * int * dt) + (Kd * der /dt);

wo

Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int  = int from previous loop + err; ( i.e. integral error )
der  = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.

wobei anfänglich 'der' und 'int' Null wären. Wenn Sie eine Verzögerungsfunktion im Code verwenden, um die Schleifenfrequenz auf 1 kHz abzustimmen, beträgt Ihr dt 0,001 Sekunden.

Zeichnung in C.

Ich habe diesen hervorragenden Code für PID in C gefunden, obwohl er nicht jeden Aspekt abdeckt, aber dennoch gut ist.

//get value of setpoint from user
while(1){
  // reset Timer
  // write code to escape loop on receiving a keyboard interrupt.
  // read the value of Vin from ADC ( Analogue to digital converter).
  // Calculate the output using the formula discussed previously.
  // Apply the calculated outpout to DAC ( digital to analogue converter).
  // wait till the Timer reach 'dt' seconds.
}

Wenn wir einen langsamen Prozess ausführen, können wir eine niedrigere Frequenz verwenden, sodass die Ausführungszeit für dt >>> Code für eine einzelne Schleife (weitaus größer als) ist. In solchen Fällen können wir den Timer abschaffen und stattdessen eine Verzögerungsfunktion verwenden.

D34dman
quelle
6
Das Ascii-Diagramm hat mich umgehauen. +1
l46kok
1
Link "diese Quelle" funktioniert nicht
Ccr
Es tut mir leid zu hören, dass eine gute Ressource verloren gegangen ist :(. Nun, das Konzept wurde in dem von mir freigegebenen Beispielcode für die while-Schleife erklärt. Ich habe keine Erfahrung im Umgang mit dieser Situation, vielleicht können einige Redakteure das Problem beheben richtige Nachricht. (der tote Link)
D34dman
2
Die fehlende "diese Quelle" könnte hier verfügbar sein: Educypedia.karadimov.info/library/piddocs.pdf
David Suarez