C で単純な PID シミュレーターを作成しようとしています。これは単純なクルーズ コントロール システムであり、システムをロー パス フィルターとしてモデル化することにしました。
C で数学モデルを書くのに苦労しています。
非常によく似た質問と、やや役立つ回答が次の場所で見つかりました。
一次伝達関数をCコードに変換しますが、答えが完全にはわかりませんでした。
入力 (後で PID の出力ですが、今はステップでテストしたいと思います) とサンプリング時間を受け入れ、0 から定常状態までの出力を提供する関数を作成したいと思います。
簡単にするために、次の伝達関数 G(s) = 1/(s+10) をサンプリング レート 0.01 でプログラムします。
Tustin 変換を適用すると、(0.004762z + 0.004762)/(z-0.9048) になります。
ここからCで書くにはどうすればいいですか?
上記のリンクから、提供された答えは次のとおりです。
double firstOrderLag(double input, double coeff, double dT, double *state){
// Function to implement the discretization of a continuous time first
// order lag sys = coeff/(s+coeff) using the Tustin (Bilinear) transformation.
double num = (1/(1+2/coeff/dT)); // numerator
double den = (1-2/coeff/dT)*num; // denominator
double temp;
double output;
temp = input - den*(*state);
output = num*(temp + (*state));
*state = temp;
return output;
}
したがって、私の特定のケースでは、num は 0.004762 になり、den = -0.9048 になります。これが z ドメイン伝達関数からどのように達成されたかについて興味があります。
また、ポインター変数の状態が何であるかについても明確ではないため、残りのコードを理解するのに苦労しています。
この機能を明確に理解していれば、for ループに実装して開ループ応答、フィードバック応答をシミュレートし、最終的に PID コントローラーを統合できると感じているため、これを明確にする助けをいただければ幸いです。