PR

EXCELでPID制御をシミュレーション

記事内に広告が含まれています。

 PID制御をEXCELでシミュレーションする方法を紹介します。マクロ、VBAは使用せず、EXCELの表計算機能のみで行ってみたいと思います。といっても細かな運動式はだいぶ手を抜いていますし、シミュレーションといってもゲインによる変化をEXCELグラフで可視化しているだけです。

 今回はEXCEL表計算を中心に解説します。PID制御に知見のある方が見たらつっこみたいところが多々あるかと思いますが、PID制御の雰囲気だけでも伝われば良いかと思います。

 イメージしやすいように馴染みやすそうな例題で行ってみます。

 前方の車と自分の車(後方)がともに時速30km/h、車間距離30mで走行中という状況。アクセル操作を制御して、車間距離5mまで詰めて走行するというPID制御を行ってみます。人の操作であれば簡単ですね。アクセル踏み込んで距離が近づいてきたら徐々にアクセルを緩めて走行。近づきすぎたらアクセル離して(もしくはブレーキで)減速するといった具合でしょうか。

 細かい説明は置いといて、さっそくEXCEL表計算の準備です。まず定数を準備します▼

 A1セルから順に上記のように入力しておきます。A列は好きな言葉で。B列はベタ打ちで問題ありません。「制御間隔」は0.5sで設定してます。その他は、

「目標値」:目標とする車間距離5m。
「初期値」:最初の車間距離30mです。
「加速度」:アクセルを100%踏み込んだ時の車の加速度、0.3G(2.94m/s^2)としてます。
「前方車両速度」:30km/h。単位をm/sに変えて≒8.33m/s
「初期車両速度」:自分の車の初期速度です。同様に30km/h(≒8.33m/s)

で定数を準備しておきます。

▼次にゲインも設定しておきます▼

 A8セルから順に比例、積分、微分のゲインを設定しておきます。取り合えず、比例項を「1」それ以外を「0」にしておきます。次からは順番にEXCELで表計算していきます。

▼まず時刻です▼

 D列に時間経過を計算しておきます。今回は制御間隔を0.5sとしたため単純に0.5sを足し続けているだけです。上写真の計算例ではセルの行番号から時刻を計算してます。100秒くらい(102行程度)までドラッグ(作成)しておきます。ここからの作業はベタ打ちはきついかと思います。EXCEL表計算を十分に発揮します。

スポンサーリンク

▼次に前方車両の位置を計算します▼

 E列に前方車両の位置を計算します。単純に速度×時間です。前方車両は自分の30m先にいる想定ですので初期(時刻0s)は30mからスタートです。この列も時刻同様、100秒くらいまで計算しておきます。ちなみに60秒後は530mです。小学生の算数です。前方車両はずっと時速30km/h(≒8.33m/s)で走行する想定です。

 E2セルに計算式を入力してから選択セル枠右下隅の黒点をダブルクリックすると隣のセル値があるところまでいっきに計算します。。何気に便利です。ドラッグする必要がありません。最近知りました。

▼続いて自分の車位置及び車間距離の列を準備します▼

 まずF2セルに「0」を入れておきます。自分の0s時点の位置です。G2セルには車間距離。「前方車両位置」-「自分の位置」となりますので、=E2-F2を入れておきます。

▼比例項、積分項、微分項の計算▼

 H、I、J列にそれぞれ比例[P]、積分[I]、微分[D]の表計算を入れます。まずH列の比例項[P]には現在の車間距離[G2]セルから「目標距離の5m」を引いた偏差を入力しておきます。EXCEL表計算では=G2-$B$2です。積分項と微分項は0s時点なのでとりあえず「0」を入れておきます。

 

▼操作量と移動量を計算します▼

 「K2」セルで「操作量」を計算します。操作量は「Kp×偏差+Ki×偏差の積分+Kd×偏差の微分」から=H2$B$8+I2$B$9+J2*$B$10と入力しておきます。

 「L2」では、アクセルの踏み込み具合による、車両の加速度を入力します。今回、「アクセルの踏み込む割合」と「車の加速」は比例するとして、L2セルには、=K2*$B$4/100を入力します。

 「速度M列」には加速度からの積分した速度を計算。速度は初期速度30km/hから変化するようにします。「N列」には速度から移動量を計算し入力しておきます。最終N列で、設定した制御間隔[0.5s]での「移動量」が計算されます。ですので[0.5s]後の車両位置F3セルには=F2+N2と入力して現在の車両位置を計算させておきます。(積分は単純にEXCELで積み上げ計算してます)

 [0.5s]後の車間距離が計算できますので、3行目の計算を順に埋めることができます。車間距離、比例項と先ほどと同様に計算。偏差の積分[I]と偏差の微分[D]も計算できますので入力します。

 「I」項は「P」項の積分となるため、I3セルは「=I2+H3*$B$1」となります。「D」項は「P」項の微分となるため、J3セルは「=(H3-H2)/$B$1」と入力しておきます。ともに時間で除していますが、ゲインが掛けられて、定数として纏まってしまいますので時間で除さなくてもどっちでもいいかと・・。

 で操作量が計算され、車両の加速度、速度、移動量が順に計算できると思います。この要領で3行目以降も計算すれば完成です。(基本ドラッグすれば完了するはずです)

 ▼こんな感じになります▼

 D列(時刻)とG列(車間距離)、M列(速度)くらいをグラフ化してみます。

 Ki、Kdゲインが「0」ですので上記ではただの比例制御です。車間距離が振動を起こしてます。マイナスの車間距離が出てますね。追い越してしまってます。

 徐々にKdゲイン(微分項)を効かせていきます。「8」くらいにすると下図のように収束すると思います。▼

 車間距離が目標の5mに収束してます。当然車両速度も前方車両と同様の30km/h(≒8.33m/s)で安定します。今回の例では積分項[I]は全く意味がありません。例題(計算)が悪かったですね。ゲインを弄ってみると楽しいことになります。

 いろいろゲインを弄って見てみましょう。比例、積分、微分制御の効き方がイメージしやすくなるかと思います。

 今回の例では、計算内容はずいぶん適当です。車の慣性や、加減速の仕方などなど、そのほか、本来であればもっと細かくみる必要があると思いますが、難しいので省きました。雰囲気だけでも伝わればと思います。

 説明に使用したEXCELシートはここからダウンロードできます。

