1

フィードフォワード オペアンプ PID ループを C コードに変換する方法を知っている人はいますか? 私はそのような変換を行おうとしていますが、正直なところ、どこから始めればよいかわかりません。ADC、電圧、電流などを介してすべての入力値を取得できますが、フィードフォワード PID のコーディングは私にとって少し新しいものです。何か案は?

4

2 に答える 2

1

非線形制御システムのハードウェアをソフトウェアに置き換えることについて話しています。あなたの唯一の希望は、ハードウェアのシミュレーションを書くことだと思います。

PIDについては何も知りませんが、Googleで簡単に検索すると、次のことがわかりました。

http://www.cds.caltech.edu/~murray/books/AM05/pdf/am06-pid_16Sep06.pdf

理想的な PID 制御システムを説明するように見える方程式とグラフがあります。これらの方程式を実装するコードを書くことから始めるかもしれません。

あなたの質問について少し考えてみたところ、これはよくある問題のように思えました。「離散 PID コントローラー シミュレーション」を Google で検索したところ、Simulink、Matlab、および Python の回答と、書籍への参照が見つかりました。

Python レシピから始めることをお勧めします。Python は C よりも簡単かつ高速に操作できます。SciPy を使用すると、結果をプロットして、必要な数値が得られていることを確認できます。Python で動作するようになったら、必要に応じて C に移植します。

http://code.activestate.com/recipes/577231-discrete-pid-controller/

于 2012-11-15T19:46:04.000 に答える
1

サーキット

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 in 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.

このソースの回路を勉強 に使用することを強くお勧めします。: PID コントローラーの完全な回路図

セットアップは少し面倒ですが、理想的な形式ではなく標準の数学形式に直接関連付けることができるため、数学的には分析がはるかに簡単です。

最後に、Vout はモーターまたは制御が必要なものを制御します。Vin はプロセス可変電圧です。

C(海?)で足を濡らす前に

ある種のアナログからデジタルへのコンバーターから信号を読み取っていると思います。そうでない場合は、信号を入力としてシミュレートする必要があります。

標準フォームを使用する場合、

ここに画像の説明を入力

ループの実行時間が十分に短い (プロセスが遅い) と仮定すると、次の関数を使用して出力を計算できます。

PIDoutput = 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 秒になります。

フィードフォワード システムの出力は次のようになります。

FeedForwardOutput = Kf * Vin;

ここで、Kf = フィードフォワード システムの比例定数。

したがって、PID コントローラーを備えたフィードフォワード システムの総出力は、

Output = FeedForwardOutput + PIDoutput;

PID コントローラーを使用したフィードフォワード システムの詳細については、このリンクを確認してください。

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 >>> 単一ループのコード実行時間 ( よりもはるかに長い) など、より低い周波数を使用できます。そのような場合、タイマーを廃止して、代わりに遅延関数を使用できます。

于 2013-02-06T19:40:20.347 に答える