SSブログ

MC9S08SH4 のギャング出力でバックコンバータ (5) [HCS08]このエントリーを含むはてなブックマーク#

BuckConverter4.png

MC9S08SH4 のギャング出力でバックコンバータ (4)でプログラムを書いて実験した結果、ゲインが3から4の範囲で発振を起こすことがわかってきました。 今回は、発振する様子をシミュレーションで確認してみます。 順序は、きっと逆なんだろうな。

前回の記事の訂正

前回の記事を書いた後、いくつか今までの記事と矛盾している点を見つけましたので、訂正しておきます。

  1. LCフィルタのコンデンサは470µFだった。

    設計段階では、100µFのコンデンサを使っていたのですが、リップルを取るために大き目のコンデンサと交換して、そのままにしていました。

  2. マイコンの内蔵発振器が調整されていなかった。

    HCS08マイコンの内蔵発振器は、ソフトウェアでICSTRMレジスタに積極的に値を書き込まない限り、正確な周波数には調整されません。 今回のプログラムでは、このICSTRMレジスタに値を書き込む部分が抜けていたため、内蔵発振器は推定36kHzに調整されていたはずです。

  3. マイコンのBUSCLKが、divide-by-2のままだった。

    今回のアプリケーションでは、厳しいタイミング制約から高速なBUSCLKが要求されます。 にもかかわらず、BUSCLK分周器の設定を最高速の設定にはしていませんでした。 ICSTRMの問題とあわせて、BUSCLKは、9.216MHzになっていたはずです。

    これは、A/D変換やPWM周期の時間にも影響しています。 道理でPWMの周波数が20kHzになっていたはずです。

  4. PCのライン入力をそのまま接続していた。

    出力を観測するために"WaveSpectra"というソフトウェアを使用しているのですが、この時、決して高インピーダンスとは言えないPCのライン入力を直接接続していました。 本当は、エミッタフォロワなどのバッファを間に入れるべきでした。

と、色々と問題が見つかりましたが、シミュレーションの方の条件を合わせて検証していこうと思います。

scilabでシミュレーション

シミュレーションに使用するのは、scilabです。 バックコンバータの部品のモデルをscilabで記述して、シミュレーションを行います。 scilabの使い方調査したを「scilabで遊ぼう」シリーズの記事一覧を作りました。 こういうまとめは、Wikiにでも書きたいね。

諸定義

伝達関数を書くためにszを使った多項式を記述します。 最初は、これらの項を定義します。

//==============================================
//  Primary elements
//==============================================
s = poly(0,'s');
z = poly(0,'z');

続いて、これから解析するシステムの基本的な定数を定義します。

//==============================================
//  Parameter Declarations
//==============================================
fmin = 1;
fmax = 1d4;
ts   = 0.444d-3;

fminfmaxは、ボード線図を描くときの上下限周波数を指定します。 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の電流が流れます。

WS000346.png

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Ωを加えてあります。

WS000347.png

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フィルタ、アンチ・エリアス・フィルタの三つを通った時のゲインです。

WS000348.png

同時に利得余裕と位相余裕を計算させました。

 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);

閉ループ・ゲインは、システムの入力から出力までの特性を現します。 このシステムの場合の入力は、基準電圧です。

WS000349.png

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制御器のゲインは、このステップ応答の結果を見ながら微調整したものです。

WS000350.png

このように安定して発振します。

次回は、もっと実用的なP制御器プログラムに書き換えて、変動する負荷をつないでみます。

参考文献

Scilab/Scicosで学ぶシミュレーションの基礎―自然・社会現象から、経済・金融、システム制御まで

Scilab/Scicosで学ぶシミュレーションの基礎―自然・社会現象から、経済・金融、システム制御まで

  • 作者: 橋本 洋志
  • 出版社/メーカー: オーム社
  • 発売日: 2008/01
  • メディア: 単行本
Scilabで学ぶシステム制御の基礎

Scilabで学ぶシステム制御の基礎

  • 作者: 橋本 洋志
  • 出版社/メーカー: オーム社
  • 発売日: 2007/04
  • メディア: 単行本

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました