MC9S08SH4 のギャング出力でバックコンバータ (4) [HCS08]
定電流制御の前に定電圧制御プログラムを作成します。 最初は、P制御からです。
各部分でのゲイン
PWM出力部分では、無次元の変数"duty"を入力として電圧の出力を出しています。 "duty"が1カウント増えるごとに電圧は、VDD/256[V] 増加しています。 そのため、PWMのゲインは VDD/256[V/count]と計算されます。
LCフィルタとアンチエリアス・フィルタでのゲインは、DCの時に 0dB になっており、さらにほぼ既知の周波数特性を持っています。
A/Dコンバータでは、電圧を入力として無次元の変換値を出力しています。 ここでは、処理速度を優先するため、8-bitの変換値を受け取ることにします。 A/Dコンバータの基準電圧は、VDDとVSSになっていますので、 A/Dコンバータのゲインは、 256/VDD[count/V] と計算されます。
エラーアンプとコントローラ以外の部分でのゲインは、DCの時にちょうど "1" になります。
P制御器
以上の計算から、ソフトウェアからみた時のPWMからA/Dコンバータまでのループゲインが "1" になることがわかりました。 この構成で「P制御器」を作るときには、A/Dコンバータから得た値 "vadc" から目標値 "target" を引いて得られるエラーアンプの出力 "err" を定数倍した値を変数 "duty" に設定すればおしまいということになります。 何だ、簡単だね。 目標値は、とりあえず1.5Vとします。
ところで、エラーアンプの計算結果が "0" になった時には、 "duty" の値はいくつにしたら良いのでしょうか? "0" の時には理論的に目標の電圧出力になる "duty" 値を設定することにします。 無負荷の状態の時に5.0V電源から1.5V出力を得るためには、デューティー比は30%になります。 このときの "duty" の値84を中心にしてみます。
err = vdac - target duty = 84 + err * kp
ゲイン "kp" は、大きくすればするほど、出力の誤差が小さくなりますが、大きくしすぎると発振をおこします。 「P制御器」のゲインと発振の関係については、scilabで遊ぼう (10)で調べました。
処理のタイミング
今回、ただのCISCマイコンでソフトウェアPWMまでやらせようとしているので、CPUの処理能力の限界まで引き出さなくはなりません。 そこで、割り込みサービスルーチンの時間配分を考えました。
デューティーの更新は、PWM波形と非同期に行おうとしていたのですが、A/D変換時にGND電位が浮くかも知れないという心配が出てきたので、PWMの動作と同期させることにしました。 具体的には、PWM出力がLOWになって、主にショットキーダイオードが電流を流す期間にA/D変換を行います。
この時、問題になるのが、A/D変換に要する時間です。 データシートによると、A/D変換に要する時間は、最短で"20 ADCK + 5 BUSCLK"となっています。 ADCKの周波数は、8MHzが上限です。 20MHzのBUSCLKを4分周した5MHzをADCKに使おうとすると、最短A/D変換時間は"85 BUSCLK"つまり4.25µ秒と計算できます。 少なくともこの期間だけはPWM出力をLOWにしなくてはなりません。 つまり、デューティー比の上限が決まってしまうということになります。
実際の設計では、A/D変換時のサンプリング時間を長めにして変換時間を8.25µ秒とし、PWMデューティー比の上限を50%としてあります。
また、A/D変換時には、PWMの二波形分を使用し、変換開始と変換結果の受け取りを分けて、PWM波形8周期でデューティー比の更新を行うものとしてあります。 このため、サンプリング周波数は、1 / (25.6µsec × 8) = 4880Hz と当初の予定よりも低くなりました。
PHASE | お仕事 |
---|---|
0 | AD27(内蔵バンドギャップ)のA/D変換開始 |
1 | AD27のA/D変換結果受け取り |
2 | AD2(PTA2)のA/D変換開始 |
3 | AD2のA/D変換結果受け取り |
4 | AD3(PTA3)のA/D変換開始 |
5 | AD3のA/D変換結果受け取り |
6 | - |
7 | 変換結果の転送とフレーム終了の通知 |
PHASE#7では、一次バッファに貯めた三つのA/D変換結果をまとめて最終バッファに転送します。 そして、メインループにフレームが終了した、つまりA/D変換結果が出揃ったことを通知します。 メインループでは、この通知に同期してデューティー比の計算を開始します。
いや、とにかく、ギリギリいっぱいです。
火入れ式
プログラムができたので、実行させてみます。 使用したコイルは、MC9S08SH4 のギャング出力でバックコンバータ (2)で作成した"35T0870-00H SINGLE"です。
最初のプログラムでは、P制御のゲインはハードコーディングしてあります。 また、変数"duty"の下限と上限をそれぞれ[20,132]としました。 まずは、VDDの0.3倍(77÷256)の値をターゲットにして出力電圧をハンディテスタで測定しました。 VDDは、5.05Vなので、理論的には1.519Vになるはずです。
kp | 無負荷時 | 15Ω負荷 |
---|---|---|
1 | 1.524V | 1.398V |
2 | 1.524V | 1.435V |
3 | 1.523V | 1.457V |
4 | 1.527V | 1.474V |
5 | 1.513V | 1.463V |
ゲインを上げていくと負荷をつないだときの電圧の落ち込み(ロードレギュレーション)が改善されていることがわかります。 ただ、"kp"が4以上になると様子が変です。
実は、この実験では、"kp"を4にした時から発振を起こしてしまいました。 周波数は、200Hzです。
こちらは、”kp"が3の時です。 激しい発振は観測されないのですが、200Hzにピークがあるので、発振気味であることに変わりはないようです。 スペクトラムを見ると20kHz近辺にもピークがあります。 これは、PWMの周波数です。 LCフィルタでは取りきれなかったようです。
プロジェクト・アーカイブ
稚拙ではありますが、このプロジェクトを公開します。 興味がありましたら、ご覧になったうえでダメ出しをしていただければ幸いです。 このリンクを"SH10.zip"という名前で保存するとZIPファイルが再現できます。
参考文献
HCS08 Unleashed: Designer's Guide to the HCS08 Microcontrollers
- 作者: Fabio Pereira
- 出版社/メーカー: Booksurge Llc
- 発売日: 2007/11/13
- メディア: ペーパーバック
コメント 0