CでのPIDループのプログラミング


11

私は電気のエンジニアであり、デジタルの世界に突入し、私が学んでいる間に学びました。次の図に示すように、PID(比例-積分-微分)ループを実行するTIプロセッサをプログラミングしています。

ウィキペディアのPIDループ画像

それについても説明します。

非反転端子が接地された負帰還オペアンプ。マイナス端子から入力します。フィードバックループは、抵抗器と並列のRE直列回路と、コンデンサと並列のRE直列回路です。

この回路をCコードに変換する方法はありますか?私はこれに関する私の要素から少し外れているので、ヘルプを使用できます。


あなたは可能にリンク絵と誰かが親切にあなたのために実際の画像にリンクしているページを変換します。
ヨアヒムザウアー

2
あなた自身が投稿したリンクは、そのための基本的な擬似コードを提供します。C#を気にしない場合は、C#のpidループの例を次に示します
ニール

1
ニールは正しい。TIのCでほぼ正確にそのループを実装しました。1つのヒント:ループでdt余分な除算と乗算を行う代わりに、定数時間ループを使用し、固定値を定数に因数分解します。
AShelly

1
@Neilは、PIDループが何であるかわからなかったため、リビジョン2で追加したリンクでした。

@MichaelT、おmyびします。
ニール

回答:


18

サーキット

この質問を見たときに、ここでアカウントを作成しました。あなたがしたタイプミスを修正できるように、あなたの質問を編集することはできません。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 >>>単一ループのコード実行時間(はるかに大きい)のように低い周波数を使用できます。そのような場合、タイマーを廃止し、代わりに遅延機能を使用できます。


6
アスキー図は私の心を吹き飛ばしました。+1
l46kok

1
リンク「このソース」が機能していない
-Ccr

それを聞いて申し訳ありませんが、良いリソースが失われました:(適切なメッセージ(リンク
切れ

2
不足している「このソースは、」ここに利用できる場合があります:educypedia.karadimov.info/library/piddocs.pdf
デヴィッド・スアレス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.