PIDシミュレータによるデコーダのモータ制御検討

2006年2月7日 桂庵

 

1.鉄道模型のモータ速度制御とPID制御

デコーダのモータ制御はBEMFと呼ばれる制御が行われています。BEMFとは、モータの逆起電力の事を示しており、正しく言うとBEMFでは制御となりません。鉄道模型における速度制御は、BEMFによりモータの回転数を検出し、目標速度との比較を行い、モータを制御する事になります。この制御をフィードバック制御と言います。もし、目標速度より、実際の速度が遅かった場合は、モータに加える電圧を上げ、もし、実際の速度の方が速い場合は、モータに加える電圧を下げます。このようにして速度を制御しますが、制御によっては、実際の速度が遅い場合にモータ加える電圧が大きすぎると速度が速くなりすぎ、その結果、モータに加える電圧を下げると、速度が遅くなりすぎるといったような、ギクシャクしたことにもなります。ギクシャクがない状態で速度を制御できる事が重要なポイントとなります。

フィードバック制御方式の中でモータ速度制御には、PID制御方式が用いられます。PID制御は、目標速度と実際の速度の差(以下、速度差Vif)を検出し、その差から、比例項(Proportional)、積分項(Integral)、微分項(Differential)の3つの項目により、制御を行う方法です。

モータ駆動電圧をMVinとすると、以下の式でPID制御は表されます。

 

 

MVin    モータ駆動電圧

Vif     目標値と実際のモータ逆起電力との差

Kp      比例係数

Ki      積分係数

Kd      微分係数

このKp, Ki, Kd CV値として、設定される事になります。

 

これらのKp, Ki, Kdの値を設定するには、実際に車両を動かして見ないと分かりませんが、それではデコーダのモータ制御設計出来ないので、PIDシミュレータを作成し、概略の値を推定することにします。今回公開するPIDシミュレータは、「実験とシミュレーションで学ぶモータ制御」(見城 尚志 (),他)を参考に作りました。原本では、Basicでしたが、VC#で作成しています。最近Microsoft Visual C# 2005がリリースされており、今回のシミュレータもMicrosoft Visual C# 2005 (Express Version)で再コンパイルしています。Microsoft Visual C# 2005 (Express Version)はフリーで使用できます。PID制御等を変更したい場合には、Microsoft Visual C# 2005(Express Version)で変更して、試して見てください。

ファイル関係
インストール....publish.zip
Microsoft Visual C# 2005 (Express Version)でCD用として発行したファイルすべてです。
ダウンロードし、解凍後、publishフォルダーができますので、その中のsetupを実行して下さい。
setup実行後は、フォルダーごと削除しても問題はありません。アンインストールは、プログラムの追加と削除から行って下さい。
ソースファイル...source.zip
Microsoft Visual C# 2005 (Express Version)で使用したファルダごと圧縮してあります。ダウンロード後解凍するとMotorControl1フォルダーが出来ます。任意の場所に保存して下さい。Microsoft Visual C# 2005 (Express Version)で変更、ビルドが出来ます。
入力データ設定ファイル....M4_SIM_L1.zip
このページで用いられているモータ、あるいは、車両のシミュレーション用入力データファイルです。解凍後2つのファイルになります。M4_SIM_L1.simがリニアシミュレーション用、M4_SIM_D1.simがデジタル(離散)シミュレーション用です。

 

1−1.PID制御

桂庵のPIDシミュレータのブロック図を示します。

 

 

デジタルコマンドステーションからの速度指示により入力Vinが決められます。帰還系からの電圧Vfbとの比較を行い、入力との偏差をVifを得ます。帰還系は、駆動用モータ回転数検出のための発電機とその発電リップルの和をフィルタを通して帰還電圧Vfbとしています。実際のデコーダでは、この発電機は駆動用モータそのもので、一旦モータ駆動を停止し、モータ逆起電力を測定しています。シミュレータでは、駆動用モータとは別に、発電機が存在しているとしています。偏差Vifに対して、上述した比例、積分、微分項の計算を行いすべてを加算し、その結果の増幅後をモータ駆動電圧MVinとしています。

以下に、PID計算部分のソースコードを示します。

//PID計算 リニア

private void PIDLinear()

