サーキット
この質問を見たときに、ここでアカウントを作成しました。あなたがしたタイプミスを修正できるように、あなたの質問を編集することはできません。REの代わりにRC直列回路を並列に使用するつもりだったと思う(もしそうなら、私はそれが何を意味するのか一つの手がかりを持っていない)
Cを使用してシミュレートしたいアナログ回路は次のように見えます
Ci
|------| |--------------|
| Rp |
|----/\/\/\/\-----------|
| Rd Cd |
Rf |----/\/\/\---| |-------|
Vin o----/\/\/\---| |
| |\ |
| | \ |
|----|- \ |
| \ |
| \-------------|---------o Vout
| /
| /
|+ /
----| /
| |/
|
|
___|___ GND
_____
___
_
LEGEND:
Vin is the input signal.
Vout is the Output.
Rp controls the propotional term ( P in PID)
Ci controls the Integral term ( I id PID)
Rd and Cd controls the differential term ( D in PID)
Rf is the gain control, which is common to all of the above controllers.
(私はこれを描く衝動に抵抗することができませんでした。なぜなら、電気/電子技術者が画像なしのフォーラムや電子メールでどのように通信していたのか、そしてなぜ私たちがクーリエ、固定幅フォントが好きなのかを伝えたいからです)
使用している回路のセットアップは簡単ですが、システムの比例定数、積分定数、微分定数を個別に希望する値に調整することは不可能であるため、数学的に非常に複雑であることを認めなければなりません。
このソースの回路を学習に使用することを強くお勧めします。
設定するのは少し面倒ですが、数学的には理想的な形式ではなく標準の数学形式に直接関連付けることができるため、分析がはるかに簡単です。
最後に、Voutはモーターまたは制御が必要なものを制御します。そして、Vinはプロセス変数電圧です。
Cで足を濡らす前に(海?)
何らかのアナログ-デジタルコンバーターからの信号を読んでいると思います。そうでない場合は、入力として信号をシミュレートする必要があります。
標準フォームを使用している場合、
ループの実行時間が十分に短い(遅いプロセス)と仮定すると、出力を計算するために次の関数を使用できます。
output = Kp * err + (Ki * int * dt) + (Kd * der /dt);
どこ
Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int = int from previous loop + err; ( i.e. integral error )
der = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.
最初は「der」と「int」はゼロになります。コードで遅延関数を使用してループ周波数を1 KHzに調整すると、dtは0.001秒になります。
Cでの描画
CのPID用のこの優れたコードを見つけましたが、それのすべての側面をカバーしているわけではありませんが、それでもなお良いコードです。
//get value of setpoint from user
while(1){
// reset Timer
// write code to escape loop on receiving a keyboard interrupt.
// read the value of Vin from ADC ( Analogue to digital converter).
// Calculate the output using the formula discussed previously.
// Apply the calculated outpout to DAC ( digital to analogue converter).
// wait till the Timer reach 'dt' seconds.
}
遅いプロセスを採用する場合は、dt >>>単一ループのコード実行時間(はるかに大きい)のように低い周波数を使用できます。そのような場合、タイマーを廃止し、代わりに遅延機能を使用できます。