10

現在、温度調節器の製作中です。

操作変数 (P、I、および D 項の合計) を返す Temperature_PID() 関数がありますが、この出力をどうすればよいですか?

温度は PWM によって制御されるため、デューティ サイクル 0% = ヒーター オフ、デューティ サイクル 100% = ヒーター オンです。

これまで試した

Duty_Cycle += Temperature_PID();
if(Duty_Cycle > 100) Duty_Cycle = 100;
else if(Duty_Cycle < 0) Duty_Cycle = 0;

Iという用語は基本的にこのシステムを非常に不安定にするため、これはうまくいきませんでした。領域を統合し、別の小さなデータ ポイントを追加し、領域を再度統合してそれらを合計することを想像してみてください。何度も。つまり、各データ ポイントがこの制御方式を指数関数的に悪化させます。

他に試してみたいのは、

Duty_Cycle = Expected_Duty_Cycle + Temperature_PID();

ここで、Expected_Duty_Cycle は、コントローラーが安定点に達した時点で温度を設定する必要がある値であり、Temperature_PID() は 0 です。ただし、Expected_Duty_Cycle は、ヒーターの条件 (天候など) に応じて常に変化するため、これも機能しません。 .

だから私の質問は、PIDの出力で正確に何をするのですか? PID 出力に基づいてデューティ サイクルを割り当てる方法がわかりません。理想的には、温度がほぼ設定値に達し、より低いデューティ サイクルに低下し始めるまで、これは 100% のデューティ サイクルに留まります。しかし、最初の方法 (I ゲインをゼロに設定) を使用すると、デューティ サイクルが既にオーバーシュートした後でのみ、デューティ サイクルが低下し始めます。

これは私の最初の投稿です。私の答えが見つかることを願っています。スタックオーバーフローありがとう。

編集: これが私の PID 関数です。

double TempCtrl_PID(PID_Data *pid)
{
    Thermo_Data tc;
    double error, pTerm, iTerm, dTerm;

    Thermo_Read(CHIP_TC1, &tc);

    pid->last_pv = pid->pv;
    pid->pv = Thermo_Temperature(&tc);
    error = pid->sp - pid->pv;
    if(error/pid->sp < 0.1)
        pid->err_sum += error;

    pTerm = pid->kp * error;
    iTerm = pid->ki * pid->err_sum;
    dTerm = pid->kd * (pid->last_pv - pid->pv);

    return pTerm + iTerm + dTerm;
}

編集 2: これまでにこれを使用したことがないため、リンクが壊れている場合はお知らせください。 https://picasaweb.google.com/113881440334423462633/January302013

申し訳ありませんが、軸またはタイトルの名前を変更しようとすると、Excel がクラッシュします。注: システムにはまだファンがないため、ヒーターを加熱できるほど速く冷却することはできません。最初の写真はシンプルなオンオフコントローラーです。2番目の写真は私のPDコントローラーです。ご覧のとおり、温度がオーバーシュートする前に減算を行わず、デューティ サイクルから減算する前に温度がオーバーシュートするまで待機し、減算が遅すぎるため、温度が低下するのに非常に長い時間がかかります。コントローラが最大温度に達する前にデューティ サイクルを下げるようにコントローラに指示するにはどうすればよいですか?

4

3 に答える 3

11

PIDの出力はデューティサイクルです。kp、、kiを調整kdして、PID出力をの範囲Duty_Cycle(たとえば、0〜100)にする必要があります。通常、PID関数自体で出力を明示的に制限することをお勧めします。

簡単な手順でPIDを「調整」する必要があります。

  1. 積分項と微分項をオフにします(ゼロに設定kiおよびkdゼロに設定)

  2. kpセットポイントの10%のステップ変化によって出力が振動するまで、ゆっくりと増加させます。

  3. 30%程度減らすkpと、振動がなくなります。

  4. の一部に設定kiし、kp設定値に到達するまでの時間に対するオーバーシュートの望ましいトレードオフを取得するように調整します

  5. うまくいけば、あなたは必要ないでしょうkd、しかしあなたがそうするなら、それをさらに小さくしてください

于 2013-01-30T22:13:59.470 に答える
3

PID コントローラーの出力は、デューティ サイクルの値を直接設定する必要があります。

基本的に、実際の温度と温度設定値の差に基づいてヒーター設定を制御します。

求めている性能を得るには、PID パラメータの値を調整する必要があります。

まず、I と D をゼロに設定し、P の値を入力します。たとえば、2 を入力して開始します。

セットポイントを変更して、応答を確認します。P を増やし、別の設定値の変更を行い、何が起こるかを確認します。最終的には、温度が一貫して振動し、安定した値に達することはありません。この値は「究極のゲイン」として知られています。振動の周波数にも注意してください。P を最終ゲインの半分に設定します。

I の 1.2(最大ゲイン)/(発振周波数) の値から始めて、設定点を変更します。これらの値から P と I の値を調整して、目的の場所に到達し、プロセスを追跡して、値を増減するかどうかを確認します。

P と I を取得したら、D に取り組むことができますが、プロセスのダイナミクスによっては、D の値を与えると人生が悪化する可能性があります。

Ziegler-Nichols メソッドは、PID 値のガイドラインを提供します。そこから、パフォーマンスを向上させるための調整を行うことができます。

温度が新しい設定値に到達するのにかかる時間とオーバーシュートするオプションを比較検討する必要があります。温度の調整が速いほど、オーバーシュートが大きくなります。オーバーシュートがないと、その時間が大幅に増加します。

于 2013-01-30T22:20:10.853 に答える
2

いくつかの提案:

  • あなたは2回統合しているようです。関数の中に入ってTempCtrl_PIDから外に一度。 Duty_Cycle +=.
  • P 項のみから始めて、システムが不安定になるまで増やし続けます。次に元に戻し (たとえば、不安定になる値の 1/2 から 1/4 を使用)、I 項の追加を開始します。I項の非常に低い値から始めて、徐々に増やします。このプロセスは、ループを調整する方法です。システムの時定数はおそらくかなり長いため、これには時間がかかる場合があります...
  • 提案どおりにフィードフォワードを追加できます(指定された設定値の予想されるデューティサイクル - デューティサイクルを設定してシステムを安定させることでマッピングします)。ループが残りのエラーを取り除くので、その用語が完全でなくても問題ありません。デューティサイクルに一定のバイアスを単純に追加することもできます。積分器がそれを取り出すので、定数は実際には何の違いもないことに注意してください。コールド スタートにのみ影響します。
  • このループには、ある種の固定時間ベースがあることを確認してください。たとえば、10ms ごとに調整します。
  • 今のところ、D タームについて心配する必要はありません。ほとんどのアプリケーションでは、PI コントローラーで十分です。
于 2013-01-30T22:19:44.613 に答える