{

        //指示入力電圧

        Vin = SpeedCV();

        //PID計算

        Vif = Vin - Vfb;        //指示電圧 - フィードバック電圧(角速度情報)

        // 比例

        VKp = Kp * Vif;

        VKp = VLimit(VKp, PPlusLimit, PMinusLimit);

        // 積分

        VKi = Ki * FKi.Integ(Vif, dt);

        VKi = VLimit(VKi, IPlusLimit, IMinusLimit);

        // 微分

        VKd = Kd * FKd.Different(Vif, dt);

        VKd = VLimit(VKd, DPlusLimit, DMinusLimit);

        // 増幅

        MVin = PIDGain * (VKp + VKi + VKd);

        MVin = VLimit(MVin, PIDPlusLimit, PIDMinusLimit);

}

上記ソースコードはリニアモード(後述)におけるPID計算です。電圧リミッタも含まれています。また、積分、微分計算は専用のクラス(C#)を作成し、計算しています。

下にデジタル(離散)モードのPID計算式を示します。リニアモードと比較し、かなり係数(Kp, Ki, Kd)を小さくしないと安定しなかったためと、CV値の設定は整数の0 - 127までと考えていたので、比例、微分係数は数式上割り算を入れてあり、各係数が0 - 127の間で、安定する係数を選べるようにしています。また、整数計算なので、計算精度を得るために、オーバフローを避けながら、掛け算を先行させ、その後割り算をするようにしています。コード内にも説明してありますので確認して下さい。今後より良い制御のため、あるいはデコーダに用いているAVRCPUのコード量の削減のため変更する可能性は大きいです。

注:以下の計算はモータ制御PWM8bitとしてします。また、モータ駆動電圧の最大値を12[V]として、8bit25512[V]に対応させています。

private void PIDDigitalCal()

{

        int iMVin,iVif,iKp,iKi,iKd,f;

        int KP,KI,KD;

        iKp = (int)Kp;

        iKi = (int)Ki;

        iKd = (int)Kd;

        f = (int)(1d/SampleTime);

 

        Vif = Vin - Vfb;        //指示電圧 - フィードバック電圧(角速度情報)

 

        // intに変換 最大255 = 12V

        iVif = (int)(255d*Vif/12d);

 

        //演算の精度

        //積分値の上限については、後ほど

        dFki = dFki + iVif;

        KP = iKp*iVif/10;                       //最大(絶対値)iKp*Vif32385

        KI = iKi * dFki/f;                      //最大はdFkiに依存

        KD = iKd*(iVif - Vifn_1)*f/1000;  //最大値(絶対値)は32385(Kpと同じ)

 

/*      演算とその精度について:

16 bit intで考えた場合、絶対値の最大は32767である。

(実際は32bit整数演算をしています。)

比例項Kp

シミュレーションの結果、CV値を10で割った値を用いることにする。 また、計算順序としては、掛け算を先にしても、オーバフローしないので掛け算を先し、その後10で割る。

255*127 = 32385  32382 ÷ 10 = 3239 Maxとなる。

 

微分項KDについて:

通常 KD = Kd * ( ( Vif - Vifn_1) / dt ) である。dtはサンプル時間である。サンプル周期をfとする時、f = 1/dt である。従って、KDは以下のように書ける。

KD = kd * f * (Vif - Vifn_1 )

しかし、微分項による制御の場合、Kdを大きくすると不安定であった。そのため、fを掛け1000で割らないとシミュレーション上安定しなかった。(Kdの入力範囲を0-127とした場合) 従って、KDを以下のようにする。iKdCV値(0127)である。

KD = iKd * (Vif - Vifn_1 ) *f /1000 ;

PID制御上のKdとしては、等価的にはiKd*f / 1000PID制御計算として用いられる。

 

積分項KIについて

積分項は偏差iVif項に時間dtを掛けなければいけないが f = 1/dtなので、fで割っている。dFkiについては、累積して行くので、大きくなる可能性がある。余り大きくなると減速時になかなか、速度が落ちない現象となるはずである。累積して行く積分項の最大値は、|KI| < 255となるのが望ましいと思われる。

*/

        iMVin = KP + KI + KD;

        Vifn_1 = iVif;

 

        //double

        MVin = ( (double)(iMVin) )*12d/255d;

        MVin = VLimit(MVin, PIDPlusLimit, PIDMinusLimit);

        //表示用

        VKp =  ( (double)KP )*12d/255d;

        VKi =  ( (double)KI )*12d/255d;

        VKd =  ( (double)KD )*12d/255d;

}

 

帰還系の発電機は、DCモータの逆起電力がその回転数に比例する事により、駆動用モータの回転数を検出しております。(モータのページを参照して下さい。)以下に式を示します。Kgを逆起電力定数、MOmgを駆動用モータ回転数、KGRippleを発電機リップル電圧、MThを駆動用モータ回転角(ラジアン)、KGRippleNを発電用モータのロータ数で決まるリップルの数としています。

//帰還系電圧

VKg = Kg * MOmg + KGRipple*Math.Sin( (MTh * KGRippleN) );

VKgに対して、フィルタ(1次遅れフィルタ)計算を行い、結果を帰還電圧Vfbとしています。以下はその計算関数(メソッド)です。1次遅れ用クラスを作成し、計算しています。

//Vfbの計算 フィルター(1次遅れ)

private double VfbCalc()

{

        return Fstf.calc(VKg,Vfb,dt);

}

 

1−2.鉄道模型のシミュレーションモデル

シミュレーションを行う時、どのような状態を想定してシミュレーションを行うかが重要です。これをモデル化と言い、もし、モデル化を間違えた場合シミュレーション結果は意味のないものになってしまいます。桂庵のモデルには、例えばウォームギアのセルフロック機構は入っていませんし、モータ起動軸に入っているバネのシミュレーションも行っていません。また、デジタルモード(PID離散計算)では、モータの駆動を止めて、BEMFの測定をしているわけではありません。しかしながら、基本的な動作や、動作全体の傾向の理解が出来れば良いでのはないかと思っています。

 

以下の図にこのシミュレーションに用いた鉄道模型の概念モデルを示します。TOMIX EF64TOMIX EF64にデコーダ(DZ123)を搭載して見る。で使用した機関車)を基本としてモデル化を行いました。モータの関しては、モータのページを見てください。

 

 

