読者です 読者をやめる 読者になる 読者になる

カラクリの館

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

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

古典制御

RC回路のP制御

 

c言語でわかる制御工学-その2:一次遅れのP制御

 

f:id:karakuridoh:20170211011346p:plain

こんにちは、第二回目は一次遅れの伝達関数を持つシステムをP制御してみたいと思います。

次回は一次遅れの伝達関数を持つシステムを極指定法でPI制御する予定です。

 

まずはプログラムを読んでみましょう。

 

これからプログラムの解説を始めます。と言っても前回からの変更点の説明のみです。

 

[前回のプログラム:rc-step.c]

一次遅れのステップ応答です。

入力の値は何があっても変化しません。ずっと単位ステップ入力Us(t)=1でした。

 

[今回のプログラム:rc-feed.c]

前回のプログラムに関数を一つ追加しました。

回路に印加する電圧、つまり入力は関数によって以下のように定義されます。

 

[入力] = [比例ゲイン] * ([目標値] - [出力])

 

そして、今回は比例ゲインは1、目標値は1に設定してありますので、

 

[入力] = 1 - [出力]

 

それでは、フィードバックした場合とフィードバックしない場合でどのような違いがあるのかを、シミュレーションを通して考えていきます。

 

まず今回のプログラムrc-feed.cRCの値は前回のrc-step.cと同じR=C=1.0です。

では実際に出力結果を見てみましょう。

 

 

[rc-feed.c]

TIME=0.100000,Vo=0.100000

TIME=0.200000,Vo=0.180000

TIME=0.300000,Vo=0.244000

TIME=0.400000,Vo=0.295200

TIME=0.500000,Vo=0.336160

TIME=0.600000,Vo=0.368928

TIME=0.700000,Vo=0.395142

TIME=0.800000,Vo=0.416114

TIME=0.900000,Vo=0.432891

TIME=1.000000,Vo=0.446313

TIME=1.100000,Vo=0.457050

TIME=1.200000,Vo=0.465640

TIME=1.300000,Vo=0.472512

--

TIME=5.700000,Vo=0.499999

TIME=5.800000,Vo=0.499999

TIME=5.900000,Vo=0.499999

TIME=6.000000,Vo=0.499999

TIME=6.100000,Vo=0.499999

TIME=6.200000,Vo=0.500000

TIME=6.300000,Vo=0.500000

TIME=6.400000,Vo=0.500000

TIME=6.500000,Vo=0.500000

 

 

 

 

結果をみると、定常値0.5、時定数0.5の一次遅れのステップ応答のように見えますね。

実際、一巡伝達関数L(s)を閉ループ伝達関数W(s)になおすと以下のとおりになります。

 

W(s) = L(s) / (L(s)+1)

 

では今回のL(s) = 1 / (s+1)を代入すると、

 

W(s) = 1 / (s+2) = 0.5 / (0.5s +1)

 

では、それをふまえて前回のプログラムrc-step.cを、制御量(出力)0.5倍、そしてR=0.5C=1.0に変更して実行し、本当にあっているか試してみます。

(注意:dVo=dVo/2.0とプログラムを書き直すとC=2.0と同じことになってしまうので間違いです。)

 

 

[rc-step.c]

TIME=0.100000,Vo=0.100000

TIME=0.200000,Vo=0.180000

TIME=0.300000,Vo=0.244000

TIME=0.400000,Vo=0.295200

TIME=0.500000,Vo=0.336160

TIME=0.600000,Vo=0.368928

TIME=0.700000,Vo=0.395142

TIME=0.800000,Vo=0.416114

TIME=0.900000,Vo=0.432891

TIME=1.000000,Vo=0.446313

TIME=1.100000,Vo=0.457050

TIME=1.200000,Vo=0.465640

TIME=1.300000,Vo=0.472512

--

TIME=5.700000,Vo=0.499999

TIME=5.800000,Vo=0.499999

TIME=5.900000,Vo=0.499999

TIME=6.000000,Vo=0.499999

TIME=6.100000,Vo=0.499999

TIME=6.200000,Vo=0.500000

TIME=6.300000,Vo=0.500000

TIME=6.400000,Vo=0.500000

