双向BUCK-BOOST中,MCU辅助电源电流污染了电流采样,如何消除对功率计算的影响?

我做了一个双向BUCK-BOOST数字电源,双侧都采用INA240A1做高端差分采样。MCU和栅极驱动需要从系统取电,做了双路供电(母线侧Buck + 电池侧Buck,二极管或门切换)。

问题:无论哪侧供电,辅助电源的电流最终都会流经电池回路的Shunt,导致小电流时(<500mA)测量误差极大,功率计算和库仑计完全不准。

看看原理图

取电点接错位置了兄弟。你把 Aux Buck 的输入端接到 Shunt 靠近电池/母线接线端子那头(即 Shunt 外侧),千万别接在 Shunt 内侧(功率回路侧)。这样辅助电源电流根本就不流经采样电阻,直接从端口走掉。
如果现在板子打出来了没法改,先拿割线刀把 Aux Buck 输入端的铜箔割断,飞一条线直接拉到电池输入接线柱上试一下,小电流测量立马就干净了。

硬件能改的楼上说了,我补充软件侧——辅助电流其实是可算可测的,不是黑盒:

辅助电流构成:

  • MCU+外设静态电流:数据手册+实测,基本是常数,比如 30~80mA
  • 栅极驱动电流:I_gate = Q_g × f_sw × N(Q_g 是 MOS 栅电荷,f_sw 开关频率,N 是管子数量)。比如你 4 颗管、Q_g=50nC、f=100kHz,驱动电流就是 4×50nC×100k = 20mA
  • 两部分加起来 ×Buck 效率修正,就是辅助总电流

补偿算法:

  1. 判断当前哪路 Buck 在供电(比较两路 Buck 输出电压,或读二极管或门状态)
  2. 电池侧 Buck 供电:直接 I_batt_real = I_shunt - I_aux_batt
  3. 母线侧 Buck 供电(放电模式):I_batt_real = I_shunt - P_aux/(V_batt×η),注意 P_aux 要用母线侧电压折算
  4. 库仑计同理,每个积分周期扣掉对应的等效电荷量

更稳的做法:辅助 Buck 输出端串个小 Shunt + INA199(几毛钱),实时测辅助电流,软件里动态扣除。比理论计算准,因为驱动电流随工况波动。

另外提醒:<500mA 时你的采样信噪比本来就差,INA240A1 的 offset(±25µV 级别)在 10mΩ Shunt 上就是 ±2.5mA 误差,小电流下补偿完也别指望 1% 精度,硬件上 Shunt 阻值可以适当加大。

輔助電流流向為 battery+ → shunt → aux Buck → load → GND。它會直接通過分流器,並以算術方式加到量測值上。修正方式:將 Buck 輸入端移到分流器的電池端一側(上游)。如此輔助電流便會完全繞過量測元件。零成本,只需修改一次佈局。

情況 B — bus-side Buck 啟用,轉換器處於放電模式(battery → bus):
輔助電源取自 bus,但 bus 是透過你的轉換器由電池供電。根據能量守恆,電池會額外提供等於 P_aux / (V_batt · η) 的電流。這一部分確實會流經電池分流器——它是物理上真實存在的,不是佈局造成的假象。沒有任何重新配線能消除它。

針對情況 B,你有三種工程選項:

  1. 在韌體中進行模型補償。 輔助負載高度可預測:MCU/靜態電流(固定值,量測一次即可)加上閘極驅動電流,也就是每個切換通道恰好為 Q_g · f_sw · N。每個控制週期從分流器讀數中減去 I_aux,並從庫倫計數器積分器中減去等效電荷。
  2. 直接量測。 在 aux rail 上加裝第二顆小型訊號電流監控器(INA199 等級),可取得即時且準確的數值用以扣除。這比靜態模型更能處理閘極驅動的動態成分。
  3. 架構隔離。 使用獨立電源供應 MCU,並透過隔離式 DC-DC 轉換器供應閘極驅動器。這會完全消除耦合,但代價是 BOM 與板面面積增加。

我也會特別提醒:當感興趣的電流小於 500 mA 時,請確認 INA240A1 在你所選分流器值下的偏移電壓,本身不會造成相當程度的誤差。補償無法挽回被雜訊底限淹沒的資訊。