この概念モデルの中で、上述したように 軸におけるねじれバネ の部分のシミュレーションは行っていません。理由は、シミュレーションが安定した結果を計算出来なかったためです。シミュレーション計算間隔時間/サンプル間隔を小さくしても安定しませんでした。初期状態で、モータ回転角とねじれバネで計算される軸トルクの関係がうまく計算出来ていないようです。今後の課題としています。

モデルは、モータからウォームギア、平ギアとトルクが伝わり駆動輪とレールの間に発生した駆動力とM車(機関車)+客車の加速度、抵抗がつり合う事でシミュレーションを行っています。従って、駆動輪とレールがスリップするような急な加速度の変化がある場合は、このシミュレーション結果を適用できません。

 

下に各部分の運動方程式を入れた図を示します。

 

 

上記モデルから、数式を導き出しシミュレーションを行います。今回は、ねじれバネを無視しています。その結果、すべての数式はモータ軸上での数式になりました。

 

まず、車両(M車、T車)の運動方程式を考えます。これは、M車駆動輪の運動方程式です。M車駆動輪とレールとの間で、駆動力F[N]が生じており、M車の質量をMWeight[Kg]、客車の総質量をTWeight[Kg]とし、客車の走行抵抗をTFR[N]とします。車両速度をv[m/s]とします。M車の走行抵抗(ギア等の抵抗)は、駆動輪とレールの部分での運動方程式なので含まれません。駆動力Fは、M車とT車の加速と抵抗とつりあうので、

となります。駆動輪の回転速度(角速度)をWsとすると、駆動輪の角速度と車両の速度は、速度=駆動輪半径×角速度なので、

となり、車両の加速度は以下のようになります。

駆動力Fを角速度Wsで表すと

となります。

 

駆動輪を回転させ、車両を動かすための駆動輪軸上のトルクTsは以下のようになります。駆動輪の慣性モーメントをJs、駆動力Fに対するトルクは駆動輪半径×力であるので

上の式第一項は、駆動輪を回転させるために必要なトルクです。この式の駆動力Fを消して整理すると

となります。この駆動輪軸のトルクをウォームギア軸のトルクで表せられるようにします。

