DCmotorモデル作成

多少需要があるらしいのでまとめます。
ちなみにシミュレーションは素人ですので何か間違いあったら指摘してくださるとうれしいです。
長いです

準備

scilab5.2をインストールしてください。
今回はmaxonのRE30の24V品をモデルとして設計を行います。

Xcos

scilab5.2以前はXcosではなくscicosだったが5.2からXcosに変更されて中途半端に日本語対応になった。
とりあえずscilabを起動したら

うえのようにしてXcosを起動。
起動したらパレットビューとブロックを配置するウィンドウが起動する。

とりあえず作る

まず、モータの電気回路モデルについて簡単に説明
DCモータの電気的な等価回路は下になる。

数式で言うと
v=L\frac{di}{dt}+Ri+E
である。
それでこれを伝達関数で表すと
\frac{v-E}{i}=Ls+R
であり、電圧を入力して電流を求める形に直せば
\frac{i}{v-E}=\frac{1}{Ls+R}
であるので、電気回路の伝達関数がわかる。
電気回路の伝達関数がわかったので、早速Xcosに入力する。
とりあえずパレットから伝達関数をドラックする。

ドラックしたらダブルクリックで伝達関数の編集画面を立ち上げる

ここでNumerator(s)は伝達関数の分子、Denominator(s)は伝達関数の分母を表す。
先ほど電気回路の伝達関数を求めているのでそのまま入力すればいい。
今回はRE30の24V品をモデル化するので、maxonデータシートから値を拾ってくればいい。
maxonカタログよりL=0.119mH,R=0.611Ω。よって

と入力すればいい。
ここで電圧を入力したら電流が出てくる伝達関数が完成した。
DCモータでは電流=トルクと考えていいので、電流にある係数をかければトルクが求まる。つまり先ほどの伝達関数の出力にあるゲインをかければトルクになる。そのゲインもデータシートから拾ってくればいい。
その定数をKtとしてカタログよりKt=25.9mNm/Aである。ここで今回はすべてSI単位系にあわせて計算することにする。
よってSI単位系ではトルクはNm/AであるためKt=25.9E-3Nm/Aである。
Xcosでゲインはパレットビューから

をドラッグしてダブルクリックでゲインを編集する。

ここまででトルクを求められるようになった。あとは機械系の伝達関数(トルクを入力して速度を出力する伝達関数)がわかればいい。
ここで今回はモータのイナーシャのみのモデルとして作成することにする。モータのイナーシャのみということはつまり無負荷である。
とするとモータのイナーシャもmaxonカタログにあるから拾ってくればいい。モータのイナーシャをJmとすると
Jm=33.3gcm2となっているここでイナーシャのSI単位系はkgm2であるため、Jm=33.3/100/100/1000kgm2である。
イナーシャがわかった。さてイナーシャのみのモデルの機械系の伝達関数
\frac{\tau}{\omega}=\frac{1}{Jms}
である。
さきほど同様に伝達関数のブロックに入力すればいい。
ここまででトルクが求まった。
しかしモータには誘起電圧(逆起電力)が存在する。誘起電圧はモータの回転数に比例して増加するため、速度がわかっていれば求めることができる。
よって次のようなブロックで速度出力にたいしてゲインをかけてやり、求めた誘起電圧を印可電圧から引いてやればモータモデルが完成する。

さてここで速度の単位はrad/sである。DCモータでは通常1回転が2\piである。つまり1秒間に一回転で2\pi[rad/s]である。
ここでmaxonカタログから逆起電圧定数をよみとると369[rpm/V]となっている。つまり逆起電圧1Vが発生したときにモータは1分あたり369回転しているということになる。これを単位換算して[V/rad/s]に直す。
rpm=rps*60
rps=\frac{\frac{rad}{s}}{2\pi}
であるので
\frac{V}{\frac{rad}{s}}=\frac{1}{\frac{\frac{rpm}{V}}{60}*2\pi}
である。

とにゅうりょくすればいい。
ここでまででモータのモデルが一応完成したはずである。
とりあえずシミュレーションで確かめてみよう。
まず電圧を印可するために今回はSTEPfunctionをつかう。

適当な場所に配置して、パラメータを次のようにセットする。

