現在、温度調節器の製作中です。
操作変数 (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コントローラーです。ご覧のとおり、温度がオーバーシュートする前に減算を行わず、デューティ サイクルから減算する前に温度がオーバーシュートするまで待機し、減算が遅すぎるため、温度が低下するのに非常に長い時間がかかります。コントローラが最大温度に達する前にデューティ サイクルを下げるようにコントローラに指示するにはどうすればよいですか?