PIDでのD(差別化)の実装


8

モーター速度制御用のPIDコントローラーを実装しています。PIコントロールの実装が完了しましたが、これは完全にうまく機能します。仕様では、D部分に次の方程式を使用してフィルタリング手法を実装するように指示されています。

ここに画像の説明を入力してください

ここまでで私が理解しているのは、これは一般的にエラーの変化率に対応することをs表して"dx/dt"いますが、ここではフィードバックの変化率と関連付けることができます。Td/N全体的なゲイン出力を制限するためのものです(これが正しいと思います)。これをCコードで表すために、次の方法を試しました。

        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;

さて、Dを追加した結果は、私が予測したものとは異なります。D部分の式を正しく実装したかどうかを知りたいだけですか?微分の基本的な数学の理解に間違いをしていますか?

注: VFDから直接取得されるため、kp、ti、tdの再計算を変更する自由はありません。


embedded.com/design/prototyping-and-development/4211211/…、「PhDのないPID」を試してください。デリバティブ実装に関する明確なセクションがあります。
Scott Seidman、2015年

2
Old_Feedback = CurrentFeedback()を宣言した場合は誤りです。CurrentFeedback()で値を読み取り、tempに格納します。変数CurrentFeedback_tmpの場合、その値をそのISRで使用します。これは、fct CurrentFeedback()を呼び出すたびに、リコールするたびに異なる実際の値を取得するためです。
MarkoBuršič2015年

「Dを追加した結果は、私が予測したものではありません」-何を予測しましたか?なぜ違うのですか?
グレッグデオン

ここには整数オーバーフローの大きな可能性があります。関連する変数のタイプは何ですか?それらの最大値を考慮しましたか?
ランディン、

s、DはS32、KP、TdおよびN U16です。サンプル時間はU32です。特定のデータ型で可能な最大値に従って、変数の最大値を検討しました。
spp

回答:


1

私が共有する3つのポイントがあります:

1-人々がD項の記号の混乱、PID = P + I + Dであるが、D = kd *(error -olderror)、そして設定点に近づいている場合は位置制御で、常にolderrorが混乱する理由を説明します<エラーなので、D項は負になるため、出力が減少し、オーバーシュートが防止されます。

2-時間については、時間を分割したり使用したりしないでください。組み込みマイクロコントローラーを使用しているので、時定数を作成してすべての方程式からキャンセルします。たとえば、タイマー割り込みを使用して1msの時定数を生成し、内部で関数を呼び出します。

3-なぜ速度制御にPIDを使用しているのですか?ここのDはより加速制御に似ているため、速度制御ではPIで十分な時間の90%です。

それが役に立てば幸い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.