[[PICマイコンを用いた能動騒音制御系の製作]] まず,PICを取り外し,三年学生実験の要領でコントローラを設計する: +制御対象の周波数応答を取得する. % insmod freqresp_module.o % ./freqresp_app % rmmod freqresp_module +ノミナルプラントを求める. >> nominal +ロバスト安定のための重み関数を決める. >> weight +離散化 H∞ 制御問題を解き,補償器の状態空間実現を求める. >> hinf_discrete_zoh コントローラが安定になっていることを確認する. >> max(abs(eig(A))) 1未満なら安定. 不安定の場合は,重み関数の設定からやりなおす. +補償器の状態空間実現をブロック対角可制御正準形に変換する. >> sym_trans +PC で消音制御実験を行い,理想状況下での観測主力 y と制御入力 u および状態変数 x を記録する % insmod hinf_module.o % ./hinf_app % rmmod hinf_module 結果の確認: >> perf_time figure(1)...エラーマイク出力の時間応答 +補償器を近似して,PIC 用 C コードを生成する. % make codes +PIC 用 C コードのシミュレーションを行う.~ data/S.dat にスケーリングの値を保存しておく. % make simu 以下の条件 a, b が満足されることを確認する.満足されない場合には,simu_shift_binary.c 中のスケーリング S と, gen_binary_code.c 中の有効桁 M を調整し,7 に戻る. --a. シミュレーション結果が PC の制御結果にほぼ一致する.すなわち,以下がそれぞれほぼ一致する: u: simu_shift_binary.dat の 2 列目と,result.dat の 4 列目 * S * 512 / 5 x[0]: simu_shift_binary.dat の 3 列目と,result.dat の 7 列目 * S * 512 / 5 x[1]: simu_shift_binary.dat の 4 列目と,result.dat の 8 列目 * S * 512 / 5 x[2]: simu_shift_binary.dat の 5 列目と,result.dat の 9 列目 * S * 512 / 5 (以下略) --b. シミュレーション結果が,±32768 (符号付き int16 で表現できる整数 の範囲)を超えない~ 上記は,以下のようにして確認できる >> check +PIC 用 C コードをコンパイルする. ++VMware win98 を起動し,ユーザ exp でログインする. % vmware & ++ネットワークコンピュータで \\GOMANA\exp\WWW\openhouse を開き,以下のファイルを C:\mplab\control にコピーする: ax_0.c, ax_1.c, cx_0.c, cx_1.c, dy.c, def.h ++ANCボードとデバッガの電源を入れる ++MPLAB を起動し,プロジェクト C:\mplab\control\control.pjt を開く. ++C:\mplab\control\control.c を開き,スケーリング S の値に応じて,以下ように適宜編集する: ・入力端のスケーリング y = (read_adc() - 511) << 1; ... S = 16 の場合 y = (read_adc() - 511) << 2; ... S = 32 の場合 y = (read_adc() - 511) << 3; ... S = 64 の場合 y = (read_adc() - 511) << 4; ... S = 128 の場合 ・出力端のスケーリング u_data = (u + 512) >> 2; ... S = 16 の場合 u_data = (u + 1024) >> 3; ... S = 32 の場合 u_data = (u + 2048) >> 4; ... S = 64 の場合 u_data = (u + 4096) >> 5; ... S = 128 の場合 ++MPLABで make project を実行.~ Out of ROM となって,コンパイルできない場合には,gen_binary_code.c の SPLIT_A の値を小さく変更して,7 に戻る.(必ずしも,小さい方が out of rom になりにくいわけじゃないので注意.例えば,SPLIT_A が 0.6 だと out of rom で,0.7 だと out of rom にならなかったりすることがある.ページ毎にうまく関数がおさまってむだなく rom を使い切れるかどうかがポイント) +PIC に書き込み~ スタンドアロンで動作させる場合は Enable Debug Mode のチェックを外す.以降の手順のように,MPLAB からプログラムを RUN する場合は,Enable Debug Mode のチェックを入れておく. +PIC の動作を確認する.~ ANC ボードと実験装置の接続を確認する: --ANC ボードの出力信号が DTP-64(PC) の 15 番ピンに接続されている. --リファレンスマイクの出力信号が ANC ボードの AD IN1 に接続されてい る. --ANC ボードの D0 ピンが,DT-4(PC) の 5 番ピンに接続されている. % insmod hinf_module.o MPLAB でプログラムを RUN する. % ./hinf_app (PC で消音制御が行われ,PIC の制御入力が記録される)~ MPLAB でプログラムを STOP する. % rmmod hinf_module +PC, PIC の制御入力がほぼ一致することを確認する % gnuplot gnuplot> plot "result.dat" u 1:4 w l, "result.dat" u 1:6 w l DC 成分のずれはパワーアンプ入力部のカップリングコンデンサで吸収されるので,無視してよい. gnuplot> plot "result.dat" u 1:4 w l, "result.dat" u 1:($6-1.35) w l 等とすれば,DC 分を無視して比較できる. +PIC で消音制御する.~ DTP-4(PC) の 1 番ピンに接続されている LPF の入力端子を外し,ANC ボードの出力信号に接続しなおす.(PIC が生成した制御入力が LPF に入力されるように接続を変更する)~ 後は前と同様の手順で実験を行う. +デバッガを外して,ANCボード単独で動作させる. ++PIC に Program を書き込む際のオプション「Enable Debug Mode」を外してから書き込む. ++MPLAB を終了. ++デバッガの電源 OFF. (この時点でで PIC は start する) ++前と同様に,hinf_app を実行する.