TIME=6.500000,Vo=0.500000

 

このステップ応答の結果はC=R=1.0におけるrc-feed.cの結果と完全に一致しました。

 

というわけで今の実験をまとめると、

・あるシステムを目標値1で直結フィードバックにして実行してみた。

・一巡伝達関数を閉ループ伝達関数に直した。

・閉ループ伝達関数のステップ応答を求めると完全に一致した。

 

このようにフィードバック回路の等価変換が正しく行えたかを検証しました。

 

これでようやくP制御の前準備ができました。

 

あとはプログラムのGAIN_Pの値を変化させることで、どのように応答が変化するかを試してみましょう。

 

さて、rc-feed.cで目標値1、C=R=1.0として、GAIN_Pの値を変えて定常値と比例ゲインの関係を見てみましょう。

 

まず、比例ゲインを0.5,1.0,2.0,5.0と順に上げていった際の応答は、

 

[P=0.5]

TIME=0.1 Vo=0.050000 P=0.500000

TIME=0.2 Vo=0.092500 P=0.475000

TIME=0.3 Vo=0.128625 P=0.453750

TIME=0.4 Vo=0.159331 P=0.435688

TIME=0.5 Vo=0.185432 P=0.420334

TIME=0.6 Vo=0.207617 P=0.407284

TIME=0.7 Vo=0.226474 P=0.396192

TIME=0.8 Vo=0.242503 P=0.386763

TIME=0.9 Vo=0.256128 P=0.378748

TIME=1.0 Vo=0.267709 P=0.371936

TIME=1.1 Vo=0.277552 P=0.366146

TIME=1.2 Vo=0.285919 P=0.361224

TIME=1.3 Vo=0.293032 P=0.357040

TIME=1.4 Vo=0.299077 P=0.353484

TIME=1.5 Vo=0.304215 P=0.350462

TIME=1.6 Vo=0.308583 P=0.347892

TIME=1.7 Vo=0.312296 P=0.345709

TIME=1.8 Vo=0.315451 P=0.343852

TIME=1.9 Vo=0.318134 P=0.342274

TIME=2.0 Vo=0.320413 P=0.340933

TIME=2.1 Vo=0.322351 P=0.339793

TIME=2.2 Vo=0.323999 P=0.338824

TIME=2.3 Vo=0.325399 P=0.338001

TIME=2.4 Vo=0.326589 P=0.337301

TIME=2.5 Vo=0.327601 P=0.336705

TIME=2.6 Vo=0.328461 P=0.336200

TIME=2.7 Vo=0.329192 P=0.335770

TIME=2.8 Vo=0.329813 P=0.335404

TIME=2.9 Vo=0.330341 P=0.335094

TIME=3.0 Vo=0.330790 P=0.334830

TIME=3.1 Vo=0.331171 P=0.334605

TIME=3.2 Vo=0.331496 P=0.334414

TIME=3.3 Vo=0.331771 P=0.334252

TIME=3.4 Vo=0.332006 P=0.334114

TIME=3.5 Vo=0.332205 P=0.333997

TIME=3.6 Vo=0.332374 P=0.333898

TIME=3.7 Vo=0.332518 P=0.333813

TIME=3.8 Vo=0.332640 P=0.333741

TIME=3.9 Vo=0.332744 P=0.333680

TIME=4.0 Vo=0.332833 P=0.333628

TIME=4.1 Vo=0.332908 P=0.333584

TIME=4.2 Vo=0.332972 P=0.333546

TIME=4.3 Vo=0.333026 P=0.333514

TIME=4.4 Vo=0.333072 P=0.333487

TIME=4.5 Vo=0.333111 P=0.333464

TIME=4.6 Vo=0.333144 P=0.333444

TIME=4.7 Vo=0.333173 P=0.333428

TIME=4.8 Vo=0.333197 P=0.333414

TIME=4.9 Vo=0.333217 P=0.333402

TIME=5.0 Vo=0.333235 P=0.333391

TIME=5.1 Vo=0.333250 P=0.333383

TIME=5.2 Vo=0.333262 P=0.333375

TIME=5.3 Vo=0.333273 P=0.333369

TIME=5.4 Vo=0.333282 P=0.333364

