c言語を再履修した俺でも分かる制御工学シリーズ-1
c言語でわかる制御工学-その1
こんにちは、c言語でわかる制御工学シリーズを始めようと思います。
このシリーズは、制御工学の教科書でよくある「MATLAB」を用いた教科書にMATLABなんてもってないわ!っというツッコミを入れた人向けのシリーズです。また、c言語でPID制御のプログラムってどうやって書くの?っていう人の手助けにもなるかも知れません。
必要なものは、c言語を実行できるPCと、高校卒業レベルの物理とラプラス変換の知識です。
さて、第一回はRC回路の単位ステップ応答のシミュレーションです。
RC回路とは抵抗とコンデンサーからなる電気回路のことです。今回はR=1.0,C=1.0としています。
この回路に入力としてVi=1[V]を入力します。またコンデンサーにおける電位差Vo[V]を出力とします。
まずはプログラムを読んでみてください。物理が得意な方はすぐに理解できるかもしれません。ピンとこない方はこれから下の説明を読んでみてください。ちなみに厳密な説明ではありませんのであしからず。
ではコンデンサーにおける電位差が出力であるので、これを求める方法を考えてみましょう。
まず、キルヒホッフの第二法則から以下のことが成り立ちます。
[入力電圧] = [抵抗における電位差] + [コンデンサーにおける電位差]
それでは、各素子における電流と電位差について考えてみましょう。
[その1]
抵抗における電流は、抵抗における電位差によって定義される。
これはI=V/Rのことです。
[その2]
コンデンサーに溜まった電気量は、流れた電流の総和である。
つまり、Q = [電流i(t)の時間積分]
[その3]
コンデンサーにおける電位差は、溜まった電気量がわかればわかる。
これはV=Q/Cの事です。
つまり、すべての時刻における回路に流れる電流がわかれば、すべての素子における電位差もわかるということがわかりますね。とにかく電流が知りたいわけです。
では初期条件から時刻0.0の時に回路にどのような電流が流れるのかを考えてみます。
時刻0.0において、コンデンサーにおける電荷はdQ=0であるので、当然コンデンサーにおける電位差はdVo=0です。
では抵抗における電位差をVrとします。
Vr = Vi – dVo = Vi – 0 = Vi
ということでt=0.0において回路に流れる電流I(t)は、
I(0.0) = Vr/R = Vi/R = 1/R
さて、時刻t=0.0からt=0.1までの間、電流Iがコンデンサーを流れるのでコンデンサーに溜まった電気量は、
では時刻t=0.1の時、コンデンサーにおける電位差は
dVo = dQ/C
というわけで、抵抗における電位差Vrは
Vr = Vi – dVo
よって抵抗に流れる電流は
I = Vr/R
さて、時刻t=0.1からt=0.2までの間、電流Iがコンデンサーを流れるのでコンデンサーに溜まった電気量は、
…こうして時刻50.0までfor文が回ります。
このプログラム本当に正しいの?という疑問もあると思うの手計算で確認してみましょう。
このへんはどの制御工学の教科書にも書いてある内容なので詳しくは説明しません。
まず、回路の微分方程式は
Vi(t) = RC*dVo/dt(t) + Vo(t)
ラプラス変換して
Vi(s) = (RCs+1)*Vo(s)
伝達関数は
G(s) = 1/(RCs+1)
このシステムに単位ステップ入力Us(t)=1を入力すると、
y(t)=逆ラプラス[y(s)]=1-exp((-1/RC)*t)
これによりy(t)が63.2%の出力になる時の時刻が時定数であるから、時定数T=RC=1.0であることがわかります。では実際の出力結果を見てみましょう。
TIME=1.000000,Vo=0.651322
本当はVo=0.632となってほしいところですが、0.1刻みで近似積分しているのでこんなものでしょう。
第一回目は一次遅れのステップ応答のシミュレーションでした、次回は一次遅れのP制御についてc言語でシミュレーションする方法について紹介します。