パワエレ学生の備忘録

電気電子,パワエレ(特にスイッチング電源やモータ),制御工学や趣味に関すること,を赴くままに綴る,便所の落書きのようなところ/保有資格:第三種電気主任技術者,第一種電気工事士

【離散化・量子化】スイッチング電源をディジタル制御する際に気をつけること

 DC-DCコンバータは,主にオペアンプ回路で構成するアナログ制御に加えて,近年ではディジタル制御が注目されている.

 ディジタル制御はA/D変換により信号をサンプルホールドし,補償器はディジタルフィルタとして実現,PWM生成はディジタルPWM(DPWM)に置き換えられる.これらは一般的なマイコンであれば全て搭載されている機能であり,安価で制御パラメータの調整も容易で,開発環境も無料のものが多くなってきたのでアマチュアにも扱いやすい.

 ただディジタル制御が万能かと言われればそうではなく,離散化と量子化といった特有の現象がある.

 離散化は教科書でも取り上げられるが,量子化は無視するものとして考えられることが多い.

 今回は備忘録として,ディジタル制御における離散化,量子化の影響について考える.

f:id:ENOTYAMA:20200101204641p:plain

スイッチング電源におけるディジタル制御の構成図(電圧モード制御の場合)
続きを読む

出力電圧検出のA/D変換で気をつけるべきこと

 DC-DCコンバータは3.3Vと低電圧なものもあれば,45Vや100,200V以上の高電圧まで非常に幅広い.通常,DC-DCコンバータを制御するには,出力電圧を検出する必要がある.検出レンジがでかいまま,ただ何も考えずにマイコンに接続すると破損するので,分圧抵抗で電圧を落としてからA/D変換に入れる.

 また,パワー部は強いノイズにさらされているので,フィルタを通すことが普通である.したがって,分圧回路はストレートに考えた場合,このフィルタ部を含めると下図のようになる:

f:id:ENOTYAMA:20191124230507p:plain