TIME=5.5 Vo=0.333290 P=0.333359

TIME=5.6 Vo=0.333296 P=0.333355

TIME=5.7 Vo=0.333302 P=0.333352

TIME=5.8 Vo=0.333306 P=0.333349

TIME=5.9 Vo=0.333310 P=0.333347

TIME=6.0 Vo=0.333314 P=0.333345

TIME=6.1 Vo=0.333317 P=0.333343

TIME=6.2 Vo=0.333319 P=0.333342

TIME=6.3 Vo=0.333321 P=0.333340

TIME=6.4 Vo=0.333323 P=0.333339

TIME=6.5 Vo=0.333325 P=0.333338

TIME=6.6 Vo=0.333326 P=0.333338

TIME=6.7 Vo=0.333327 P=0.333337

TIME=6.8 Vo=0.333328 P=0.333336

 

[P=1.0]

TIME=0.1 Vo=0.100000 P=1.000000

TIME=0.2 Vo=0.180000 P=0.900000

TIME=0.3 Vo=0.244000 P=0.820000

TIME=0.4 Vo=0.295200 P=0.756000

TIME=0.5 Vo=0.336160 P=0.704800

TIME=0.6 Vo=0.368928 P=0.663840

TIME=0.7 Vo=0.395142 P=0.631072

TIME=0.8 Vo=0.416114 P=0.604858

TIME=0.9 Vo=0.432891 P=0.583886

TIME=1.0 Vo=0.446313 P=0.567109

TIME=1.1 Vo=0.457050 P=0.553687

TIME=1.2 Vo=0.465640 P=0.542950

TIME=1.3 Vo=0.472512 P=0.534360

TIME=1.4 Vo=0.478010 P=0.527488

TIME=1.5 Vo=0.482408 P=0.521990

TIME=1.6 Vo=0.485926 P=0.517592

TIME=1.7 Vo=0.488741 P=0.514074

TIME=1.8 Vo=0.490993 P=0.511259

TIME=1.9 Vo=0.492794 P=0.509007

TIME=2.0 Vo=0.494235 P=0.507206

TIME=2.1 Vo=0.495388 P=0.505765

TIME=2.2 Vo=0.496311 P=0.504612

TIME=2.3 Vo=0.497049 P=0.503689

TIME=2.4 Vo=0.497639 P=0.502951

TIME=2.5 Vo=0.498111 P=0.502361

TIME=2.6 Vo=0.498489 P=0.501889

TIME=2.7 Vo=0.498791 P=0.501511

TIME=2.8 Vo=0.499033 P=0.501209

TIME=2.9 Vo=0.499226 P=0.500967

TIME=3.0 Vo=0.499381 P=0.500774

TIME=3.1 Vo=0.499505 P=0.500619

TIME=3.2 Vo=0.499604 P=0.500495

TIME=3.3 Vo=0.499683 P=0.500396

TIME=3.4 Vo=0.499746 P=0.500317

TIME=3.5 Vo=0.499797 P=0.500254

TIME=3.6 Vo=0.499838 P=0.500203

TIME=3.7 Vo=0.499870 P=0.500162

TIME=3.8 Vo=0.499896 P=0.500130

TIME=3.9 Vo=0.499917 P=0.500104

TIME=4.0 Vo=0.499934 P=0.500083

TIME=4.1 Vo=0.499947 P=0.500066

TIME=4.2 Vo=0.499957 P=0.500053

TIME=4.3 Vo=0.499966 P=0.500043

TIME=4.4 Vo=0.499973 P=0.500034

TIME=4.5 Vo=0.499978 P=0.500027

TIME=4.6 Vo=0.499983 P=0.500022

TIME=4.7 Vo=0.499986 P=0.500017

TIME=4.8 Vo=0.499989 P=0.500014

TIME=4.9 Vo=0.499991 P=0.500011

TIME=5.0 Vo=0.499993 P=0.500009

TIME=5.1 Vo=0.499994 P=0.500007

TIME=5.2 Vo=0.499995 P=0.500006

TIME=5.3 Vo=0.499996 P=0.500005

TIME=5.4 Vo=0.499997 P=0.500004