ここでsteptimeはFinalvalueの値になる時間であり、inital Valueは初期値、FinalValueはステップする値である。
そして、シミュレーション結果を表示するために、次のブロックを利用する。
Clock

Cscope

まずクロックはある時間ごとにイベントトリガを発生するブロック
次にCScopeはイベントトリガがある度に入力されている値をロギングしてグラフ化してくれるブロックである。
とりあえず今回は、電流と速度のログを取りたいのでCscopeを二つとClockを一つ配置する。
まずクロックのブロックの設定を行う。

Periodはイベントトリガを起こす間隔で、InitTimeは初期値である。
次にCscope
まず速度

次に電流

さてここで速度のログがrad/sだとわかりにくいのでrpm/sに戻しておく。
単純にゲインブロックを使えばいい。

最終的なブロックは次のようになっている

これでブロックのシミュレーション準備ができたので、実行したいところだけどその前にシミュレーションの設定を行う。

うえのセットアップをクリックして、

このウィンドウでシミュレーション時間等を設定する。デフォルトで実行すると10万秒という時間行うのでやってられない。今回のならまぁ10秒もあれば十分なので設定し直す。

ここまできたら実行するのみである。

結果は下のような感じである
速度

電流

検証

とりあえずシミュレーション結果が出たがモデルが正しくできてるか簡単にチェックする。
まず電流の波形をみると最大値がだいたい40A近くになって緩やかに下がり残りはほとんど0Aである。
さてここで電流の最大値が40Aだがざっくり抵抗と電圧の関係から計算すると。
24/0.611=39.27A
つまりコイル成分を考えなければ39.27A流れる。瞬間的に40A近くが流れるが0Aに収束するのは機械系に粘性が全くないからである。あとは電気的な時定数はL/Rでもとまるのでそちらも確認するのもいいかもしれない。しかし電気的な時定数は約119usecくらいであるためmsecオーダーシミュレーションでは確認するのは難しい。clockブロックをいじれば可能だがものすごく時間がかかるので今回は確認しない。
次に回転数の確認をする。今回は簡単に無負荷最高回転数のみを確認する。無負荷最高回転数はmaxonカタログより、8810rpmである。グラフを確認すると最高回転数は8850rpm付近であるため、カタログ値よりも微妙に大きいがこの程度は誤差の範囲だろうと思う。maxonがどのように最高回転数を規定しているかにもよるけど、この微妙な誤差の要因は摩擦等の要素を考慮していないところによるかもしれない。そもそもモータのカタログ事態の値はだいたい10%くらいの誤差を持つものなので(と聞いている)、そこまで厳密性を出すのは難しい。

発展

とりあえずDCモータモデルができたならば簡単にPID制御のシミュレーションくらいはできる。
ただ気をつければならないのはリミットの扱い。線形制御であるため、リミットをかけないと際限なく電圧がかけられる事態が発生したりするのでご注意を。

とりあえずこの後は電流制御に発展したりするのもいいかもしれない。
速度制御になったらモータは理想的なトルク発生器とみなして電気系は省くとシミュレーションの速度的に楽。
ちなみに言うまでもないけど位置制御なら速度を積分すればいい。

現実との関連性

とりあえず制御の方向性を確認したりするのには十分だと思う。離散系に書き直すのもありだけど、おそらくそこまでの手間をしてもそこまで厳密なシミュレーションは難しいと考える。
後はどのようなシミュレーションをするかにもよるけど考慮しなければいけないことは多い。
電圧入力は実際の制御ではPWM方式を採用することが多いのでデッドタイムによる誤差や、微妙な位相誤差がでてくるし、制御系の無駄時間も考慮しなければならなくなると思う。あとはセンサの分解能(量子化誤差)、離散化誤差もあるので、シミュレーションと現実の制御では小さいな違いが多くある。あとはモータで考慮する要因として大きいものの一つが熱問題だと思う。今回のモデルでは熱に対しては全く考慮を行っていないので再現なく定常で電流が流せる。しかし実際問題そんなことしたらモータが焼ける。あと長時間稼働ならば焼けるまではなくてもモータの熱によりモータ内部のパラメータが大きく変化する。

いろいろ書いたが、シミュレーションができるっていうのは制御において損ではないのでやってみるのがいいかもしれない。