実際に使える制御工学:基礎編(7)「初歩的なディジタル制御。2026年でも後退差分は一線級。」
<この記事で伝えたい事>
現代において、制御を実行するのは主にコンピュータです
ディジタル制御とは、制御技術をコンピュータが実行できる形に翻訳する方法と解釈して間違いではないと思います。とりあえずは、後退差分法さえ押さえておけばモノは動かせます
2026年現在でも、後退差分法は一線で通用するディジタル化(離散時間化)技術です。
ただ、より高精度を求める場合は別の方法が使われます。
1. はじめに
自己紹介はこちらです。
この記事は、主に制御系の学生や若手エンジニアに向けた基礎知識紹介・解説記事シリーズの第7弾です。
今回は、初歩的なディジタル制御知識を紹介・解説します。
2. ディジタル制御の前提知識
現代において、メカトロニクス機器の制御を実行するのは、
マイコン(マイクロコンピュータ)
FPGA(Field Programmable Gate Array)
のどちらかであることが多いです。
どちらにしても、コンピュータ(電子計算機)なことは変わりません。
通常、コンピュータは一定間隔で制御演算(PID制御などを実行するのに必要な計算)を実行します。
この一定間隔で演算を実行する機能は「タイマー割り込み」と呼ばれ、そのとき実行されるプログラムを「割り込みハンドラ」と呼びます。
これまでの記事では、色々な量(速度や電流など)は連続的に変化するものという前提で話をしてきました。
が、コンピュータには、この前提は通用しません。
基本的に、コンピュータは速度や電流を一定間隔毎に更新されるデータとしか認識できません。
下図は、我々人間とコンピュータの認識の差を表したものです。
データの更新間隔(=制御演算の実行間隔)のことを、サンプリング時間と呼びます。

人間とコンピュータとの間には、こうした認識の差があります。
これを理解してプログラムを組まなければ、コンピュータがモノを人間の思いどおりに動かしてくれません。
この記事では、人間の命令をコンピュータ向けに翻訳する方法の1つを紹介・解説しようと思います。
3. コンピュータの認識できる限界(ナイキスト周波数)
前述のとおり、コンピュータはデータをサンプリング時間ごとにしか認識できません。
ということは、コンピュータはそれより短い時間の動きに気付けないということになります。
これが、そのままコンピュータの認識できる限界です。
ディジタル信号処理分野では、ナイキスト周波数$${f_n}$$と呼ばれるものがあります。
これは、
「周波数の観点からコンピュータの認識できる限界を表したもの」
と解釈して差し支えありません。
ナイキスト周波数は、サンプリング時間$${T_{s[s]}}$$から下式で求められます。
$$
f_{n[Hz]}=\frac{1}{2\cdot T_{s[s]}}
$$
グラフを見ると、ナイキスト周波数を直感的に理解しやすいです。

サンプリング時間ごとに$${+1,-1,+1,-1,\cdots}$$と切り替えて波を形づくるのが、コンピュータの表現できる限界というのは感じてもらえたと思います。
(ちょっとムリヤリ感があるのは否めませんが)
表現できる限界は、認識できる限界でもあります。
コンピュータが1つの波を形づくるには、最低でも2サンプル(2回のデータ更新)が必要です。
このことからも、コンピュータの表現・認識できる限界はナイキスト周波数と言えます。
また、これも直感的な話ですが、ムリヤリ感なくSIN波を表現するには最低でも1周期を10分割、できれば20分割するくらいまでサンプリング時間を高速化する必要があります。
人間の直感は案外侮れないもので、理論的に解析しても同じような結論に至ります。


制御システムに$${10_{[Hz]}}$$のSIN波に追従できるだけの性能を求めるなら、コンピュータのサンプリング時間は最低でも$${10_{[ms]}}$$($${10_{[Hz]}}$$の1周期$${0.1_{[s]}}$$の1/10)は欲しいところです。
できれば、$${5_{[ms]}}$$($${10_{[Hz]}}$$の1周期$${0.1_{[s]}}$$の1/20)以上のサンプルレートにしたいところです。
なお、制御システムへの要求性能を上げると、それに伴いサンプリング時間を高速化する必要が生じます。
サンプリング時間を高速化して生じる問題はほぼありません。
(問題が起きても対策のしようはあります)
コスト的に許されるなら、サンプリング時間は高速化した方が良いです。
4. 後退差分法の考え方
後退差分法とは、微分の近似計算方法の1つです。
そもそも微分とは何かを振り返ってみると、曲線の傾きを求める計算だったと思い出せます。
現在データと1つ前のデータから、近似的に曲線の傾きを求めるのが後退差分法です。

