渡邊組活動報告 その1
どうも、ワタナベ改め組長です。
外部の方向けに少し説明すると、
渡邊組は、機巧堂の中でもロボットを作りたい人が集まっているグループです。
当初渡邊組は、機巧堂の中でモノづくりへの情熱を燻らせていたメンバーの為に、
当時(前の前)の代表が作った、いわば受け皿的なグループでした。
しかし今では、新旧会計の二人を中心に、
その熱情を日々ロボットに爆発させています。
興味のある方は是非機巧堂へ!!
活動報告します。
渡邊組再起動時の会議で、
二足歩行ロボット(とにかく歩くロボット)の作成を一つの目標にして
動く事が決まりました。
今日までに出来たことは、
・サーボモーターやRaspberry Piなど今後の活動に必要と思われる部品や道具の買い出し
・サーボモーターの初期化
・試作一号機の脚部の作成
などです。
↑Rasberry Piを動かしている様子 ↑試作一号機の脚
また、ロボット作成の為の環境作りや遊びとして、
・Rasberry Piを使った簡易的なカメラの作成
・フィードバック制御の勉強
なども行いました。
やることは沢山あるので、また報告します。ドローンもできたらいいですね。
これを機に、YouTubeへの動画アップロードもはじめてみました... |ロ゜)ハッ!
c言語を再履修した俺でもわかる制御工学シリーズ-3
c言語でわかる制御工学-その3:一次遅れのPI制御
こんにちは、今回はついにRC回路のPI制御です。一次遅れの伝達関数を持つシステムをPI制御しようと思います。
それでは、PI制御について簡単に説明します。まずはプログラムを読んでみてください。
さて、まずはじめにPI制御の概要について説明します。入力は比例動作と積分動作の和になります。
[制御入力] = [比例動作] + [積分動作]
比例動作のゲインをPとすると、比例動作は偏差を比例ゲインで掛けたものになります。
[比例動作] = P*[偏差]
次に積分動作についてです。積分動作のゲインをIとすると、積分動作は入力を開始した時刻0から現在の時刻までの偏差の時間積分に、積分ゲインを掛けたものになります。
実際にゲインのパラーメーターを変更することで、応答にどのような変化が起こるのかを実験します。P=1.0, I=1.0, 目標値は前回同様1.0です。
この時、出力結果は、オーバーシュートなし、±5[%]の制定時間は3.00[s]でした。
TIME=3.00 Vo=0.950207
実は、この時の応答は、R=C=1.0のステップ応答にほぼ一致します。
(下の結果は第一回目のステップ応答のプログラムを0.01刻みに変更しています)
[ステップ応答]
TIME=1.000000 Vo=0.633968
[PI制御]
TIME=1.00 Vo=0.635809
これは零点と極が一致したために起こったことですが、これについて詳しくは次回にします。
次にP=1.0で固定して、Iの値を変化させることで、応答がどう変化するのかを実験してみましょう。
Iを大きくするとオーバーシュートが発生するので、Tdを行き過ぎ時間、P.Oをパセントオーバーシュートとして、応答を評価します。
GAIN_P=1.000000 GAIN_I=2.000000
Td=2.34 P.O=6.6109[%]
GAIN_P=1.000000 GAIN_I=3.000000
Td=1.77 P.O=13.6034[%]
GAIN_P=1.000000 GAIN_I=4.000000
Td=1.50 P.O=19.0387[%]
このように、I=1.0から少しずつIを大きくすると、Tdが小さくなり、P.Oは大きくなります。つまり、速応性は上がるものの、オーバーシュートは増加し不安定になります。
では逆にI=1.0から少しずつIを小さくすると、どをのように変化するのでしょうか試してみましょう。
GAIN_P=1.000000 GAIN_I=0.500000
オーバーシュートなし。±[5]制定時間8.00[s]
GAIN_P=1.000000 GAIN_I=0.100000
オーバーシュートなし。±[5]制定時間44.90[s]
このように、Iを小さくするとオーバーシュートはなくなり、応答は遅くなっていきます。
では、次にI=1.0に固定してPを大きくします。すると、オーバーシュートなくなり、応答が速くなります。これは一次遅れのステップ応答に似ているので、出力が63.2[%]になるまでにかかる時間で応答の特性を評価します。
GAIN_P=2.000000 GAIN_I=1.000000
TIME=0.60 Vo=0.634370
GAIN_P=3.000000 GAIN_I=1.000000
TIME=0.39 Vo=0.631785
GAIN_P=4.000000 GAIN_I=1.000000
TIME=0.28 Vo=0.628745
このように、Pを大きくするほど出力が63.2[%]が小さくなるので、応答が速くなることがわかりました。
今度はPを1より小さくするとオーバーシュートが発生します。
GAIN_P=0.500000 GAIN_I=1.000000
Td=4.01 P.O=3.4041[%]
GAIN_P=0.100000 GAIN_I=1.000000
Td=3.64 P.O=12.6041[%]
このように、Pを小さくするほどオーバーシュートは大きくなるが、行き過ぎ時間Tdは小さくなるため、速応性は上昇したとわかります。
この結果から、Pを1より大きくしても小さくしても速応性は上昇するという結果がわかりました。
内容が膨大になるため、今回の実験でなぜこのような結果になったのかは説明しませんでした。次回は今回の結果を、制御系全体の閉ループ伝達関数の極と零点から説明したいと思います。
菓子くり堂 チョコムース
やっほーバレンタイン
どうも、カラオケの十八番はハクナ・マタタ。現代表のじょなさんです。そのうち代表やめます。(ここまで挨拶)
菓子くり堂と題しまして、製作物報告をしていこうと思います。
シリーズ化するかは未定です。
あくまで製作報告なのでレシピとしては載せません。
2月14日ですね。ということでチョコムース作りましたさっき。(20時現在)
私は遅筆なので書いている間に冷蔵庫の中でチョコムースが固まって完成するという算段です。
ではまず材料。
板チョコ
主役。こいつを入れなかったらただのミルクムースとかになると思いますたぶん。
バレンタインなので特価でした。
牛乳、生クリーム
濃厚さを演出。量もこいつのおかげで増量されました。
卵白、卵黄
卵とは書かない。
卵白は泡立ててメレンゲに。ムースのふわふわ感要員。
卵黄については知らないです。なんか入れました。
グラニュー糖
砂糖。甘い。
スティックシュガーを8本くらい使いました。
ゼラチン
まとめ役。こいつを入れなければただの甘い泡です。
製作開始
ゼラチンを先にふやかしたり、チョコを砕いたりします。
卵黄にグラニュー糖をスティックシュガー2本分くらい入れました。
この時点でもうすでに匂いが甘い。
牛乳を火にかけて沸騰しないくらいまで温めてからチョコを投入して溶かします。
たぶんミルクココアみたいな味になってそう。
そして混ぜる。
メレンゲする。
グラニュー糖を入れてからの方が泡立ちがいいです。
ハンドミキサー様々。
メレンゲができました。
このまま焼いてメレンゲクッキーにするのも好きです。
続いて生クリームも泡立てます。
グラニュー糖投入。砂糖を入れないとただただ濃厚な泡です。
角が立つまで。
そしてチョコ・牛乳・卵黄・砂糖の混合物にメレンゲを投入。
さっくりさっくり混ぜないとメレンゲが死にます。
このときやっとボールが小さかったことに気づきました。
この時点で8割方チョコムースです。
生クリームに投入。
この混ざりかけのマーブルにときめきを感じます。
同じくさっくりさっくり。
混ぜ終わり。
このまま冷やしてバケツチョコムースにするのもありですね。ロマン。
小分けにして冷蔵庫で固まるまで冷やします。
完成。
考察
あんまい。
とても甘い。食パンに塗って食べたいくらい甘い。
超甘党の人には好かれると思われる。
チョコレート板2枚とスティックシュガー8本分の甘さなだけある納得の甘さ。
カップを小さめの紙コップにしてちょうどいい量だと思われる。
クッキーやケーキにはこれ以上の量の砂糖が加えられているわけだが、小麦粉やバターの味が勝っているのだろうと思った。
あとボールのサイズは後々を考えて選ぶべき。
泡立てるときはやや小さめのボールの方が適している。
少し多く作ってしまったので、明日学校で会った人に適当に押し付けます。
余談ですが、製作中のBGMは「なんかのサナギ」でした。
以上、解散。
c言語を再履修した俺でも分かる制御工学シリーズ-2
c言語でわかる制御工学-その2:一次遅れのP制御
こんにちは、第二回目は一次遅れの伝達関数を持つシステムをP制御してみたいと思います。
次回は一次遅れの伝達関数を持つシステムを極指定法でPI制御する予定です。
まずはプログラムを読んでみましょう。
これからプログラムの解説を始めます。と言っても前回からの変更点の説明のみです。
[前回のプログラム:rc-step.c]
一次遅れのステップ応答です。
入力の値は何があっても変化しません。ずっと単位ステップ入力Us(t)=1でした。
[今回のプログラム:rc-feed.c]
前回のプログラムに関数を一つ追加しました。
回路に印加する電圧、つまり入力は関数によって以下のように定義されます。
[入力] = [比例ゲイン] * ([目標値] - [出力])
そして、今回は比例ゲインは1、目標値は1に設定してありますので、
[入力] = 1 - [出力]
それでは、フィードバックした場合とフィードバックしない場合でどのような違いがあるのかを、シミュレーションを通して考えていきます。
まず今回のプログラムrc-feed.cのRとCの値は前回の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.5、C=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
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言語でシミュレーションする方法について紹介します。