離散時間積分器のC言語プログラム

離散時間積分器

近年のパワエレ制御のほとんどがソフトウェアで実現され、C言語が使われることも多いと思います。

そして、パワエレの制御ソフトウェアには必ず積分器が含まれており、この積分器は単純な積算演算で実現できるためソフトウェアで実装するのは難しくありません。

このように積分器はソフトウェアで比較的簡単に実装できますが、積分時定数(積分器の特性)が規定されていない積分器になっているソフトウェアをたまに見かけます。
このような積分時定数がわからないような積分器の実装では、思わぬ問題が発生する可能性があります。

また、積分器は単純な積算演算ですが、実際には離散系の演算方法としていくつかの種類があるため、制御ソフトウェアを作成するのであれば、離散系の演算方法の種類について理解して、どの方法を採用するかを決定する必要があります。

今回は、この離散系の積分器のソフトウェア(C言語)による実装について解説します。

1.積分演算と時定数

ソフトウェアの話の前に、積分時定数について確認しておきましょう。

入力を\(u\)、出力を\(y\)とすると、時定数が\(T\)[sec]の積分器の特性は次の式で表されます。

\(\displaystyle y=\int\frac{u}{T}\ dt=\frac{1}{T}\int u\ dt\)

具体的には、入力が \(u=1\)のとき、この積分器の1秒後の出力は

\(\displaystyle y=\frac{1}{T}\int_{0}^{1}1\ dt=\frac{1}{T}\)

のように、入力が1の時の1秒後の出力は積分時定数の逆数 \(\displaystyle\frac{1}{T}\) となります。
積分時定数が大きいほど、緩やかに積算されるということです。

また入力が正弦波 \(u=\sin \omega t\) の場合は

\(\displaystyle y=\frac{1}{T}\int_{0}^{1}\sin \omega t\ dt=-\frac{1}{\omega T}\cos \omega t\)

のように振幅が \(\displaystyle\frac{1}{\omega T}\) となります。

つまり、時定数が \(T\) [sec]の積分器へ、角周波数 \(\displaystyle \omega =\frac{1}{T}\) [rad/sec]の正弦波を入力すると、入力と出力が同じ振幅になり、入力がこの周波数よりも低いと出力の振幅は増幅、高い場合は減衰します。

このように、積分器の特性は積分時定数で決まるので、積分時定数を明確に規定して積分器を実装するようにしましょう。

2.ソフトウェアで実装する離散系の積分器

連続系の演算を離散系に変換するには様々な演算方法がありますが、ここでは、シンプルなソフトウェアで実装できる3つの離散系の積分器について説明します。

(1) 後退オイラー法(後退差分法)

積分器のソフトウェアで実現するためには、入力を積算すれば良いことは直感的にわかると思います。この直感に最も近いのが後退オイラー法(後退差分法とも呼ばれます)による積分器です。

演算式をブロック線図で表すと下の図のようになります。

後退オイラー法による積分器のブロック線図後退オイラー法による積分器のブロック線図

まず、図の \(\displaystyle z^{-1}\) について説明します。

離散系において \(z\) を掛けることは、サンプリングされた信号を1サンプル進めることを意味します。
図中の  \( z^{-1}\)は \(z\) の逆数 \(\displaystyle \frac{1}{z}\) であり、これは1サンプル遅らせることになります。

したがって、このブロック線図は、入力信号を \(k\) 倍し、その値を前回の演算での出力値に加算した値を今回の出力値にするということを表しています。

ここで、\(k\) は積分ゲインと呼ばれ、値は次式で決まります。

\(\displaystyle k=\frac{サンプリング周期}{積分時定数}\)

この式にサンプリング周期が含まれているのは、積分器のサンプリング周期(演算が呼び出される時間間隔)を変更しても、所定の積分時定数となる特性を得るためです。
サンプリング周期を考慮せずに積分ゲインを決めると、その積分器のサンプリング周期(演算が呼び出される時間間隔)を変更することにより、積分器の特性も変化してしまうので注意してください。

以上のような演算によって実現できるのが、後退オイラー法による離散系の積分器です。

この積分器をC言語で作成したコードの例を以下に示します。このようなコードでブロック線図に示した通りの積分演算が実行できます。

後退オイラー法による積分器のC言語コード [入力変数:double  x1 出力変数:double  y1]

double T = 0.1;			/* 時定数 0.1秒 */
double ts = 0.01;		/* 100Hz */
double k= ts/T;
double In;			/* 入力 */
static double Out = 0.0;	/* 出力 */

In = x1;

Out = Out + k*In;		/* 積分演算 */

y1 = Out;

(2) 前進オイラー法(前進差分法)

前進オイラー法による積分器のブロック線図は下の図のようになります。

前進オイラー法による積分器のブロック線図前進オイラー法による積分器のブロック線図

後退オイラー法との違いは、入力に \(z^{-1}\) を乗じて入力信号を1サンプル遅らせている(前回の入力値を使っている)ところだけなので、特に説明は不要でしょう。

なお、遅らせているのに「前進」と呼ぶのは逆のように感じるかもしれませんが、「前進オイラー法」「後退オイラー法」とは微分演算の方法として名付けられているため、積分では逆になっていると理解してください。