这是后级供电

这是主拓扑

取电点都是在高侧Shunt之外

  • 我的所有取电点都是在高侧Shunt之外,这无论对于哪一级作为输入且是在BUCK的情况下,系统从输入取电,根本采集不到MCU电流,因为此时电流本身不经过Shunt

  • 但是在BOOST的情况下,MCU会从电压高的地方取电,导致输出侧即使外部看上去空载,但是仍然有MCU电流流过Shunt,小电流模式下就不友好

假设取电点都是在高侧Shunt之内的话

  • 无论哪一级作为输入,即使系统空载无输出的情况下,而此时输入依旧能看到MCU的电流,这小功率情况下,对效率计算不友好

罪魁祸首是 D17/D6 这对肖特基或门。

它不管你在 Buck 还是 Boost,只认"哪边电压高"。Boost 时输出侧电压高,辅助电源就从输出侧抽电流——但输出侧的能量是输入侧通过电感升压送上去的,所以输入侧 Shunt 必然要多承担 P_aux/η 的电流。

改法:把被动或门换成主动切换。

用一个 P-MOS + 小信号 NMOS 替代 D6(或两侧都换),MCU 根据当前工作模式控制通断:

  • Buck 模式(高压→低压):导通高压侧 MOS,关断低压侧,辅助电源从高压侧取电
  • Boost 模式(低压→高压):导通低压侧 MOS,关断高压侧,辅助电源从低压侧取电

核心原则:辅助电源始终从功率级的"输入侧"取电。功率电流和辅助电流同源同向,Shunt 测到的是总和,外部负载电流 = 总电流 − 辅助电流,但关键是空载时 Shunt 读数就是真实的辅助电流,你可以在软件里精确扣除,而不是被或门的自动切换搞得两边乱跳。

这个问题本质是双向拓扑里辅助电源的电流路径无法同时满足"采样纯净"和"能量不经过 Shunt"。我画一下你就明白了:

场景 A:取电点在 Shunt 外(你的现状)

  • Buck 模式:输入侧电压高 → 或门选输入 → 辅助电流从输入 Shunt 前取走 → 输入 Shunt 纯净 ✓
  • Boost 模式:输出侧电压高 → 或门选输出 → 辅助电流从输出 Shunt 前取走 → 但输出能量来自输入 → 输入 Shunt 看到 P_aux/(V_in·η) 的额外电流 ✗

场景 B:取电点在 Shunt 内

  • 任何模式下辅助电流都过 Shunt → 空载时 Shunt 永远非零 ✗

所以纯靠改取电点位置无解,必须引入"模式感知"或"物理隔离"。

方案一:模式感知主动取电(推荐)
如楼上所说,用 MOS 开关替代二极管,MCU 根据当前是 Buck 还是 Boost 控制从哪一侧取电,始终让辅助电源挂在功率级的输入侧。

方案二:软件实时扣除(最省事)
辅助电流 = MCU 静态电流(mA 级,几乎恒定)+ 栅极驱动电流(Q_g·f_sw·N,与开关频率成正比)。两部分都可以精确建模。在控制算法里:

I_load = I_shunt - I_aux / η_buck_aux

库仑计同样扣除。精度能做到 1% 以内,比你改硬件快得多。

兄弟,你把硬體分接點想太多了。你已經設計出一套系統,讓 MCU 從電壓最高的那一側給自己供電。這可是讓「大腦」持續運作的好設計,很穩健!

但你在抱怨數學「不好搞」。歡迎來到物理的世界!在 Boost 模式下,你的 MCU 本身就是負載。如果你把分接點移到分流器的內側,到了 Buck 模式,你只會遇到反過來的一樣麻煩。

別為了這個重新做一塊板子。先快速做個 bench characterization(實測特性分析):量測你的 LMR38020 第 3 腳(VIN)在不同切換頻率下實際流入的電流。把結果存成查找表放在 flash 裡。

當你的程式碼計算效率時,直接用:

P_{in\_true}=V_{in} \times I_{sense\_in}+(\text{Active\_Tap\_Logic} \times P_{aux})

用軟體修好就好,然後就不用管它了!