このシミュレータでは、ウォームギア軸上のトルクを、車両の駆動に用いられるトルクTLoad、および、M車内部抵抗として計算されるLLoadに分けます。従って、TLoadは、ギアトルク伝達効率を100%で駆動輪に伝わることとしています。ウォームギア、平ギア含めたウォームギア軸から駆動輪までのギア比をNとして

また、ウォームギア軸角速度(LOmg)と駆動輪軸の角速度(Ws)は以下のように表せます。

従って角加速度は

の関係になり、ウォームギア軸上のトルクTLoadは以下のようになります。

 

駆動用モータの運動方程式は、モータの慣性モーメントをJm、粘性抵抗をDm、モータ角速度をMOmg、モータ内部抵抗をMLoadとし、モータ電流による発生トルクをTin、モータ軸から出力されるトルクをTiftとすると

この式は、モータ電流による発生トルクTinから、モータ内部抵抗トルクMLoadとモータ軸から出力されるトルクTiftを引いた残りのトルクがモータの回転を行っていると考えることが出来ます。モータ軸から出力されるトルクTiftは、ねじれネジの影響を無視しているので、すべてウォームギア軸のトルクとなります。

また、ウォームギア軸の角速度LOmgは、モータ角速度MOmgと同じになり、駆動用モータ運動方程式は

上記の数式がシミュレータとして計算されることになります。

上記の式でモータ角速度MOmgの微分項係数が、この系の等価的な慣性モーメントになります。モータ自身の慣性モーメントに対して、ギアがあるとギア比の二乗で他の項は小さくなっています。ある機関車ではフライホイールをモータ軸に直接付けています。フライホイールとして動作させるにはモータ軸に取り付ける事が必要である事が分かります。

また、この系の時定数は、モータ角速度MOmg項の係数分の微分項の係数です。TOMIX M-4モータの機械的時定数が約55msでしたが、少し大きくなります。

 

モータ内部抵抗、M車内部抵抗について

MLoadLLoad等抵抗部分があります。MLoadはモータ自身の内部抵抗(ただし粘性抵抗は除く)です。LLoadはギア等の抵抗を示しています。また、トルクで抵抗を表しています。

MLoadについては、モータのページにその他の抵抗として説明してありますが、モータのページでは、回転している時の抵抗(回転抵抗)です。起動時(出発時)の抵抗は、モータに電圧を少しずつ加え回転を始める直前のモータ電流を測り、この電流とモータのトルク定数により、起動抵抗(トルク換算)を求めます。シミュレーション時において、起動時と回転時は、モータの回転角で分けています。モータが回転を始めた後、ある一定角度までは、起動抵抗値を用い、その角度を超えた後は、回転抵抗値をシミュレーションでは用いています。現在はモータ起動時回転角が30度以内で起動抵抗としています。MLoadはソースコードでは関数(メソッド)MotorLoadCalc()で計算しています。

 

LLoadについても、モータと同様としており、走行抵抗は、車両(TOMIX EF-64)を走行させ、電圧を少しずつ下げ停止する直前の電流を測り、モータのトルク定数により、モータ軸上での車両走行抵抗をトルクで表しています。(電流測定値にはモータ自身の走行抵抗による電流も含まれているのでその値を引かなければならない)。同様に、起動抵抗も測定しております。走行抵抗と起動抵抗の分け方は、駆動輪が回転後、回転角度が30度以内の時は、起動抵抗として計算しています。LLoadはソースコードでは、LoadLoadCalc()で計算しております。

 

MLoad, LLoadの走行、起動抵抗の分け方は、まだまだ改善の余地は残っていると思ってます。

 

T車(客車)の走行抵抗について(TFR)

抵抗係数により計算しております。客車総質量×抵抗係数×重力加速度で単位を[N]で計算しています。おきらく研究室さんのページを参考にさせていただき、発進抵抗係数は約0.025と分かりました。走行抵抗は鉄道関係の本を調べたところ発進(起動、出発)抵抗の約1/3と言うことが分かりました。おきらく研究室さんのURL

http://shazba.hp.infoseek.co.jp/page021.html です。

 

モータの電流計算(モータのページを参照願います)。

トルクはモータに電流が流れることで発生します。また、トルクは電流に比例します。

モータ電流はモータに加えた電圧から、整流子電圧Vbおよびモータ回転による逆起電力を引いた結果の電圧を、モータ内部電気抵抗Ra,コイルLaで構成される1次遅れ関数により計算されます。計算された電流はトルク定数とかけられ、モータ発生トルクTinとなります。

 