TIME=5.5 Vo=0.499998 P=0.500003

TIME=5.6 Vo=0.499998 P=0.500002

TIME=5.7 Vo=0.499999 P=0.500002

TIME=5.8 Vo=0.499999 P=0.500001

TIME=5.9 Vo=0.499999 P=0.500001

TIME=6.0 Vo=0.499999 P=0.500001

TIME=6.1 Vo=0.499999 P=0.500001

TIME=6.2 Vo=0.500000 P=0.500001

TIME=6.3 Vo=0.500000 P=0.500000

 

[P=2.0]

TIME=0.1 Vo=0.200000 P=2.000000

TIME=0.2 Vo=0.340000 P=1.600000

TIME=0.3 Vo=0.438000 P=1.320000

TIME=0.4 Vo=0.506600 P=1.124000

TIME=0.5 Vo=0.554620 P=0.986800

TIME=0.6 Vo=0.588234 P=0.890760

TIME=0.7 Vo=0.611764 P=0.823532

TIME=0.8 Vo=0.628235 P=0.776472

TIME=0.9 Vo=0.639764 P=0.743531

TIME=1.0 Vo=0.647835 P=0.720471

TIME=1.1 Vo=0.653484 P=0.704330

TIME=1.2 Vo=0.657439 P=0.693031

TIME=1.3 Vo=0.660207 P=0.685122

TIME=1.4 Vo=0.662145 P=0.679585

TIME=1.5 Vo=0.663502 P=0.675710

TIME=1.6 Vo=0.664451 P=0.672997

TIME=1.7 Vo=0.665116 P=0.671098

TIME=1.8 Vo=0.665581 P=0.669768

TIME=1.9 Vo=0.665907 P=0.668838

TIME=2.0 Vo=0.666135 P=0.668187

TIME=2.1 Vo=0.666294 P=0.667731

TIME=2.2 Vo=0.666406 P=0.667411

TIME=2.3 Vo=0.666484 P=0.667188

TIME=2.4 Vo=0.666539 P=0.667032

TIME=2.5 Vo=0.666577 P=0.666922

TIME=2.6 Vo=0.666604 P=0.666845

TIME=2.7 Vo=0.666623 P=0.666792

 

[P=5.0]

TIME=0.1 Vo=0.500000 P=5.000000

TIME=0.2 Vo=0.700000 P=2.500000

TIME=0.3 Vo=0.780000 P=1.500000

TIME=0.4 Vo=0.812000 P=1.100000

TIME=0.5 Vo=0.824800 P=0.940000

TIME=0.6 Vo=0.829920 P=0.876000

TIME=0.7 Vo=0.831968 P=0.850400

TIME=0.8 Vo=0.832787 P=0.840160

TIME=0.9 Vo=0.833115 P=0.836064

TIME=1.0 Vo=0.833246 P=0.834426

TIME=1.1 Vo=0.833298 P=0.833770

TIME=1.2 Vo=0.833319 P=0.833508

TIME=1.3 Vo=0.833328 P=0.833403

TIME=1.4 Vo=0.833331 P=0.833361

TIME=1.5 Vo=0.833332 P=0.833345

TIME=1.6 Vo=0.833333 P=0.833338

TIME=1.7 Vo=0.833333 P=0.833335

TIME=1.8 Vo=0.833333 P=0.833334

TIME=1.9 Vo=0.833333 P=0.833334

TIME=2.0 Vo=0.833333 P=0.833333

 

こういうわけで実験で得た値をまとめると、

[P=0.5]

定常値0.33 時定数0.6-0.7

[P=1.0]

定常値0.50 時定数0.5

[P=2.0]

定常値0.66 時定数0.3

[P=5.0]

定常値0.83 時定数0.1

 

 

R=C=1.0として比例ゲインPと応答の関係をまとめました。

 

定常値:P/(P+1)

時定数:RC / (P+1) = 1 / (P+1)

 

これに実験で使ったPの値を代入して確認してみます。

[P=0.5]

定常値0.33 時定数0.66

[P=1.0]

定常値0.50 時定数0.50

[P=2.0]

定常値0.66 時定数0.33

[P=5.0]

定常値0.83 時定数0.16

 

