物理的な意味と数学的表記の両方の単純さにもかかわらず:
プログラムでPIDコントローラーを実装すると、多くの場合、信頼できる自動化デバイスでもエラーが発生します。
さらに、PIDコントローラー実装の品質を確認することは非常に簡単です。
最も簡単な例を考えてみましょう:サーモスタット。 その品質を確認するには、高速、低慣性、低電力のオブジェクトが最適です。 ジャンルの古典:薄い熱電対(HA)がねじ込まれた通常の100W電球。 そして、PIDコントローラーで最初に確認することは、PIDをPコントローラーに分解することです。 つまり、積分係数と微分係数をゼロに設定し、比例係数を最大値に設定します。
レギュレーターをオンにして、現在の温度が22度、設定が16度であることを確認します。 ライトは消灯しています。 設定を増やし始めます:16.1、16.3、16.7、18 ... 19 ...ライトが点灯します。 どうして?! どこから? 停止-オフになりました。 そのため、PIDコントローラーの実装における最初の古典的なエラーに遭遇しました。
小さな数学的な余談:上記の積分表記をもう一度思い出してください。 プログラムで実装しています。つまり、離散的です。 つまり、うらやましいほどの規則性をもって、入力量を測定し、それを設定値と比較し、効果を計算し、発行し、繰り返します。 したがって、積分形式から有限差分スキームに切り替える必要があります。 移行中、「額」移行が通常使用されます。
ここで、
E(n) = X(n) - X0(n)
-つまり、現在と調整可能なパラメーターの特定の値との間の不一致の値です。
直接式を使用するには、まず大きな期間にわたって不整合積分を読み取って保存する必要があり、次に高精度の浮動小数点で作業する必要があります(積分係数Kiは常に<1であるため)、または除算演算(係数を1 / Kiの形式で表す)が大きいビット深度。 これにはすべて、計算リソースが必要です。組み込みでは、通常非常に制限されています...したがって、直接回路を実装する代わりに、繰り返し式を実装します。
繰り返し式を使用すると、計算量と中間値のビット深度が減少します。
規制当局に戻りましょう。 そのため、調整可能なオブジェクトがあります:電球です。 供給される電力を制御するために、彼らは単純なアプローチを使用します:電源ネットワーク(220V 50Hz)はトライアックを介して負荷に供給されます。 半波がゼロを通過した瞬間、 トライアックはオフになり、信号が制御電極に送信されるまでオフのままになります。 したがって、半波の開始後すぐに制御信号を与えると、この半波からのエネルギーが制御対象に到達します。 時間Xから半波の終わりまでの半波部分の面積の線形性の時間を正しく計算することにより、線形化テーブルが計算された精度で0から100%の電力を出力する機会が得られます。
そのため、0〜100%の範囲で電力を供給することができます。 実際のオブジェクトでは、多くの場合、100%の電力を供給することは不可能です。たとえば、これには発熱体の焼損が伴います。 したがって、すべてのデバイスには、オブジェクトへの最小および最大電力出力の設定があります。
したがって、上位の式を使用して
U(n)
を計算した後、結果の制限が追加されます。
if Un < Umin then Un := Umin; if Un>Umax then Un := Umax;
その後、計算されたUnは、現時点で必要な出力電力です。 タダム! 上記のエラーを作成するのはこの実装です。
その理由は平凡です。離散スキームから有限差分スキームへの移行時に、積分の計算操作を「ブラケット」し、各ステップで累積和
U(n-1)
微分を追加します。 制限を課したので、計算された積分全体を実質的にゼロにします。 (まあ、どれだけリセットするかではなく、0-100の範囲にどれだけ持ってくるかは、この場合は重要ではありません)。 したがって、PIDコントローラーを区別し、差分アクセラレーターは残ります。 実際には単なる差動コントローラーのように見えますが、電力は設定値または調整可能な値の変化に比例して供給され、設定値と制御値の差には比例しません。
結論その1 :U(n)の計算は制限できません。 出力デバイスに供給される電力を制限するには、個別の変数を設定する必要があります。
Urnを開始したので、限られた電力でリロードし、テストを続けます。
レギュレーターをオンにして、現在の温度が22度、設定が16度であることを確認します。 ライトは消灯しています。
設定の追加を開始します:16.1、16.4、17、18、20、22、24(おっと!明るい!乾杯!)、28、30、40、60 ...美! うまくいく!
このプロセスを観察します。結果は約60で、少し前後にぶら下がっていますが、保持されています。 すべてが美しいようです。 息を吐き、PCからコントロールを確認します。600度に設定します。 そして...明かりが消えます。 どうして? セットポイント600、現在60、しかしライトはオフですか?
しばらく待って、ある種の「Classic Jamb No. 2」 ™にはっきりと遭遇したことをゆっくりと実感しながら、ランプはゆっくりと燃え上がり、100%のパワーに達し、同じままです。
差分スキームに再び戻ります。
U(n) = U(n-1) + Kp*(dE + ...)
。 比例係数を掛けた残差は、影響の現在の計算値に加算されます。 60の設定点、60の温度、つまり、残差はゼロです。 出力もゼロでした。 そして、ここで、ジャンプで、設定値が600度に増やされました。 残差は急激に540度になり、比例係数も乗算されて、ストレージ容量U(n)を超えて飛行しました。 笑わないで、浮動小数点の代わりに固定小数点で数学を使ってください。 540度の差で1/16を処理し、20の比例係数を使用すると、... 540 * 20 * 16 = 172800が得られます。16ビットU(n)、さらには有意なものがある場合、実際には計算の結果として、 A300h = -8960。 オーバーシューズ。 大きなプラスの代わりに-有形のマイナス。
結論2 :正しいオーバーフローサポートを使用して計算を実行する必要があります。 いっぱい? 制限を制限し、ラップしないでください。
そこで、U(n)の容量を増やし、中継し、縫い付けて、開始しました。 電球はまだ完全には冷却されておらず、80度であり、設定はまだ600です。ライトが点灯し、消えます。 点灯して消灯します。 どうして? 設定は600、電球は80です-そしてそれはかなり80をサポートしています! どうして? 明らかに、 バグNo. 3が出ました。
そして、再び叙情的数学的な余談。 したがって、差分スキームがあります:
U(n) = G(U(n-1), dE(n))
。 ここでも、影響の新しい値は、現在の瞬間と前の瞬間の残差の差に応じて、過去の影響と特定の影響の合計です。 そして、前の瞬間は何ですか? そして、前の瞬間の前の瞬間は何ですか? まあ、学校を覚えています。 誘導による証明。 Kの証明が真であると仮定して、K + 1の証明を構築でき、K = 0の真が何であるかを別々に証明できる場合、証明は真です。 それで、U(0)についてどう思いますか?
頻繁に遭遇する解決策:すべてをリセットし、フラッシュメモリとセットポイントからセットポイントを読み取り、1ポーリングサイクルを待機し、X(0)を読み取ります。 ここで、ゼロの準備が整いました。今、作業しています。 そして...そして正しくない。 なんで? 再帰式は残差の変化によって反発されるためです。 そして、ゼロで初期化して現在の値をロードすると、開始条件が失われました。 すべて-絶対温度を絶対設定値に等しいレベルに維持する代わりに、コントローラーは温度を開始値と設定値の差に等しい温度に保ち始めます。 つまり、80度で設定は200で、デバイスの電源をオンにしました-80を保持します。設定を240に変更しました-120を保持し始めました。
差分スキームの正しい初期化:_out in _all in general_。 それは
X(0) = 0, X0(0) = 0. U(0) = 0. E(0)=X(0)-X0(0)=0.
計算の最初のサイクルでは、設定点と現在の値がジャンプのように表示されます。
X(1) = 80. X0(1)=200. U(1) = U(0)+Kp*(E(1)-E(0)) = U(0)+Kp*(X(1)-X0(1)-E(0)) = 0 + 20*(200 - 80 - 0) = 2400
これで、回路は正常に機能しています。
結論3 :開始条件を正しく初期化します。
正しいですか? まあ、まあ...もう一度...設定20を設定します。冷却を待っています...オフにします。 電源を入れます。 だから、美しさ:現在の20、設定は20です。ジャンプを600に設定します。暖かく行きましょう。 100、120 ...設定20を設定します。切断され、冷却し始めました。 少し待って(120 ... 110 ... 100 ... 90 ... 80 ...)、設定を100に設定します。ウォームアップに行きました... 105度、オフにしました。 やめて そして、なぜそれは105を保持していますか? しかし今では、比例コンポーネントのみが機能します。 プロセスの物理的な意味を正しく実装すると、振動プロセスは設定値を指定値よりも高く保つことができません。 厳密に以下。 そして、求められている以上に5度保持しています。 これはジョーク番号4で観察されます。
したがって、上記の内容を思い出してください。結論2:U(n)を制限することはできません。 結論3:オーバーフローの場合、それを制限する必要があります。 はい、はい。 そうでない場合、「動作点」は限られた瞬間だけシフトします。 どうする? 容量を増やしますか? まあ、十分な計算能力があれば。 必要ですか? 実際、U(n)= 9999.99であり、29999.99ではないのは何が悪いのでしょうか? 一般に、20,000を失ったということだけです。しかし、今は仕事のために、とにかく電力の100%をロールする必要がありますよね? そうだね。 これは、制限から離れるまで連隊の制限に問題がないことを意味します。 したがって、オーバーフローの場合、フラグを設定し、たとえば範囲の半分に達した後(つまり、9999.9が5000.00を下回った後のU(n)として)、回線を再初期化する必要があります。 つまり、ストーリーを破棄し、n = 0と言って、上記の結論3を参照してください。 探究心は、完全なスキームの場合、3つのコンポーネントすべてがゼロに等しくない場合、プロセスの反復プロセスをゼロにすることで、積分コンポーネントの累積積分もリセットすることをすでに認識しています。 ただし、事前にゼロにリセットするという事実により、彼は残りの余分な回復中に蓄積する時間があります。 また、積分コンポーネントの目的は、比例コンポーネントが個別に処理できない残差を「選択」することであるため、「大」ステージで積分を累積することは完全に正しいわけではありません。
結論4 :何らかの理由でU(n)が制限されていた場合、回路が正常に戻ったと思われるとすぐに、回路を再初期化する必要があります。
次号では、差分スキームを実装することが本当に必要ですか? ADuC847プロセッサー(高速8ビットコントローラー、8051コアを搭載)で25 Hzの周波数で問題なく制御アクションを計算し、他のプロセスに多くのプロセッサー時間を残す、直接的な物理的意味を持つ、シンプルで理解可能なカスタマイズ可能な係数を備えた直接離散回路の詳細な実装。
(式の画像付きの写真は、WikipediaのPID-Regulatorの記事から取られています )