1−3.数値計算

シミュレーションを行う場合、微分、積分等の数値計算を行います。コンピュータ上での数値計算方法がいくつかあるようですが、桂庵は、知識がないため、最初に紹介した「実験とシミュレーションで学ぶモータ制御」に基づいて数値計算を行っています。積分、微分、1次遅れ関数については、クラス化を行っています。

積分クラスを示します。

//積分用

public class Integral

{

        public double accumulation;

        public Integral()

        {

                accumulation = 0;

        }

        //積分(新しい値、分割間隔時間) 積分値を戻す

        public double Integ(double nv, double dt)

        {

                accumulation = accumulation + nv * dt;

                return accumulation;

        }

        // 初期化

        public void Init()

        {

                accumulation = 0;

        }

}

クラス名はIntegralです。実際の計算はクラス内の関数Integ()で行っており、単純に

を計算し、accumulation値を保持しています。

 

微分用クラス

//微分用

public class Differential

{

        public double previousdata;

        public Differential()

        {

                previousdata = 0;

        }

        //微分(新しい値、分割間隔時間)

        public double Different(double nv, double dt)

        {

                double sa;

                try

                {

                sa = (nv - previousdata) / dt;

                previousdata = nv;

                return sa;

                }

                catch

                {

                 MessageBox.Show("微分計算でdtが0です。計算結果を0とします");

                 return 0;

                }

        }

        //初期化

        public void Init()

        {

                previousdata = 0;

        }

}

クラス名はDifferentialです。

微分も単純に、保持していた一つ前の値を新しい値から引き、時間で割ったものです。

割り算があるので、try/catchを用いて、ソフトの異常終了を防いでいます。微分値をsaとして

です。

 

1次遅れ計算

この計算は以下のような数式で電流iを求める時に用います。

この数式は、電気抵抗RaとインダクタンスLaが直列に接続している回路に電圧v(t)が加わっている場合の回路に流れる電流iを計算します。一つ前の電流をip、現在の電圧をvとすると現在の電流iは、計算分割間隔をdtとして、

で求められます。関数内のnonsparameterにはRasparameterにはLaを設定しておきます。この関数は同様にモータ角速度の計算にも使用しています。

//1次遅れ関数

public class FirstDelayFunction

{

        public double nonsparameter, sparameter;

        public FirstDelayFunction()

        {

                nonsparameter = 0;

                sparameter = 0;

        }

        // 1次遅れ計算(現在の入力、一つ前の出力、分割間隔時間)

        public double calc(double inparameter, double outparameter, double dt)