スポンサーリンク
スポンサーリンク

コメント

  1. 匿名 より:

    以前ジャイロセンサーについて質問したものです。
    今度はPID制御について勉強していたらまたこのサイトに来ました。
    いやーすごい知識量ですね。
    また初歩的な質問なのですが、I成分・D成分の計算式I2項・J2項は
    どう記述したらいいのでしょうか。教えていただけませんか。

    • imo より:

       匿名さん、こんにちは。コメント有難う御座います。
      広く浅いだけです・・。学生時代にもっと勉強しておけば、と良くある後悔してます。
       さて質問の内容ですが、I成分はP項についての積分計算となります。D成分は微分計算になります。

  2. 匿名 より:

    早速の回答ありがとうございました。
    答えを見ると「あーなるほどな」と思うんですが...
    昨晩なんであんなに悩んだのか...トンチンカンな計算をしていました。
    ただデータをいただいたので、ほかにも勘違いしている個所を見つけることができました。
    さらに勉強を進めていきます。ありがとうございました。

  3. 匿名 より:

    はじめまして。
    制御系の勉強を始めた者です。
    PID制御の概要が、きちんとまとまっていて、さらにExcelのサンプルもあり、勉強になります。
    仲間内で、制御に関係する勉強会のような事をやっているのですが、
    このHPの内容を使わせていただいてもよろしいでしょうか。

    • imo より:

      匿名さん、はじめまして。
      わざわざ連絡頂き有難うございます。ご自由にお使い下さい。

  4. さるさる より:

    はじめまして。

    PIDパラメータ調整のコツをつかみたいと思い、エクセル等でシミュレーションできるものを探してこのページにたどり着きました。内容がわかりやすく、とても参考になります。

    このページの内容を真似して見たのですが、私もI成分、D成分の計算でつまづいてしまいました。

    差し支えなければデータを頂けないでしょうか?

  5. やん より:

    はじめまして。
    PID制御について、勉強してる素人です

    大変わかりやすい説明ありがとうございます、

    差し支えなければ、私にもI.d成分の式をご教示していただけないでしょうか

    • imo より:

      やんさん、はじめまして。
      「I」項は「P」項の積分となるため、I3セルは「=I2+H3*$B$1」となります。「D」項は「P」項の微分となるため、J3セルは「=(H3-H2)/$B$1」と入力しておきます
      本文にも追記しておきました。

  6. 匿名 より:

    初めまして。
    最近、PID制御の勉強を始めました。
    このサイトのPIDの制御を参考にしましたがL,M,Nがうまく行かないです。
    よろしければデーターを頂けないでしょうか?

    • imo より:

      はじめまして。
      加速度、速度、位置の運動方程式ですが、
      Excelでは単純に積み上げ計算してるだけです。
      暫く置いておきます。参考下さい。

  7. 匿名 より:

    初めまして
    大学の研究でPIDのシミュレーションをやろうとしているのですが、温度を制御する場合はどのようにすればよいのでしょいうか?
    周囲温度-20℃でシリコンラバーヒータ(面積:100mm*50mm、電力密度0.6W/cm^2)の設定温度を20℃にするとしたらどのようにすればよいでしょうか?制御量を電流に置き換えたりとかですか

    • imo より:

      匿名さん、こんにちは。
      どこまでモデル化するかですが電流でいいんじゃないでしょうか。
      温度制御は結構情報があると思いますのでいろいろ参考にするといいと思います。

  8. 匿名 より:

    PID制御の仕組みがよく分かり非常に参考になりました。
    MとNで少し悩んだので一応コメントします。
    M2は8.33(初速)、M3以下は=L3*0.5+M2(積分)、N2以下は=M2*0.5ですね。MとNはどちらも積分とされていますが、厳密にはMが積分で、NはFまでを含めて積分になっているのですね。(Fが移動量+直前の位置となっているため)
    本文に書かれているように、N1は「移動量」とすると分かりやすいですね。
    それから0.3Gは正しくは0.3*9.8=2.94m/s^2ですかね。

    • imo より:

      匿名さん、サイト拝見下さり有難う御座います。また補足についてはおっしゃる通りかと思います。確かに少し分かり難かったので本文修正しておきました。0.3Gも有難う御座います。うっかりしてました。1/3倍で計算してましたね・・・。恥ずかしいミスです。(本文は修正しておきました)

タイトルとURLをコピーしました