双向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+ → 分流器 → 辅助降压转换器 → 负载 → GND。它直接流过分流器,并在测量值中按算术方式叠加。修正方法:将降压转换器输入端改接到分流器的电池端子一侧(上游)。这样辅助电流就会完全绕过测量元件。零成本,只需改动一次布局。

情况 B——母线侧降压转换器工作,转换器处于放电模式(电池 → 母线):
辅助电源从母线取电,但母线由电池通过你的转换器供电。根据能量守恒,电池会额外提供等于 P_aux / (V_batt · η) 的电流。该分量确实流经电池分流器——它是物理上真实存在的,不是布局造成的假象。重新布线无法消除它。

对于情况 B,有三种工程方案:

  1. 在固件中进行基于模型的补偿。 辅助负载高度可预测:MCU/静态电流(恒定,测量一次)加上栅极驱动电流,即每个开关通道正好为 Q_g · f_sw · N。在每个控制周期中从分流器读数中减去 I_aux,并从库仑计积分器中减去等效电荷。
  2. 直接测量。 在辅助电源轨上增加一个小型信号电流监测器(INA199 级),可获得实时、准确的数值用于相减。相比静态模型,这种方法能更好地处理栅极驱动的动态分量。
  3. 架构隔离。 使用独立电源为 MCU 供电,并通过隔离式 DC-DC 转换器为栅极驱动器供电。这样可完全消除耦合,但代价是增加 BOM 和 PCB 面积。

我还想提醒一点:在关注电流小于 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 模式下你就会遇到完全相反、但同样头疼的问题。

别为了这个重新打一块板子。做一个快速的台架特性测试:在不同开关频率下,测量进入 LMR38020 第 3 脚(VIN)的实际电流。把它作为查找表存到你的 flash 里。

当你的代码计算效率时,直接用:

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

用软件修掉,然后就可以收工了!