LPF付き分圧回路

 LPFはRとCのセットで機能するが,この回路では,分圧抵抗がRの成分を持っているので特別追加する必要はない.

 一方で出力側(\(V_{\rm o_det})にはA/D変換器がぶら下がっている.TI社から供給されているTMS320F2837xSより,A/D変換器の回路は,下図のようになっている:

f:id:ENOTYAMA:20191126222937p:plain

A/D変換回路

 図からわかるように,A/D変換回路には入力キャパシタ\(C_{\rm p} = 12.9\ {\rm pF}\)※,S/H回路スイッチ抵抗\(R_{\rm on} = 425\ {\rm \Omega} \),S/Hキャパシタ\(C_{\rm h} = 14.5\ {\rm pF}\)が存在する.\(R_{\rm s}\)は,等価入力抵抗で,これはユーザが設定する.

※値はポートによって違う.詳細は参考文献のデータシート参照

f:id:ENOTYAMA:20191126223956p:plain

入力キャパシタの値

 以上より,出力電圧を検出してからS/Hキャパシタ電圧まで2段のLPFが構成されていることがわかる.

 マイコンに実際取り込まれる値は\( C_{\rm h} \)に印加される電圧であるから,以上の回路をまとめると下図のようになる:

 

f:id:ENOTYAMA:20191201194548p:plain

ADCを含めた検出回路

 実際にこの回路を回路シミュレータPSIMのACSweep機能を用いて周波数特性を解析した結果,下図のようになった:

 

f:id:ENOTYAMA:20191201201328p:plain

検出回路+ADCの周波数特性

ただし,サンプリング周波数は100kHz,ホールド時間は75nsecとし,用いたパラメータは次の通り:

Component Value
High-side resistor RH 51
Low-side resistor RL 2.2
Filter capacitor Cf 1.5 nF
Parallel capacitor Cp 12.9 pF
ON resistor RON 425 Ω
Hold capacitor Ch 14.5 pF

(表が貧弱すぎるので後々改善する) 

 

 分圧+LPF回路のカットオフ周波数は設計上,50kHzであった.しかし,A/D変換回路を含めたf特を見ると,それよりやや低い30kHzになっていることがわかる.

 サンプリング周波数当たりでゲインがバウンドしているのは,ディジタルフィルタ特有のもので,折返し雑音によるものである.また,バウンドがあまりキレイでないのは,ACSweepのサンプル数が少ないことが原因...

 いちいちシミュレーションにかけるのが面倒であれば,素直にバッファアンプを用いることが手っ取り早い.ただし,100kHzオーダ以上になるとアンプ自体の特性も考慮しなければいけないので,時間とコストを考慮して使い分ける必要がある.

 

参考文献

TI社,TMS320F2837xS Delfino™ Microcontrollers datasheet (Rev. G),2018,2019/11/24閲覧

http://www.ti.com/lit/ds/symlink/tms320f28377s.pdf

 

sim.okawa-denshi.jp

 

 

多相スイッチング電源である相だけ停止させる方法

 研究でマルチフェーズ方式のDC-DCコンバータについてやってるので,変わったテクニックの備忘録.

 マルチフェーズ方式では,負荷の状況に応じて,相数を切り替えることで低負荷でも高効率で駆動することができる.切り替える方法は,スイッチング素子をゲートロックすることが一番手っ取り早い.

 ただし,同期整流の場合は注意すべきポイントがある(非同期の場合は問題にならない).

 今回は,TI社が供給するマイコンC2000シリーズTMS320F28377SのPWM機能でゲートロックさせる方法を紹介する.

f:id:ENOTYAMA:20191117103134p:plain

TMS320F28377S(www.tij.co.jpより)
続きを読む

PSoCの割り込み処理記述

他にも良いやり方があるのかもしれない。
 
 
 

リファレンスに割り込み処理について書かれたものが見当たらなかったので,明治大学さんの解説資料を参考にしてまとめる。

今回はUARTのRXRegisterFull割り込みを例に設定する。
 
前もってやっておくこと:
・UARTの設定をChip Editerで一通りやっておく
・mainファイルには何も書かず,Buildする
 
Chip Editerタブに切り替え,Workspace Explorerウィンドウの中からSource Files\boot.asmファイルを開く。
そこで,検索ツールを使うなりして,「Interrupt Vector Table」のところまで飛ぶ。
(95行目あたりにあったりなかったり)
 

f:id:ENOTYAMA:20140303233308p:plain

 
そこから下に「Insert your custom code below this banner」ってある。上の画像にもちらっと写ってたり。
で,その下から割込みベクタが色々書いてあるが,一番上に
     org     04h
     halt
とある。これは,電源電圧が低すぎる状態になるとプログラムを非常停止するものなのかな?よく分からん。
少し下に行くと,
     org     08h                         ;analog Column 0 Interrupt Vector
     // call     void_handler
     reti
がデフォルトなら書き込まれてある。これは見た感じ,analog0の割込みベクタのようだが,コールの記述が打ち消されている。まだ,使うように設定されていない。
 
そこからまた下の方に行くと,
    org   2Ch                      ;PSoC Block DCB03 Interrupt Vector
    ljmp _UART_1_RX_ISR
    reti
とある。これは,UARTモジュールを設定したので書き換えられたものと推測される。
この「_UART_1_RX_ISR」をどこかにメモっておこう。
 
今度は,lib\Library Source Files\UART_1INT.asmを開いて,さっきメモった文字列を検索する。
 

f:id:ENOTYAMA:20140303233317p:plain

 
赤で示したところで,
     Insert your custom assembly code below this banner
というところがあるので,その下の青いところに
     ljmp    _ (interrupt vector name)
を入力する(括弧のところは,わかりやすい割込み名を入れておいた方が良い。先頭のアンダーバーは必ず入れてておかないとダメ)。
 
次に,main.cファイルを開いて,プリプロセッサ
     #pragma interrupt_handler     (interrupt vector name)
を追加する(こっちでは,先頭のアンダーバーは入力しない)。
あとは,割込み関数を書いていくだけ。書式は,
     void (interrupt vector name) (void)
     {
          // interrupt process
          return ;
     }   
簡単やね。
 
あとは,割込み関数に割込み禁止・許可の命令も忘れずに書いておいて,完成!!