[[PICマイコンを用いた能動騒音制御系の製作]]
jijgfj

まず,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 を実行する.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS