サーボアナライザ

ロックインアンプをユーザ関数化し、 対象となる制御系の開ループ伝達関数を計測します。

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

ブロック図
プログラム
fn=60;
dp=1;
lockin( in, _sin, _cos )
{
    x = bqLpf( in * _cos );   // ミキシング後フィルタ
    y = bqLpf( in * _sin );   // ミキシング後フィルタ
    amp   = sqrt(x*x+y*y);    // 振幅
    phase = atan2(x,y);       // 位相
    return amp;
}
proc
{
    Sin = w_sin( period, 0,    level ); // 正弦波発生
    Cos = w_sin( period, 0.25, level ); // 余弦波発生
    Aout( 0, 0, 1, Cos );               // ch0: 励振信号出力

    input  = Ain( 0, 0, 1 );          // ch0: 信号 input 入力
    output = Ain( 1, 0, 1 );          // ch1: 信号 output 入力

    aIn = lockin( input, Sin, Cos );  // 入力信号の振幅
    pIn = auxfunc( phase );           // 入力信号の位相
    aOut= lockin( output, Sin, Cos ); // 出力信号の振幅
    pOut= auxfunc( phase );           // 出力信号の位相

    ratio = aOut / aIn;               // 振幅比
    shift = pOut - pIn;               // 位相差
}
説明

励振信号の周波数における、計測対象の入出力の振幅比と位相差を計測します。 周波数(または周期)を変化させて記録データを整理すれば、伝達関数のグラフを得ることができます。

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

関数
(予約語)
 w_sin 正弦波発生関数です。
位相を0.25(90度)進めると余弦波発生になります。
 Ain アナログ入力ポートの電圧を数値化する関数です。
 Aout アナログ出力ポートへ電圧を発生させる関数です。
 bqLpf 2次ローパスフィルタ関数です。
 sqrt 平方根を計算する算術関数です。
 atan2 位相角度を計算する算術関数です。
 lockin このリストで定義されたユーザ関数です。
 auxfunc ユーザ関数内の信号の値を渡す関数です。
信号  Sin/Cos正弦波信号/余弦波信号です。
input/output計測対象の出力側信号/出力側信号です。
aIn/pIn信号input の振幅/位相です。
aOut/pOut信号output の振幅/位相です。
 ratio計測対象の入出力の振幅比です。
 shift計測対象の入出力の位相差です。
パラメータ  level変調キャリア信号の振幅です。
 period変調キャリア信号の周期です。
 fnフィルタの固有周波数(帯域、rad/s)です。
 dpフィルタのダンピングファクタです。