Implementierung von D (Differenzierung) in PID

8

Ich implementiere einen PID-Regler zur Motordrehzahlregelung. Ich bin mit der Implementierung der PI-Steuerung fertig und sie funktioniert für mich einwandfrei. In der Spezifikation wurde mir gesagt, dass ich eine Filtertechnik implementieren soll, indem ich die folgende Gleichung für den D-Teil verwende:

Geben Sie hier die Bildbeschreibung ein

Nun , was ich so weit zu verstehen, ist , dass srepräsentiert im "dx/dt"Allgemeinen der mit der Änderungsrate des Fehlers entspricht, aber hier habe ich es mit der Änderungsrate des Feedbacks beziehen kann. Td/Ndient zur Begrenzung der Gesamtverstärkung (ich hoffe, ich habe das richtig verstanden). Um dies nun in Form von C-Code darzustellen, habe ich Folgendes versucht:

        s = (CurrentFeedback()-Old_Feedback)*100/(MaxFeedback()); //to calculate the % change in feedback
        s = s*1000/sampleTime;      //1000 is multiplied because sampleTime is in milliseconds
        D = (Td*s)/(1+(s*Td/N));
        D = D*KP;   //Kp is multiplied as per the standard pid equation.

        Old_Feedback = CurrentFeedback();
        PID = P+I-D;

Nun, die Ergebnisse durch Hinzufügen von D sind nicht das, was ich vorhergesagt habe. Ich möchte nur wissen, ob ich die D-Teilungsgleichung richtig implementiert habe. Mache ich Fehler in meinem Verständnis der grundlegenden Mathematik der Differenzierung?

HINWEIS: Es steht mir nicht frei, die Neuberechnung von kp, ti, td zu ändern, da diese direkt vom VFD stammt.

spp
quelle
Versuchen Sie embedded.com/design/prototyping-and-development/4211211/… , "PID ohne Promotion". Es gibt einen klaren Abschnitt über die Implementierung von Derivaten.
Scott Seidman
2
Wenn Sie Old_Feedback = CurrentFeedback () deklarieren, ist dies falsch. Sie sollten den Wert mit CurrentFeedback () lesen und in temp speichern. Variable CurrentFeedback_tmp, verwenden Sie diesen Wert dann jedes Mal in diesem ISR, da jedes Mal, wenn Sie ein fct CurrentFeedback () aufrufen, der tatsächliche Wert abgerufen wird, der bei jedem Abrufen anders ist.
Marko Buršič
"Die Ergebnisse durch Hinzufügen von D sind nicht das, was ich vorhergesagt habe" - was haben Sie vorhergesagt? Warum sind sie anders?
Greg d'Eon
Hier besteht ein großes Potenzial für ganzzahlige Überläufe. Was sind die Typen der beteiligten Variablen und haben Sie deren Maximalwerte berücksichtigt?
Lundin
s, D ist S32, KP, Td und N U16. Die Abtastzeit ist U32. Ich habe die Maximalwerte der Variablen gemäß dem maximal möglichen Wert bestimmter Datentypen berücksichtigt.
spp

Antworten:

1

Ich habe 3 Punkte zu teilen:

1-Ich werde Ihnen sagen, warum Menschen mit D-Term-Zwischenzeichen des Vorzeichens herumspielen, PID = P + I + D, aber D = kd * (Fehler-Fehler), und in der Positionssteuerung, wenn Sie sich dem Sollwert nähern, ist immer ein älterer Fehler <Fehler, so dass der D-Term negativ ist, und somit die Ausgabe verringert und das Überschwingen verhindert.

2-In Bezug auf die Zeit nicht teilen oder Zeit verwenden. Da Sie einen eingebetteten Mikrocontroller verwenden, erstellen Sie einfach eine Zeitkonstante und löschen Sie sie aus allen Gleichungen: Verwenden Sie beispielsweise einen Timer-Interrupt, um eine Zeitkonstante von 1 ms zu generieren und Ihre Funktion darin aufzurufen.

3-Warum Sie PID für die Geschwindigkeitsregelung verwenden, 90% der Zeit PI reicht für die Geschwindigkeitsregelung aus, da D hier eher einer Beschleunigungsregelung ähnelt.

Ich hoffe, das hilft

ElectronS
quelle