it-swarm.com.de

Programmieren von PID-Schleifen in C.

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

PID loop image from 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.

11
Jedi Engineer

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 anstelle von 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 Kurier einfach lieben, Schriftart mit fester Breite)

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 von diese 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:

Unter der Annahme, dass die Laufzeit der Schleife klein genug ist (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 fand this exzellenten Code für PID in C, obwohl er nicht jeden Aspekt davon abdeckt, es ist trotzdem ein guter.

//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 des dt >>> -Codes 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.

18
D34dman