この積分器をC言語で作成したコードの例を以下に示します。後退オイラー法のコードに、入力を1サンプル遅らせるためのコードが追加されています。

前進オイラー法による積分器のC言語コード [入力変数:double  x1 出力変数:double  y1]

double T = 0.1;			/* 時定数 0.1秒 */
double ts = 0.01;		/* 100Hz */
double k= ts/T;
double In;			/* 入力 */
static double In1 = 0.0;
static double Out = 0.0;	/* 出力 */

In = x1;

Out = Out + k*In1;		/* 積分演算 */

y1 = Out;
In1 = In;

(3) 台形法(双一次変換)

次に台形法による積分器について説明します。台形法は、双一次変換やTustin変換とも呼ばれます。

この台形法による積分器のブロック線図は下の図のようになります。

台形法による積分器のブロック線図台形法による積分器のブロック線図

台形法では、今回の入力値と前回の入力値の中間値(平均値)に基づいて積算演算をします。

従って、台形法では、後退オイラー法と前進オイラー法の間の値が出力されます。

この積分器をC言語で作成したコードの例を以下に示します。ブロック線図の通りの演算式をC言語で実装しています。

台形法による積分器のC言語コード [入力変数:double  x1 出力変数:double  y1]

double T = 0.1;			/* 時定数 0.1秒 */
double ts = 0.01;		/* 100Hz */
double k= ts/T;
double In;			/* 入力 */
static double In1 = 0.0;
static double Out = 0.0;	/* 出力 */

In = x1;

Out = Out + 0.5*k*(In + In1);	/* 積分演算 */

y1 = Out;
In1 = In;

3.シミュレーションで確認

ここまで、3種類の離散系の積分器について、ブロック線図とC言語コードを説明しました。

これらの積分器が実際にどのような演算結果を出力するのかを、PSIMを使ったシミュレーションで比較してみます。

(1) PSIMシミュレーション回路

PSIMシミュレーション回路図

シミュレーション回路としては、連続系の積分器と3種類の離散系の積分器に、周波数が5[Hz]の正弦波信号を入力しています。

離散系の積分器は、それぞれ後退オイラー法・前進オイラー法・台形法のC言語プログラムを、PSIMの「シンプルCブロック」に記述したもので、その入力部には100[Hz]のゼロ次ホールドを接続することで、サンプリング周期が10[msec]となるように離散化しています。

(2) シミュレーションでの比較結果

シミュレーション結果を下図に示します。
図の上段が積分器へ入力される正弦波で、下段が連続系の積分器と3つの離散系の積分器の出力波形です。

10msシミュレーション結果波形

離散系の出力はサンプリング周期である10[msec]毎に演算され出力値が更新されます。

出力波形を連続系の積分器と比べると、後退オイラー法は進み、前進オイラー法が遅れ、台形法がその中間値と出力波形は少し異なってはいますが、波形全体を見ればいずれの演算方法でも連続系の積分器と近い値が得られています。

次に、離散系のサンプリング周期を10[msec]から1[msec]へ時間間隔を短くした場合のシミュレーション結果を示します。

1msシミュレーション結果波形

サンプリングの時間間隔を短くすると、いずれの演算方法でも演算結果はほとんど一致しており、演算方法に関係なくほぼ同じ特性の積分器が得られていることがわかります。

まとめ:どの演算方法が良いのか

今回はソフトウェアで実装できる3つ演算方法による離散系の積分器について説明しました。

では、どの演算方法を採用するのがよいのでしょうか?

通常のパワーエレクトロニクス装置の制御ソフトウェアのサンプリング周期(演算時間間隔)は、十分に短いため、演算方法の違いによる誤差はほとんど無視できます。
そのため、私の場合は、演算が最も簡単でCPUの演算負荷が小さくなる後退オイラー法を採用しています。

どの演算方法を選ぶかよりも、積分時定数を明確に規定して積分器を実装することの方が重要ですので、もし積分時定数が曖昧なソフトウェアになっていたら、この記事を参考に改善してみてください。


パワエレ制御の設計技術を習得したい方へ
パワエレ制御の設計開発に不可欠なスキルが習得できる動画講座のご紹介です。
「パワエレ制御の基礎である電流制御系」の講義動画も登録不要ですぐに視聴できますので
ご興味があれば下のボタンから確認してみてください!

パワエレ制御講座の詳細と講義動画はこちら


関連記事

  1. MPPTシミュレーション

    MPPT制御のやり方をシミュレーション回路を公開して解説

  2. インバータはどこ?

    制御理論に「インバータ」を組込む方法

  3. 電力鉄塔と弱電基板

    パワエレ制御は「強電」と「弱電」だから難しいのか?

コメント

  • コメント (1)

  • トラックバックは利用できません。

  1. こんばんは!お久しぶりです。
    ㏋講座の佐藤です。
    頑張ってますね。パワエレのことはよくわかりませんが、
    内容はわかり易く読みやすいので、女性の私でも見れました。
    どうしてだめなのか、どれが良いのかもはっきりしていてよいです。
    ただ少し、言語コードが見ずらいです。

  1. この記事へのトラックバックはありません。