MC9S08SH4 のギャング出力でバックコンバータ (5) [HCS08]
MC9S08SH4 のギャング出力でバックコンバータ (4)でプログラムを書いて実験した結果、ゲインが3から4の範囲で発振を起こすことがわかってきました。 今回は、発振する様子をシミュレーションで確認してみます。 順序は、きっと逆なんだろうな。
前回の記事の訂正
前回の記事を書いた後、いくつか今までの記事と矛盾している点を見つけましたので、訂正しておきます。
- LCフィルタのコンデンサは470µFだった。
設計段階では、100µFのコンデンサを使っていたのですが、リップルを取るために大き目のコンデンサと交換して、そのままにしていました。
- マイコンの内蔵発振器が調整されていなかった。
HCS08マイコンの内蔵発振器は、ソフトウェアでICSTRMレジスタに積極的に値を書き込まない限り、正確な周波数には調整されません。 今回のプログラムでは、このICSTRMレジスタに値を書き込む部分が抜けていたため、内蔵発振器は推定36kHzに調整されていたはずです。
- マイコンのBUSCLKが、divide-by-2のままだった。
今回のアプリケーションでは、厳しいタイミング制約から高速なBUSCLKが要求されます。 にもかかわらず、BUSCLK分周器の設定を最高速の設定にはしていませんでした。 ICSTRMの問題とあわせて、BUSCLKは、9.216MHzになっていたはずです。
これは、A/D変換やPWM周期の時間にも影響しています。 道理でPWMの周波数が20kHzになっていたはずです。
- PCのライン入力をそのまま接続していた。
出力を観測するために"WaveSpectra"というソフトウェアを使用しているのですが、この時、決して高インピーダンスとは言えないPCのライン入力を直接接続していました。 本当は、エミッタフォロワなどのバッファを間に入れるべきでした。
と、色々と問題が見つかりましたが、シミュレーションの方の条件を合わせて検証していこうと思います。
scilabでシミュレーション
シミュレーションに使用するのは、scilabです。 バックコンバータの部品のモデルをscilabで記述して、シミュレーションを行います。 scilabの使い方調査したを「scilabで遊ぼう」シリーズの記事一覧を作りました。 こういうまとめは、Wikiにでも書きたいね。
- scilabで遊ぼう (1)
- scilabで遊ぼう (2)
- scilabで遊ぼう (3)
- scilabで遊ぼう (4)
- scilabで遊ぼう (5)
- scilabで遊ぼう (6)
- scilabで遊ぼう (7)
- scilabで遊ぼう (8)
- scilabで遊ぼう (9)
- scilabで遊ぼう (10)
- scilabで遊ぼう (11)
- scilabで遊ぼう (12)
- scilabで遊ぼう (13)
諸定義
伝達関数を書くためにsやzを使った多項式を記述します。 最初は、これらの項を定義します。
//============================================== // Primary elements //============================================== s = poly(0,'s'); z = poly(0,'z');
続いて、これから解析するシステムの基本的な定数を定義します。
//============================================== // Parameter Declarations //============================================== fmin = 1; fmax = 1d4; ts = 0.444d-3;
fminとfmaxは、ボード線図を描くときの上下限周波数を指定します。 1Hzから10kHzまでの範囲を表示させることにします。
tsは、サンプリング周期です。 本当は、204.8µ秒となるはずだったのですが、マイコンのクロック設定の間違いにより444.4µ秒と長くなってしまいました。
LCフィルタ
//============================================== // LC filter // LC filter consists of a Toroidal Core Coil // and a Chemical Capacitor. // The output impedance of the driver is added // to the L elements. //============================================== L1 = s * 5.8d-3 + 0.2 + 6.46; // L1 with DCR C1 = 1 / (s * 470d-6) + 0.07; // C1 with ESR R1 = 15; Z1 = C1 * R1 / (C1 + R1); lc_cont = syslin('c', Z1 / (L1 + Z1)); scf(1);clf;bode(lc_cont,fmin,fmax); lc = ss2tf(dscr(tf2ss(lc_cont),ts));
最初にLCフィルタの定義を行います。 このモデルでは、LとCに直列抵抗成分を入れてあります。 L1の抵抗成分には、Lの直流抵抗0.2Ωに加えてギャングポート出力のインピーダンスも加えてあります。 ギャングポート出力のインピーダンスは、MC9S08SH4 でギャング出力の実験で求めた値6.46Ωを入れています。
C1は、東信工業のUTWRZシリーズです。 等価直列抵抗の70mΩは、常識的な値として適当に決めたものです。 まあ、こんなもんでしょう。
R1は、出力につないだ15Ωの抵抗負荷です。 1.5Vを出力した時に100mAの電流が流れます。
LCフィルタの周波数応答をみると、100Hzから-20dB/decでゲインが低下しますが、4kHzから先は-10dB/decになっているのがわかります。 これは、C1の直列抵抗が無視できなくなったためです。
連続時間表現の"lc_cont"に加えて、離散時間表現の"lc"も定義しています。 周波数特性で示したのは連続時間表現の特性ですが、マイコンで実際に使用するのは、離散時間表現です。
アンチ・エリアス・フィルタ
//============================================== // Antialias filter // Antialias filter consists of an CR filter. //============================================== C2 = 1 / (s * 1d-6) + 0.1; // C2 with ESR R2 = 470; // R2 aa_cont = syslin('c', C2 / (R2 + C2)); scf(2);clf;bode(aa_cont,fmin,fmax); aa = ss2tf(dscr(tf2ss(aa_cont),ts));
アンチ・エリアス・フィルタは、一次のCRフィルタです。 C2にも等価直列抵抗として100Ωを加えてあります。
340Hzをカットオフ周波数とする素直な特性です。 この範囲では、等価直列抵抗の影響もないようです。
アンチ・エリアス・フィルタも連続時間表現の"aa_cont"と離散時間表現の"aa"を定義しています。
P制御器
//============================================== // P controller // P controller is implemented with a software. //============================================== kp = 3.12; p_factor = syslin(ts,kp*(1/(z^2))); controller = p_factor;
今回作成したのは、比例(P)制御器です。 伝達関数はただの定数になるはずなのです。 ところが、このプログラムでは、A/D変換してから実際にPWM出力に影響が出るまで2サンプリング時間を要する設計にしたため、"z-2"の項をかけてあります。
係数"kp=3.12"は、限界感度法によって求めた「安定して発振を続けるゲイン」です。 実際には、3から4の範囲に目的のゲインがあることがわかりましたから、矛盾しない結果であると言えるでしょう。
開ループ・ゲイン
//============================================== // Open loop // Calculate the open loop gain. //============================================== open_loop = controller*lc*aa scf(3);clf;bode(open_loop,fmin, fmax); [G,freqGM] = g_margin(open_loop) [P,freqPM] = p_margin(open_loop)
開ループ・ゲインは、システムの安定性を見るための重要な要素です。 要するに、P制御器、LCフィルタ、アンチ・エリアス・フィルタの三つを通った時のゲインです。
同時に利得余裕と位相余裕を計算させました。
freqGM = 129.19211 G = - 0.0031370 freqPM = 129.22903 P = - 0.0412623
発振をするための条件出しをしているので、利得余裕も位相余裕も"0"になっています。 周波数は、129Hzです。 実際に観測された発振周波数は、200Hzでしたが、桁は合っています。
閉ループ・ゲイン
//============================================== // Closed loop // Calculate the closed loop gain. //============================================== closed_loop = controller*lc/.aa scf(4);clf;bode(closed_loop,fmin, fmax);
閉ループ・ゲインは、システムの入力から出力までの特性を現します。 このシステムの場合の入力は、基準電圧です。
129Hzのところに鋭いピークが出ています。 この周波数で発振が起こっているということを意味します。
ステップ応答
//============================================== // Step responce // Simulate the step responce. //============================================== t = [0:ts:ts*100]; x = ones(1,101); y = flts(x,closed_loop); scf(5);clf;plot(t,x,t,y);ax5=gca();ax5.grid=[4,4];
100サンプリング周期分のステップ応答シミュレーションを行いました。 先のP制御器のゲインは、このステップ応答の結果を見ながら微調整したものです。
このように安定して発振します。
次回は、もっと実用的なP制御器プログラムに書き換えて、変動する負荷をつないでみます。
参考文献
Scilab/Scicosで学ぶシミュレーションの基礎―自然・社会現象から、経済・金融、システム制御まで
- 作者: 橋本 洋志
- 出版社/メーカー: オーム社
- 発売日: 2008/01
- メディア: 単行本
コメント 0