構造振動制御

加速度センサの信号を使ってサーボモータを駆動し、構造物の減衰特性を改善します。

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

(1)実運転用のプログラムです。
概念と
ブロック図
プログラム
proc
{
    pos = Ain( 1, 0, 0.1 );			// 相対位置センサ入力
    acc = Ain( 0, 9.8, 1 ) + Kp * pos;	// 加速度センサ入力と補正
    fc = integral( acc, fc, 1/Kc, sv,-sv );   // 制御力の計算
    fd = pid( pos, Kd, T1, 8*T1, 1, 0, 0 );	// PID制御ただしIは無し
    cmd = integral( fc+fd, cmd, md, sc,-sc );	// 速度指令の計算
    Aout( 1, 0, 1, cmd );			// 速度指令を出力
}
説明

構造物の変形速度に比例した力を加えると、減衰係数が増大したのと同じ効果になりますので、
加速度センサ信号を積分して得た速度にゲインを掛けて制御力とします。
モータドライバの入力は速度指令なので、制御力を積分して与えます。
加速度積分のドリフトを防ぐために、相対変位を加速度センサのオフセットと相殺させます。

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

関数
(予約語)
Ain アナログ入力ポートの電圧を数値化する関数です。
Aout アナログ出力ポートへ電圧を発生させます
integral 出力リミット付き積分器です。
pid 入力信号から制御量を産出するPID制御用フィルタです。
ここではおもりの位置を制御するために使います。
信号acc 加速度センサの入力値です。
9.8m/s2/Vのセンサとすれば、m/s2の単位になります。
pos相対変位を計測するセンサの入力値です。
0.1m/Vのセンサなら、m(メートル)の単位になります。
fc発生させたい減衰力です。
fdおもりの位置を制御する力です。
cmd モータドライバの入力は速度指令なので、加速度(fc+fd)/md を積分して与えます。
パラメータKc振動制御ゲインです。
Kpオフセット補正ゲインです。
Kdおもりの位置制御ゲインです。
mdおもりの質量です。
T1PIDフィルタの設定時定数です。
sv/sc加速度/制御力を積分する際の上下限値です。


(2)シミュレーション用のプログラムです。
ブロック図
プログラム
var pos;
var sens;
var acc;
var xs=0.01;	// 振動変位の初期値
ms=100000;	// 構造物の等価質量
Ks=4000000;	// 構造物の等価剛性
md=5000;	// おもりの質量
sup=90000;	// 積分器の飽和量
proc
{
    if currTime() < Ton { fc=0; fd=0; }	// 時刻Tonまで制御なし
    else {
	fc = Kc * lag1( sens+Kp*pos, T0 ) * T0; // DCカット積分
	fd = pid( pos, Kd, T1, 8*T1, 1, 0, 0 ); // PD制御
    }
    fr = fd + fc;				// 作用力
    vd = integral( fr, vd, md, sup, -sup );	// おもりの速度
    xd = integral( vd, xd,  1, sup, -sup );	// おもりの位置
    vs = integral( acc,vs,  1, sup, -sup );	// 構造物の速度
    xs = integral( vs, xs,  1, sup, -sup );	// 構造物の位置
    pos = xs - xd;				// 相対変位
    acc = (-fr - Ks*xs) / ms;		// 加速度
    sens = acc + bias;			// 加速度センサの信号 
}
説明

実運転用のプログラム(1)を事前チェックするためのシミュレーションプログラムです。 簡単のため振動モードは1次のみとし、モータドライバも省略して、制御力を直接加えています。
積分の上下限は充分大きい値として、飽和しないようにしています。
初期条件で構造振動を発生させ、20秒後から制御を加えました。
制御開始のタイミングによって波形はやや異なります。 場合によっては xd が過大になることがあったので、 積分器を時定数の長い1次遅れフィルタに変更して DC成分を制限しました。

記録例
設定例