これを数式化したものが下式です。
$${k}$$はデータサンプリング番号を意味します。
(現在データを$${k}$$番目のデータとすると、1サンプル前のデータは$${k-1}$$番目のデータとなります)
$$
y'_{(k)}=\frac{1}{T_s}\cdot(y_{(k)}-y_{(k-1)})
$$
数式中のサンプリング時間$${T_s}$$を極限まで0に近づけると微分の定義式と一致します。
このことから、後退差分法には微分の近似計算方法としての妥当性があると言えます。
ディジタル信号処理分野では、データを1サンプル未来へ進めるには、$${z}$$演算子というものをデータにかければ良いことになっています。
逆に、データを1サンプル過去へ戻すには、データに$${z^{-1}}$$をかければOKです。
この概念を後退差分法による近似微分にあてはめると、数式を下式のように変形できます。
$$
\begin{array}{cl}
y'_{(k)}&=\cfrac{1}{T_s}\cdot(y_{(k)}-z^{-1}\cdot y_{(k)})\\
&=\cfrac{1-z^{-1}}{T_s}\cdot y_{(k)}
\end{array}
$$
ここで、微分計算のラプラス変換を思い出してみましょう。
数式で表すと、下式のようになっていたはずです。
$$
y'_{(s)}=s\cdot y_{(s)}
$$
この微分計算のラプラス変換式と、後退差分での近似微分の数式を照らし合わせると、以下の関係式を導き出せます。
$$
s \fallingdotseq \frac{1-z^{-1}}{T_s}
$$
これは、伝達関数中のラプラス変数$${s}$$に$${\cfrac{1-z^{-1}}{T_s}}$$を代入すると、後退差分法で離散化したディジタルの伝達関数(パルス伝達関数)を求められることを意味します。
後退差分法は他の離散化方法と比べて精度面では一歩譲るものの、計算がシンプルというメリットがあります。
人間にとって難しい計算は、コンピュータにとってもコストがかかる難しい計算です。
精度に目をつむって処理速度を取る場合には、後退差分方法が採用されることが多いです。
これが、後退差分法が未だに一線で通用するディジタル化技術であり続けている理由の1つです。
5. 後退差分法でディジタル化したPID制御
下2つの図は、PID制御演算部分のみを抽出したブロック線図です。


四則演算($${+,-,\times,\div}$$)は、連続時間でも離散時間でも同じです。
このため、PIDのうち比例(P)制御は連続時間と離散時間とで同じです。
4章での説明から、誤差の近似微分値は下式になると分かってもらえると思います。
$$
\begin{array}{cl}
e'_{(k)}&=\cfrac{1-z^{-1}}{T_s}\cdot e_{(k)}\\
&=\cfrac{e_{(k)}-z^{-1}\cdot e_{(k)}}{T_s}\\
&=\cfrac{e_{(k)}-e_{(k-1)}}{T_s}
\end{array}
$$
これで、微分(D)制御の計算も問題ないと思います。
残る疑問は、
積分計算をどうするか?
だと思います。
積分は、微分の逆計算です。
積分のパルス伝達関数は、微分の逆数$${\cfrac{T_s}{1-z^{-1}}}$$になるだろうと予想は立てられると思います。
ただ、直感のみだと、それ以上に理解を深めるのは難しいのも現実です。
そういうときは、理論の出番です。
まず、よく分からない部分(今は近似積分のブロック)にのみスポットを絞るところから始めます。
下図は、近似積分のブロック線図です。

$${T_s}$$はサンプリング時間という特別な意味は持つものの、定数ゲインであることには違いありません。
そこで、$${T_s}$$と分母を下図のように分割します。

これだけでは、理解を深めるにはまだ不十分です。
そこで、基礎編(2)で紹介したフィードバック接続時のブロック線図変形パターンを参考に、$${\cfrac{1}{1-z^{-1}}}$$を逆変形します。
逆変形後のブロック線図が下図です。

ここまでくると、近似積分値が以下のように計算されると分かります。
$$
\begin{array}{cl}
(\text{近似積分値})&=(\text{1つ前の近似積分値})\\
& +T_{s}\cdot (入力データ)
\end{array}
$$
この計算は、数値積分の長方形近似と一致します。
数値積分の長方形近似について調べてもらえば、後退差分法でディジタル化した積分計算が妥当なものだと納得してもらえるでしょう。
(加えて、より精度の良い数値積分方法の知識も得られます)
以上で、PID制御をプログラムに落とし込むための情報が出そろったと思います。
以下、PID制御を実行するC言語サンプルコードです。
(変数の初期化処理等は省略しています)
float Kp,Ki,Kd,Ts; % Kp:比例ゲイン, Ki:積分ゲイン, Kd:微分ゲイン, Ts:サンプリング時間
float r,y,e,Ie,De,u; % r:目標, y:出力, e:誤差, Ie:誤差積分値, De:誤差微分値, u:入力
float e_before; % 1つ前の誤差を保持するための変数
float Ie_before; % 1つ前の近似積分値を保持するための変数
% SampleCode関数が割り込みハンドラと思ってください
void SampleCode(void){
e = r-y; % 誤差の計算
Ie = Ts*e + Ie_before; % 誤差の近似積分値計算
De = (e - e_before)/Ts; % 誤差の近似微分値計算
u = Kp*e + Ki*Ie + Kd*De; % PID制御計算
e_before = e; % 1つ前の誤差データの保持
Ie_before = Ie; % 1つ前の近似積分値データの保持
}6. おわりに
この記事では、実装のためのディジタル制御(後退差分法)を紹介・解説しました。
これで全7回の基礎編は終了です。
おつかれさまでした。
基礎編で紹介した知識・技術が身につけば、初心者から初級者へとステップアップできると思います。
ただ、これまでの記事は「基礎編」と名付けただけあって、ほとんど制御分野の基礎知識紹介に留まっています。
今後は、初級者から中級者へのステップアップの助けになる「応用編」を書いていく予定です。
記事が書けたら読んでもらえると幸いです。
※ここでいう初心者・初級者・中級者
初心者:全くの未経験者
初級者:人から教わりながら仕事ができるレベル
中級者:人から教わらなくとも独力で仕事ができるレベル