このように計算値と実験値はだいたい一致しました。0.1刻みでシミュレーヨンしているので完全には一致しません。

 

結果をまとめます。

一次遅れについて、P制御で比例ゲインを大きくすることで時定数が小さくなり、定常値が目標値に近づく。つまり、速応性がよくなり定常偏差が小さくなりました。

 

ここまでの事は基礎的なことなので、制御の教科書にたいてい詳しい説明が書いてあります。

もしわからなければ教科書を読んでみてください。

 

では次回はようやくRC回路のPI制御です。パラメータは極指定法によって決めていこうと思います。ここまでお付き合いいただき、ありがとうございました。

ドローン作成

 初投稿になります。昨年何か作りたいという意思だけでほとんどなにもしていなかったアンドリューです。

初めてなのでどこまでできるかわからないですが、とりあえずドローン作っていきたいと思っています。

最初はあまり手を加えずに参考書籍通りに作っていこうと思います。

というわけで部品等を見てみると合計で4万くらいいきそうです。個人的にはそれでも作ってみたくて、この時間のある春休み中にはある程度形にできればと思っています。

もし協力してくださる方がいれば是非お願いします( ̄^ ̄)ゞ

 

追記

協力してくださる方はコメント欄にコメントしてください

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

日本橋買い出し

こんばんは。ワタナベです。

今日は日本橋の「シリコンハウス」に買い出しに行きました。
f:id:karakuridoh:20170209210452j:image

 

サーボモーターやラズパイを買うのにだいぶお金を使いました。万が一誰も使わないなら……今後もどんどん使うと思います。



テストでした

スペースマンボウ

あれ?????????ブログ開設直後に2週間も更新が途絶えたぞ?????????死んだか?????????

 

 

 

 

 

 

 

 

 

 

 

はい

 

テスト期間なので団体の活動はしてませんでした、ブログのブの字も出てません

しかし順次テストが終わって活動が始まるので期待しましょう

 

初投稿スペースマンボウでした

 

追記:ブログ投稿をTwitterでツイートするときってアカウント選んでツイートするんですね

最初、自動的に機巧堂アカウントでツイートされると思ってたら全然違うアカウントでツイートしてました、恥ずかしかったです

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

やっぱり個人名のカテゴリ作りません?

お題に沿って

今週のお題「2017年にやりたいこと」

テスト期間の中勉強することを放棄してお買い物をしていました。真っ赤な金魚です。

さて、唐突ですが2017年にやりたいこと。

・ロボット制作
ライントレースや、ちょっとした機械仕掛けのもの。特に意味は無いけれど、ロボコンの簡単verで何か自律して動いて欲しいなぁ、とぼんやり考えてます。

木工作品制作
日頃の机上の散乱をなんとかしたい。

・ドローン飛行
ドローンに限らず飛行系に興味があります。

3Dプリンター
今年全く出来なかったので自らのためにも春休みから勉強します。

・プログラミング
勉強して知識をつけて『作りたいもの』の幅を広げたいです。

・手芸
関係ない……と見せかけてどうにか絡めて女の子getだぜ!という作戦です。

以上です。多いです。語るのはタダですよね……?

やりたいことは色々あるのですが何から始めれば良いのかわからないというのが正直現在の状況です。
とりあえず数学と物理とプログラミングと木工と3Dプリンター、と言ってるとキャパオーバーしてしまいますよね。笑

2016年は忙しい忙しいと様々なお話を断っておりとてもどうしようもない後輩であったことを自覚してます。今年こそは……という何処にでもありふれた決意ですが見捨てずにいただければ幸いです。

P.Sエンコーダって一体どんな機械に使われているのか誰か教えていただきたいものです(遠い目)。

棚作りの件で

夜分遅くに申し訳ございません。

杉崎です。
この団体では結構レアな情報科の人間です。

早速本題に入りたいと思います。
プロジェクトルームの混沌を解消するべく
棚を作りたいと思いますが
皆様のご都合は如何でしょうか?

ちなみに作業場所の候補としては

・5号館の工作室(安心して作業ができる!)
・プロジェクトルーム

以上の通り。
もし工作室が使えるのであれば
そこで作業する予定。