Implementierung von D (Differenzierung) in PID

Ich implementiere einen PID-Regler zur Motordrehzahlregelung. Ich bin mit der Implementierung der PI-Regelung 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

Was ich bisher verstanden habe, ist, dass dies im Allgemeinen der Änderungsrate des Fehlers entspricht, aber hier kann ich es mit der Änderungsrate der Rückkopplung in Beziehung setzen s. dient zur Begrenzung der Gesamtverstärkung (ich hoffe, ich habe das richtig verstanden). Um dies nun in C-Code darzustellen, habe ich Folgendes versucht:"dx/dt"Td/N

        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-Anteil-Gleichung richtig implementiert habe? Mache ich irgendwelche 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 sie direkt vom VFD kommt.

Versuchen Sie embedded.com/design/prototyping-and-development/4211211/… , „PID ohne PhD“. Es gibt einen klaren Abschnitt über die Implementierung von Derivaten.
Wenn Sie Old_Feedback = CurrentFeedback() deklarieren, ist dies falsch. Sie sollten den Wert mit CurrentFeedback() lesen und in temp speichern. Variable CurrentFeedback_tmp, dann verwenden Sie diesen Wert überall in dieser ISR, denn jedes Mal, wenn Sie eine Funktion CurrentFeedback() aufrufen, erhält sie den tatsächlichen Wert, der bei jedem Abruf anders sein wird.
"Die Ergebnisse durch Hinzufügen von D sind nicht das, was ich vorhergesagt habe" - was haben Sie vorhergesagt? Warum sind sie anders?
Hier besteht ein großes Potenzial für Integer-Überläufe. Was sind die Typen der beteiligten Variablen und haben Sie deren Maximalwerte berücksichtigt?
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.
Warum machen Sie P+ID? wurde das Zeichen für D irgendwo vertauscht? Ich hätte erwartet, dass der D-Term zum Ergebnis addiert und nicht subtrahiert wird. Können Sie den Zeitraum Ihrer Verarbeitungs- und Erfassungsschleife festlegen? Es macht das Leben viel einfacher, wenn Sie zu einer festen Rate proben können. Auch wenn Ihre Abtastzeit in Millisekunden ist, sollten Sie nicht durch 1000 teilen, um Sekunden zu erhalten?
Ich kann nicht teilen, da mein Gerät keine Fließkommazahlen unterstützt. Also multipliziere ich den Zähler mit 100, das können Sie im Code sehen. Im ersten Punkt haben Sie Recht, es sollte P + I + D sein. Ich denke, es gab ein Problem bei der Implementierung der Gleichung. Ich werde die Antwort in ein paar Tagen posten, sobald ich mit dem Testen meines Codes fertig bin

Antworten (1)

Ich habe 3 Punkte zu teilen:

1-Ich werde Ihnen sagen, warum Leute mit D-Begriffen in Bezug auf Vorzeichen herumspielen, PID = P + I + D, aber D = kd* (Fehler -alter Fehler) und in der Positionsregelung, wenn Sie sich dem Sollwert nähern, immer alter Fehler ist < Fehler, so dass der D-Term negativ ist und somit die Ausgabe verringert und das Überschwingen verhindert.

2-In Bezug auf die Zeit, teilen oder verwenden Sie die Zeit nicht. Da Sie einen eingebetteten Mikrocontroller verwenden, verwenden Sie einfach eine Zeitkonstante und streichen Sie sie aus allen Gleichungen: Verwenden Sie beispielsweise einen Timer-Interrupt, um eine Zeitkonstante von 1 ms zu erzeugen, und rufen Sie Ihre Funktion im Inneren auf.

3-Warum Sie PID für die Geschwindigkeitsregelung verwenden, 90% der Zeit reicht PI bei der Geschwindigkeitsregelung aus, da D hier eher wie eine Beschleunigungsregelung ist.

Ich hoffe, das hilft