カラクリの館

関西学院大学神戸三田キャンパスにて活動しているものづくり団体「機巧堂」です。メンバーが思い思いに綴ります。

c言語を再履修した俺でも分かる制御工学シリーズ-1

RC回路のステップ応答

c言語でわかる制御工学-その1

 

こんにちは、c言語でわかる制御工学シリーズを始めようと思います。

このシリーズは、制御工学の教科書でよくある「MATLAB」を用いた教科書にMATLABなんてもってないわ!っというツッコミを入れた人向けのシリーズです。また、c言語でPID制御のプログラムってどうやって書くの?っていう人の手助けにもなるかも知れません。

 

必要なものは、c言語を実行できるPCと、高校卒業レベルの物理とラプラス変換の知識です。

 

さて、第一回はRC回路の単位ステップ応答のシミュレーションです。

RC回路とは抵抗とコンデンサーからなる電気回路のことです。今回はR=1.0,C=1.0としています。

この回路に入力としてVi=1[V]を入力します。またコンデンサーにおける電位差Vo[V]を出力とします。

 

f:id:karakuridoh:20170211011346p:plain

 

まずはプログラムを読んでみてください。物理が得意な方はすぐに理解できるかもしれません。ピンとこない方はこれから下の説明を読んでみてください。ちなみに厳密な説明ではありませんのであしからず。

 

ではコンデンサーにおける電位差が出力であるので、これを求める方法を考えてみましょう。

 

まず、キルヒホッフの第二法則から以下のことが成り立ちます。

[入力電圧] = [抵抗における電位差] + [コンデンサーにおける電位差]

 

それでは、各素子における電流と電位差について考えてみましょう。

 

[その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コンデンサーを流れるのでコンデンサーに溜まった電気量は、

dQ = dQ + I*0.1

 

では時刻t=0.1の時、コンデンサーにおける電位差は

dVo = dQ/C

 

というわけで、抵抗における電位差Vr

Vr = Vi – dVo

 

よって抵抗に流れる電流は

I = Vr/R

 

さて、時刻t=0.1からt=0.2までの間、電流Iコンデンサーを流れるのでコンデンサーに溜まった電気量は、

dQ = dQ + I*0.1

 

…こうして時刻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言語でシミュレーションする方法について紹介します。