磁気浮上制御
電磁石の吸引力を制御して鋼球を宙に浮かせます。
制御方式は位相進み補償または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制御と同じです。 以下の関数、信号、パラメータを使っています。
| |||||||||||||||||||||||||||
| 設定例 | ![]() | |||||||||||||||||||||||||||
| 記録例 | ![]() | |||||||||||||||||||||||||||
| (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 ); // アナログ出力
} | ||||||
| 説明 |
マグネットの発生力は、電流とギャップ長の非線形な関数になっていますので、 それを補償するために、図のような非線形補償器を使います。 なお、このプログラムは動作未確認です。 正しく制御するためには、以下の物理量を実物に合わせる必要があります。
以下の関数を追加しています。
| ||||||
| (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 を使うと、プログラムがやや簡潔になります。 |





