磁気浮上制御

電磁石の吸引力を制御して鋼球を宙に浮かせます。
制御方式は位相進み補償またはPIDとします
線形近似でシミュレーションを行い、実運転では非線形補償を加えます。

ソースコードやプロジェクトファイルのダウンロードはこちら →magnet.zip

(1)シミュレーション用のプログラムです。
概念図
ブロック図
プログラム
var x=0.05;      // 初期位置(初期空隙長=0.15)
mass=0.1;        // 質量
imax=2;          // 電流制限
Km=1;            // マグネット定数
proc 
{ 
    cp = leadlag( xc-x, T1, 8*T1 );           // 位相進み補償
    ci = integral( xc-x, ci, T0, sup, 0 );    // 積分補償
    ic = Kc * ( cp + ci );                    // 駆動電流
    if    ic > imax { ic = imax; }            // 電流制限
    elsif ic < 0    { ic = 0; } 

// 以下はシミュレーションのための数学モデル

    F = Km * ic;                                // 発生力(線形)
    v = integral( F-9.8*mass, v, mass, 8, -8 ); // 速度
    x = integral( v, x, 1, 0.15, 0.05 );        // 位置
} 
説明

変位のフィードバック信号に位相進み補償と積分補償を加えることにより、磁気浮上制御を行います。 位相進みには比例+微分の特性がありますので、積分と併せればPID制御と同じです。

以下の関数、信号、パラメータを使っています。

関数
(予約語)
 leadlag位相を変化させる1次フィルタです。
 integral出力リミット付き積分器です。
信号 cp誤差の位相を進めた信号です。
 ci誤差を積分した信号です。
 iccp、ciの和にゲインを掛けて得た、駆動電流の指令値です。
 v鉄球の速度です。
 x鉄球の変位です。
パラメータ xc位置指令値です。浮上位置 xc=0.1 を与えています。
 T0積分補償の時定数です。
 T1位相補償の時定数です。T2=8*T1としました。
 sup積分補償の出力リミット値です。
 Kc制御ゲインです。

設定例
記録例


(2)実運転用のプログラム(ただし未確認)です。
ブロック図
プログラム
青字は変更点
g0=0.2;        // 可動範囲
proc 
{ 
    x = Ain( 0, 0, 1 );                       // 変位センサ入力
    cp = leadlag( xc-x, T1, 8*T1 );           // 位相進み補償
    ci = integral( xc-x, ci, T0, sup, 0 );    // 積分補償
    u  = Kp * ( cp + ci );                    // 制御量
    ic = ( g0 - x ) * sqrt( u );              // 非線形補償
    if    ic > imax { ic = imax; }            // 電流制限
    elsif ic < 0    { ic = 0; } 
    Aout( 0, 0, 1, ic );                      // アナログ出力
} 
説明

マグネットの発生力は、電流とギャップ長の非線形な関数になっていますので、 それを補償するために、図のような非線形補償器を使います。 なお、このプログラムは動作未確認です。 正しく制御するためには、以下の物理量を実物に合わせる必要があります。

  • 鉄球の質量、ギャップ長
  • 変位センサの感度およびオフセット
  • 駆動アンプの感度
  • 平方根演算の適切なスケーリング
  • マグネットの特性

以下の関数を追加しています。

 Ainアナログ信号を入力します。
 Aoutアナログ信号を出力します。
 sqrt平方根を求める算術関数です。


(3)PID関数を使ったシミュレーションです。
ブロック図
プログラム
青字は変更点
var x=0.05;      // 初期位置(初期空隙長=0.15)
mass=0.1;        // 質量
imax=2;          // 電流制限
Km=1;            // マグネット定数
proc 
{ 
    ic = pid( xc-x, Kc, T1, 8*T1, T0, sup, 0 );  // PID制御
    if    ic > imax { ic = imax; }              // 電流制限
    elsif ic < 0    { ic = 0; } 

// 以下はシミュレーションのための数学モデル

    F = Km * ic;                                // 発生力(線形)
    v = integral( F-9.8*mass, v, mass, 8, -8 ); // 速度
    x = integral( v, x, 1, 0.15, 0.05 );        // 位置
} 
説明

関数 pid を使うと、プログラムがやや簡潔になります。