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.