        {

                double r;

                r = 0;

                try

                {

                        r = ( sparameter*outparameter + inparameter*dt )
                                /(sparameter + nonsparameter*dt);

                }

                catch

                {

                        MessageBox.Show("1次遅れ計算で分母が0になりました。
                                               
計算結果を0とします");

                }

                return r;

        }

}

 

以上でPID制御、鉄道模型のモデル化と計算式の説明を終わります。詳しくはソースコードを見て下さい。

 

2.PIDシミュレータ使用方法

PIDシミュレータの入力画面を下に示します。入力画面内に設定すべきデータがたくさんあります。すべての項目に値を設定し、表示するデータを選びます。表示できるデータはVinのように四角で囲まれた変数です。この変数をマウス左クリックで表示、非表示となります。また、この変数をマウス右クリックすると表示色を選ぶことが出来ます。

 

計算開始ボタンを押すと、計算を開始し、グラフで表示します。なお、入力項目は、保存、読み出しが出来ます。

 

桂庵が使用している入力データを添付していますので、そのデータを読み込んで編集等を行って下さい。入力項目データの読み込みは メインメニュー ファイル ファイルを開く で入力項目データファイルを選んで下さい。拡張子はsim としています。

 

設定した入力項目を保存する場合は、同じくファイル ファイルを名前を付けて保存する で保存して下さい。(上書き保存はありません)。

 

以下の例では、入力電圧(目標電圧)VinPID計算後にモータに加えられるモータ駆動電圧(MVin)、車両速度を表示に選んでいます。これらの項目がグラフで表示されます。

入力項目は、通常では、値を知る事は出来ません。モータのページでTOMIX M-4のデータを測定しましたので、この値を用いています。また、その他の値については、
2−1 PIDシミュレータ入力項目の説明 のところで説明します。

 

 

画面をクリックすると大きくなります。
下に上記の設定で計算した結果を示します。

上記の画面で指定した表示内容が、その色で表示されます。

 

 

画面をクリックすると大きくなります。
上記の設定ですと、時間0で5Vの電圧をモータに与えた場合、約50ms後に車両速度は安定します。しかし、モータ駆動電圧は波打っている事が分かります。

この例は、常にPID制御計算を行いながらモータを駆動しています(リニアモード)。DCCデコーダでは、モータ回転数検出のため、常にPID制御計算は出来きません。離散時間的にPID制御が行われます(デジタルモード)。通常約10ms毎にPID制御計算を行っているようです。桂庵のデコーダも10ms毎にPID制御計算を行うことにしています。

 

2−1 PIDシミュレータ入力、出力(グラフ表示)項目の説明

計算開始ボタン

このボタンを押すと計算を始めます。もし、入力項目で不正(例、数字でない文字が入力されていた時等)がある場合は、警告を出し、計算を行いません。計算開始後、選択された変数の表示を行います。計算時、表示できる変数(Vin, MVin等線で囲まれている変数)はすべて保持しています。計算後、表示する変数の変更が出来ます。

 

入力(Vin)グループ

ここでは、入力電圧の印加方法、印加電圧の設定を行います。この印加電圧が目標電圧になります。

・ステップ入力、スロープ入力の2種類があります。ラジオボタンで選択します。

・ステップ遅延[ms]、ステップ電圧[V] : ステップ遅延時間後、ステップ電圧の電圧が入力Vinとなります。

・スロープ開始[ms]、スロープ終了[ms]、スロープ電圧[V] : スロープ開始時電圧は0V、スロープ終了時はスロープ電圧になるように直線的に電圧が上昇します。

 

シミュレーションモードグループ

リニア、デジタルの2種類のシミュレーションモードがあります。ラジオボタンで選択します。

・リニアモード時は、PID制御計算は常に行われながらモータは駆動されます。

・デジタルモード時は、シミュレーション時間グループ内のサンプル間隔毎にPID制御計算を行い、モータを駆動します。モータの回転、トルク等は、常に計算されます。PID制御計算のみサンプル間隔毎の計算です。

 

シミュレーション時間グループ

シミュレーションの時間を設定します。

終了時間[ms]は、シミュレーションの終了時間を入れます。100[ms]間のシミュレーションを行う場合は、100を入力します。長い時間シミュレーションを行うとかなり計算時間、表示時間が掛かります。その場合は、以下の計算分割時間を長めにとると計算精度は落ちますが、計算、表示時間が短くなります。

計算分割間隔は、シミュレーションの計算間隔時間を[μs]で入れます。100[μs]ぐらいが妥当な値ではないかと思います。

サンプル間隔は、デジタルモード時においてPID計算を行う間隔です。通常デコーダでは10[ms]間隔(100Hz)でモータ回転検出、モータ制御を行っているようです。

 

グラフ最大値設定グループ

計算結果を表示する時に用いられ、各計算結果のグラフ上の最大値を設定します。計算は、この最大値に影響を受けません。グラフ表示に適用されます。また、計算終了後、グラフ最大値設定を変更してもグラフには反映されません。もし、グラフ最大値を変更した場合再度計算を行って下さい。

電圧[V]、電流[A]、回転数[rpm]、角度[rad]、トルク[N.m]、速度[m/s]、加速度[m/s^2]の値を設定して下さい。表示しない値(例えばモータ回転数)があっても、グラフ最大値は設定して下さい。

 

PIDグループ

PID計算の比例、積分、微分、増幅係数及びリミッタ値を設定します。比例、微分、積分、増幅の各ブロック毎にリミッタが掛かります。ただし、デジタル(離散)シミュレーションモードでは、増幅器以外ではリミッタは掛かりません。リミッタの値は無視されます。

PID制御で説明したようにデジタル(離散)シミュレーションモードでは、比例、積分、微分係数の設定値を 0 - 127の値で制御系が安定するように、PID計算処理内で、各係数を小さくして計算しています(積分を除く)。デジタル(離散)シミュレーションモードでは設定値は0 - 127の間にして下さい。

 

表示出力としては、入力(目標)電圧Vin、 帰還電圧Vfb、入力(目標)帰還電圧差Vif、比例項計算値VKp、積分計算値VKi、微分計算値VKdです。制御系が不安定な時これらの計算値を表示することにより、どの項目で不安定になっているかが分かります。

 

モータ特性グループ

モータのページを参照して下さい。

整流子電圧、内部抵抗、インダクタンス、トルク定数、逆起電力定数、粘性抵抗、慣性モーメントはモータのページの説明どおりの内容と値です。回転抵抗は、モータのページでは、その他の抵抗と表示してある抵抗で回転数にかかわらない一定の抵抗を示しています。リップル抵抗は、回転時、リップル上に発生する抵抗ですが、桂庵は測定できないと言う事と回転抵抗より小さいはずと言うことで0としています。リップル回数はモータのロータ数に依存するもので、M-4は5極であったため、倍の10としていますが、リップル抵抗を0としているので計算には関係ありません。

 

起動抵抗はモータ起動時の抵抗(トルク換算)です。M-4モータ単体で、回転を始める直前の電流を測定し、トルク定数をかけた値です。測定した電流値は120mAでした。従って、起動抵抗は、

0.12[A] × 0.00293 [N.m / A] = 0.0003516[N.m]となりました。

 

注:粘性抵抗、慣性モーメントは、非常に小さい値になります。そのため、10のマイナス6乗の単位で入力して下さい。例えば、慣性モーメントが0.0000000531[Kg.m^2]の場合は、ここでは、0.0531と入力して下さい。

 

表示出力として、モータ駆動電圧MVin、モータ電流Iin、モータ発生トルクTin、モータ軸から出力されるトルクTift、モータ角速度MOmg(rpmに換算して表示)、モータ回転角Mth、モータ逆起電力VKe、モータ内部抵抗MLoadを表示できます。

 

帰還系グループ

モータ角速度を入力とし、角速度検出電圧が帰還系の出力となります。回転−電圧検出係数は、モータの逆起電力定数です。今回は、駆動用モータと回転−電圧検出用モータは同じであるので、駆動用モータの逆起電力定数と同じになります。検出リップル電圧は、回転数(角速度)検出時の検出用発電機のリップルです。今回は0としています。また、リップル回数は検出用発電機のロータ数に関係します。モータ特性の時と同様5極モータなので10としていますが、今回は検出リップル電圧を0としているので、計算には関係ありません。フィルタ定数は、検出リップルを取り除くために入れていますが、実際のデコーダではフィルタを入れると逆起電力の検出が出来ないため、入れていません。また、このフィルタの時定数でかなりシミュレーション結果が変わります。

 

表示出力として、フィルタ前の検出電圧VKgの表示が出来ます。

 

ギア/モータ車グループ

このグループでは、モータ車(M車)の特性を入力します。M車には、ギア、駆動輪、出発(起動)、走行抵抗等があり、シミュレーションに重要な部分です。桂庵は、TOMIX EF-64で測定し数値を入れています。(注:ボディ(車体?)を付けていない状態での測定をしました、少し重量、あるいは抵抗が小さく測定されているかも知れません)

 

ばねKsは、モータ軸とウォームギア軸の間に存在するばねのねじれ方向の係数です。単位は[N.m/rad]です。本来は2次慣性系でのシミュレーションを行いたかったのですが、今回、この定数を用いるとシミュレーションが安定しなかったため、使用していません。従って、モータ軸とウォームギア軸が鋼体で接続されている1次慣性系でのシミュレーションです。

 

出発(起動)抵抗(トルク換算)は、モータ軸上の出発(起動)抵抗です。これは、モータ電流を測定することで抵抗値を得るためです。EF-64に少しずつ電圧を加え、走り出す直前の電流を測定し、モータトルク定数をかけてトルクにしています。測定値は、190mAでした。この値にはモータ単体の起動抵抗による電流も含まれているので、モータを除いたEF-64の出発(起動)抵抗は、

(0.19 - 0.12)[A] × 0.00293[N.m/A] = 0.0002051[N.m] となりました。

 

走行抵抗も同様にモータ軸上での抵抗です。一旦EF-64を走らせ、徐々に電圧を下げ、停止する直前の電流を測定します。測定値は、110mAでした。出発(起動)抵抗と同様にモータ単体の回転抵抗も含まれています。モータページにあるようにモータの回転抵抗は計算によるトルク換算(0.000141 N.m)で求めているので、走行抵抗は

0.11[A] × 0.00293[N.m/A] - 0.000141[N.m] = 0.0001813[N.m]となりました。

 

ギア比は、モータ回転数と、駆動輪回転数との比です。EF-64のモータを手で回し、駆動輪の回転を確認しました。モータを20回回すと、駆動輪が一回転したので、ギア比は20 となりました。

 

重量は重さを入力します。正しくは質量です。EF-64(ボディなし)を料理用秤に載せ100gぐらいでした。ここで入力する値の単位は[g]です。シミュレーション内部では[Kg]で計算しています。

 

駆動輪軸数は、駆動輪が付いている軸数を入れます。TOMIX EF-64の場合は4軸となります。

 

駆動輪直径は、駆動輪の直径を入力します。EF-64の駆動輪の直径は7.7[mm]です。

 

駆動輪慣性モーメントは、駆動輪一つあたりの慣性モーメントです。正しく測定するには、駆動輪の重量を測定し計算を行いますが、手を抜いて、EF-64動力台車ごと重さを測定し、その重さすべてが、駆動輪(4つ分)の重さとしました。動力台車一つで7 [g]でした。駆動輪一つで1.75[g]です。駆動輪が全く円筒であるとし、次の数式で慣性モーメントは計算できます。慣性モーメントをJとし、駆動輪直径をD、駆動輪の重さをMとすると

計算をすると、J = 0.0000000130 [Kg.m^2]となりました。この項目の入力は、値が非常に小さいので、モータの慣性モーメントの入力と同じように10のマイナス6乗の単位で入力して下さい。0.013と入力します。

 

表示出力としては、ねじれバネトルクTKs(計算していません)、ウォームギア軸角速度LOmgrpmに換算して表示)、M車内部抵抗LLoad(トルク換算 N.m)、ウォームギア軸角度Lth[rad]、車両速度[m/s]、車両加速度[m/s^2]です。ねじれバネを無視しているのでウォームギア軸角速度LOmgはモータ軸角速度MOmgと同じ値になります。また、同様にウォームギア軸角度Lthはモータ軸角度Mthと同じ値になります。

 

