双方向 BUCK-BOOST デジタル電源を作成しました。両側とも INA240A1 を使用してハイサイド差動サンプリングを行っています。MCU とゲートドライバはシステムから給電する必要があるため、2 系統の電源を用意しました(バス側 Buck + バッテリ側 Buck、ダイオード OR で切り替え)。
問題:どちら側から給電しても、補助電源の電流は最終的にバッテリ回路の Shunt を流れてしまいます。その結果、小電流時(<500mA)に測定誤差が非常に大きくなり、電力計算とクーロン計がまったく正確ではありません。
知夏
3
兄弟、給電ポイントの接続位置が間違っています。Aux Buck の入力側を、Shunt のバッテリー/バスバー接続端子に近い側(つまり Shunt の外側)に接続してください。絶対に Shunt の内側(パワー回路側)には接続しないでください。そうすると、補助電源の電流がサンプリング抵抗をまったく流れず、ポートからそのまま逃げてしまいます。
もし今すでに基板が出来上がっていて修正できないなら、まずはカッターで Aux Buck の入力側の銅箔を切断し、ワイヤで直接バッテリー入力端子まで飛ばして試してみてください。小電流測定がすぐにきれいになります。
ABC
4
ハードウェア側で変更できることは上の階層の方がおっしゃったので、ソフトウェア側について補足します。補助電流は実は計算も測定も可能で、ブラックボックスではありません。
補助電流の構成:
- MCU+周辺機器の静的電流:データシートと実測値から求められ、基本的には定数です。たとえば 30〜80mA
- ゲート駆動電流:I_gate = Q_g × f_sw × N(Q_g は MOSFET のゲート電荷、f_sw はスイッチング周波数、N は素子数)。たとえば MOSFET が 4 個、Q_g=50nC、f=100kHz なら、駆動電流は 4×50nC×100k = 20mA
- この 2 つを足して Buck 効率で補正したものが、補助電流の合計です
補償アルゴリズム:
- 現在どちらの Buck が給電しているかを判定する(2 系統の Buck 出力電圧を比較する、またはダイオード OR の状態を読み取る)
- 電池側 Buck が給電している場合:直接
I_batt_real = I_shunt - I_aux_batt
- バス側 Buck が給電している場合(放電モード):
I_batt_real = I_shunt - P_aux/(V_batt×η)。ただし P_aux はバス側電圧で換算した値を使うこと
- クーロン計でも同様に、各積分周期で対応する等価電荷量を差し引く
より安定した方法:補助 Buck の出力端に小さな Shunt と INA199(数十円程度)を直列に入れて、補助電流をリアルタイムで測定し、ソフトウェア側で動的に差し引きます。理論計算よりも精度が高くなります。駆動電流は動作条件によって変動するためです。
もう一点注意:500mA 未満では、そもそもサンプリングの S/N が悪くなります。INA240A1 のオフセット(±25µV レベル)は、10mΩ Shunt では ±2.5mA の誤差になります。小電流では補償しても 1% の精度は期待できません。ハードウェア面では Shunt 抵抗値を適度に大きくするとよいでしょう。
CCC
5
補助電流は battery+ → シャント → 補助 Buck → 負荷 → GND と流れます。シャントを直接通過するため、測定値に算術的に加算されます。対策: Buck 入力をシャントのバッテリー端子側(上流)へ移すことです。そうすれば、補助電流は測定素子を完全にバイパスします。コストゼロ、レイアウト変更は1か所です。
ケース B — バス側の Buck が動作中で、コンバーターが放電モード(バッテリー → バス)の場合:
補助電力はバスから供給されますが、そのバスはコンバーターを介してバッテリーによって励磁されています。エネルギー保存則により、バッテリーは P_aux / (V_batt · η) に相当する追加電流を供給します。この成分はバッテリーシャントを実際に流れるため、物理的に実在し、レイアウト上のアーティファクトではありません。配線を変更しても除去することはできません。
ケース B では、次の3つの工学的選択肢があります。
- ファームウェアによるモデルベース補償。 補助負荷は非常に予測しやすいものです。MCU/静的電流(一定、1回測定)とゲートドライブ電流があり、後者はスイッチングチャネルあたり正確に Q_g · f_sw · N です。各制御サイクルでシャント読み取り値から I_aux を差し引き、クーロンカウンター積分器からも等価電荷を差し引きます。
- 直接測定。 補助レールに小型信号電流モニター(INA199 クラス)をもう1つ追加すれば、差し引くためのライブで正確な値が得られます。これにより、静的モデルよりもゲートドライブの動的成分をはるかに適切に扱えます。
- アーキテクチャ上の絶縁。 MCU を独立した電源で動作させ、ゲートドライバーを絶縁型 DC-DC コンバーター経由で給電します。BOM と基板面積を犠牲にして、結合を完全に除去できます。
また、注意点を挙げると、注目している電流が <500 mA の場合、使用するシャント値に対する INA240A1 のオフセット電圧自体が、同等程度の誤差に寄与していないか確認してください。ノイズフロアで失われた情報を補償で取り戻すことはできません。
ABC
7
原因は、D17/D6 のこのショットキーORゲートです。
これは、Buck でも Boost でも関係なく、「どちら側の電圧が高いか」だけを見ます。Boost 時には出力側の電圧が高いため、補助電源は出力側から電流を引っ張ります。しかし、出力側のエネルギーは入力側からインダクタを介して昇圧されて送り込まれるものなので、入力側の Shunt には必ず P_aux/η 分の電流が余分に加わります。
対策:受動ORゲートを能動切替に変更する。
P-MOS + 小信号 NMOS を使って D6 を置き換え(または両側とも置き換え)、MCU が現在の動作モードに応じてオンオフを制御します。
- Buck モード(高電圧→低電圧):高電圧側の MOS をオン、低電圧側をオフにし、補助電源は高電圧側から取る
- Boost モード(低電圧→高電圧):低電圧側の MOS をオン、高電圧側をオフにし、補助電源は低電圧側から取る
基本原則:補助電源は常に電力段の「入力側」から取る。電力電流と補助電流は同じ供給源から同じ向きに流れ、Shunt はその合計を測定します。外部負荷電流 = 総電流 − 補助電流ですが、重要なのは無負荷時の Shunt 読取り値が実際の補助電流そのものになるということです。そうすれば、ソフトウェア側で正確に差し引くことができ、ORゲートの自動切替によって両側がばらばらに切り替わる問題に振り回されずに済みます。
知夏
8
この問題の本質は、双方向トポロジにおいて、補助電源の電流経路が「サンプリングの純粋性」と「エネルギーが Shunt を通らないこと」の両方を同時に満たせないという点にあります。図にすればすぐ分かります。
シナリオ A:給電点が Shunt の外側(現在のあなたの構成)
- Buck モード:入力側電圧が高い → OR 回路が入力を選択 → 補助電流は入力 Shunt より手前から引き出す → 入力 Shunt は純粋 ✓
- Boost モード:出力側電圧が高い → OR 回路が出力を選択 → 補助電流は出力 Shunt より手前から引き出す → ただし出力エネルギーは入力に由来 → 入力 Shunt には P_aux/(V_in·η) 分の追加電流が見えてしまう ✗
シナリオ B:給電点が Shunt の内側
- どのモードでも補助電流が Shunt を通過 → 無負荷時でも Shunt が常に非ゼロ ✗
したがって、給電点の位置を変えるだけでは解決できません。どうしても「モード認識」または「物理的隔離」を導入する必要があります。
方案一:モード認識型のアクティブ給電(推奨)
先ほど上の投稿にあったように、ダイオードの代わりに MOS スイッチを使い、MCU が現在 Buck なのか Boost なのかを判別して、どちら側から給電するかを制御します。補助電源は常にパワー段の入力側に接続します。
方案二:ソフトウェアでリアルタイムに補正(最も簡単)
補助電流 = MCU の静止電流(mA 級でほぼ一定)+ ゲート駆動電流(Q_g·f_sw·N、スイッチング周波数に比例)。この2つはどちらも正確にモデル化できます。制御アルゴリズム内で:
I_load = I_shunt - I_aux / η_buck_aux
クーロン計でも同様に差し引きます。精度は1%以内にでき、ハードウェアを変更するよりもはるかに速く対応できます。
CCC
9
相棒、ハードウェアのタップを気にしすぎだよ。MCUがどちらかの高い側から自分自身に給電するシステムを構築しているんだ。それは、頭脳を生かしておくための、とても堅牢な設計だよ!
でも、数学が「扱いにくい」って文句を言っているわけだね。物理学へようこそ!Boostモードでは、MCUは文字どおり負荷そのものなんだ。タップをシャントの内側に移動しても、Buckモードでまったく同じ頭痛を逆向きに抱えるだけだよ。
このために新しい基板を作り回さないで。手早くベンチ評価をやろう。異なるスイッチング周波数で、LMR38020のピン3(VIN)に入る実際の電流を測定するんだ。それをフラッシュ内のルックアップテーブルとして保存しよう。
コードで効率を計算するときは、単にこれを使えばいい。
P_{in\_true}=V_{in} \times I_{sense\_in}+(\text{Active\_Tap\_Logic} \times P_{aux})
ソフトウェアで修正して、それで一件落着だよ!