客車グループ

総重量は、客車(T車)すべての重さの和です。おきらく研究室さんのページを参考にさせていただき、客車一両の重さは約30gです。5両連結する場合は150[g]を入力して下さい。もちろん、お持ちの客車の重さを測定し入力しても構いません。出発抵抗比は、おきらく研究室さんの解説の中の客車発進抵抗係数です。約0.025としています。走行抵抗は鉄道関係の本を調べたところ発進(起動、出発)抵抗の約1/3と言うことが分かりました。ここでは、0.01としています。

おきらく研究室さんのURLhttp://shazba.hp.infoseek.co.jp/page021.html です。

 

外乱グループ

外乱は、急に客車の走行抵抗が上がった時の、車両の速度応答を検討するために入れてみました。

発生時刻は、シミュレーション開始から、外乱の発生するまでの時間で[ms]で入力します。

発生期間は、外乱が発生している時間で同じく[ms]で入力します。

外乱強度は、外乱の強さで、力[N]で入力します。力[N]は、質量(重さ)× 加速度なのです。例としては、100[g]の機関車を手に持った時、手で感じる力[N]は、重力加速度を9.8[m/s^2]として

 100[g]×9.8[m/s^2] = 0.1[Kg]×9.8[m/s^2] = 0.98[N]となります。

概略、約100[g]の機関車を持つ時に必要な力が約1[N]となります。

 

3.最後に

デコーダの製作と平行してこのシミュレータを作成してきたので、かなり時間が掛かってしまいました。まだ、計算式の間違いや、ソフトバグがあると思っています。デコーダを作成する時、車両に試作デコーダを付け、検討しても分からないであろうと思ってシミュレータを作りました。シミュレータの計算結果がどのくらい実際のデコーダ+車両の動作を表しているかはっきりとは分かりませんが、まあまあかと思っています。(あいまいで済みません)。現在、試作デコーダをEF-64に載せて試験をしています。試験結果によっては、PID計算式を変える事も必要になると考えています。