1. 从两节串联电池的“木桶效应”说起如果你拆开过任何一款便携式储能电源、户外电源或者工业设备里的备用电池包大概率会看到两节、三节甚至更多节电芯串联在一起工作。串联的目的很朴素——把电压抬上去让后级DC-DC或者逆变器能高效工作。但串联这件事本身会带来一个绕不开的麻烦两节电池不可能永远一模一样。新电池出厂时容量、内阻、自放电率就有微小差异用了一段时间之后差异会被放大。充电时串联回路里流过两节电池的电流完全相同容量偏小或者内阻偏大的那一节会先到达满充电压放电时它又会先跌到截止电压。BMS如果只盯着整串总压就会出现“一节已经饿死另一节还撑得慌”的局面。这就是电池圈里常说的木桶效应——整串的可用容量由最弱的那一节决定。解决思路有两条路一条是被动均衡用电阻把电压高的那节“放血”把能量白白烧掉另一条是主动均衡把电压高的那节的能量搬到电压低的那节去。被动均衡电路简单、成本低但发热大、效率低在储能和备用电源这种对能效和温升敏感的场景里主动均衡明显更合适。我这次要聊的方案就是用MP2642GR-Z这颗双向升降压充电管理芯片配合STM32F042K6这颗Cortex-M0内核的MCU做一套两节串联电池的主动均衡系统。MP2642GR-Z负责功率级的双向能量搬运STM32F042K6负责采样、判断、控制和保护逻辑。整套方案的目标很明确让两节电池的电压差长期稳定在几十毫伏以内充放电过程中自动把能量从高电压侧搬到低电压侧而不是烧掉。这套东西适合谁看如果你正在做储能BMS、备用电源、便携式电源、机器人电池包或者单纯想搞明白主动均衡到底怎么落地这篇内容应该能给你一条从选型到调试的完整路径。下面我会把芯片为什么这么选、电路怎么搭、MCU怎么控制、实测中会遇到什么坑一层层拆开讲。2. MP2642GR-Z 到底是一颗什么芯片为什么选它做均衡2.1 先看清它的本质双向升降压充电管理MP2642GR-Z 不是一颗专门的“均衡芯片”它的本职工作是双向升降压充电管理。所谓双向是指它既能从输入端给电池充电Buck方向也能从电池端向输出端放电Boost方向。所谓升降压是指它的拓扑结构允许输入电压高于、低于或等于电池电压都能稳定工作。这个特性用在两节串联电池均衡上逻辑就变得很顺把两节电池的中点作为公共参考芯片可以在“给上节充电”和“给下节充电”两个方向之间切换或者更常见的是把能量从电压高的那节抽出来经过升降压变换后注入电压低的那节。因为芯片本身支持双向能量搬运不需要额外的功率级一颗芯片就能搞定。我选它的核心理由有三条。第一集成度高。它内部集成了功率MOSFET驱动、电流采样、环路补偿外围只需要电感、电容和少量电阻PCB面积能压得很小。第二支持I2C或者模拟编程MCU可以通过寄存器配置充电电流、终止电压、输入电流限值等参数灵活性比固定参数的均衡IC高得多。第三工作电压范围宽两节锂电串联的电压范围大概在6V到8.4V之间MP2642GR-Z的输入输出范围能覆盖这个区间不需要额外的前级变换。2.2 和专用均衡IC的对比为什么不用BQ系列或者被动方案市面上做两节电池均衡常见的选择有几类。一类是专用被动均衡IC比如某些带内部均衡开关的充电管理芯片本质上就是给每节电池并一个电阻加开关电压高的那节多放一点电。这类方案成本极低但均衡电流通常只有几十毫安均衡速度慢而且能量全变成热。另一类是专用主动均衡IC比如某些电容切换或者电感切换的均衡芯片效率高但通常只支持固定的均衡电流配置灵活性差而且很多是针对特定电池串数设计的。MP2642GR-Z 的定位介于两者之间。它比被动方案效率高得多能量是搬过去而不是烧掉又比很多专用主动均衡IC灵活因为它的电流和电压参数可以通过MCU动态调整。举个例子当两节电压差只有20mV时我可以把均衡电流设小一点避免过冲当电压差达到200mV时我可以把电流拉大加快均衡速度。这种动态调节能力是固定参数的均衡IC给不了的。还有一个实际考虑供应链和成本。MP2642GR-Z 在工业类和消费类电源里用量不小价格比很多车规级均衡IC友好交期也相对稳定。对于中小批量项目来说这一点很现实。2.3 关键参数解读哪些指标决定了均衡效果选芯片不能只看“支持双向”得把几个关键参数拎出来看。参数典型值/范围对均衡的影响输入电压范围4.5V ~ 36V覆盖两节锂电串联的6V~8.4V余量充足充电电流可编程范围最高可达数安培决定均衡速度电流越大均衡越快但发热也越大电流采样精度±2%左右影响均衡电流的准确性精度越高两节能量搬运越精确开关频率几百kHz量级决定电感选型频率高电感小但开关损耗大通信接口I2C/模拟决定MCU控制的灵活度I2C可读寄存器状态封装QFN散热好但手工焊接难度高需要热风枪这里重点说电流采样精度。均衡的本质是控制能量搬运的速率和方向如果电流采样不准MCU以为自己在搬100mA实际搬了150mA就可能出现过均衡——把低电压那节充过头。MP2642GR-Z 的采样精度在同类芯片里算中上水平配合外部校准能把误差压到可接受范围。开关频率也值得注意。频率越高电感可以选得越小但开关损耗和驱动损耗会上升。对于均衡这种小电流应用我倾向于把频率设在中间档既不让电感太大也不让效率掉太多。具体值要根据电感和MOSFET的选型来权衡后面实操部分会展开。3. STM32F042K6 在均衡系统里扮演什么角色3.1 为什么不用更便宜的8位机或者纯硬件比较器有人会问均衡逻辑不就是比较两节电压谁高就把谁的能量搬走吗用个比较器加几个电阻不就行了为什么要上MCU这个问题我一开始也想过。纯硬件方案确实能实现“电压高的那节放电”这种简单逻辑但主动均衡比被动均衡复杂得多。主动均衡需要实时采样两节电压、计算电压差、判断均衡方向、设定均衡电流、监控芯片状态、处理过温过流保护、在充电和放电两种工况下切换策略。这些逻辑用纯硬件搭电路会非常臃肿而且参数改起来要动硬件。STM32F042K6 的优势在于它便宜、够用、外设刚好匹配。Cortex-M0内核48MHz主频对于这种控制任务绰绰有余。它自带12位ADC可以直接采样两节电池的分压电压自带I2C接口可以直接配置MP2642GR-Z的寄存器自带定时器可以产生PWM或者做周期任务调度自带CAN或者UART方便把均衡状态上报给上位机。封装是LQFP32或者QFN32体积小适合塞进电池包旁边的小板子上。更关键的是STM32F042K6 的功耗低。均衡系统本身是要消耗能量的如果MCU自己耗电太多就本末倒置了。F042在运行模式下电流只有几毫安睡眠模式下可以降到微安级对于备用电源这种长期待机的场景很重要。3.2 采样、判断、控制MCU的三大任务拆解MCU在这套系统里的工作可以拆成三块采样、判断、控制。采样部分需要拿到两节电池各自的电压。两节串联时下节电池的负极是系统地上节电池的负极是两节的中点。所以下节电压就是中点对地电压上节电压是总压减去中点电压。用两个ADC通道分别采总压和中点电压做减法就能得到上节电压。这里要注意分压电阻的精度和温漂1%精度的电阻是底线温漂最好在100ppm以内否则采样误差会直接变成均衡误判。判断部分是MCU的“大脑”。核心逻辑是如果上节电压比下节高出一个阈值比如30mV就启动均衡把能量从上节搬到下节反之则反向搬运。阈值不能设太小否则采样噪声会让系统频繁启停也不能设太大否则均衡效果不明显。我一般会设一个滞回区间比如启动阈值30mV停止阈值10mV避免在阈值附近抖动。控制部分是MCU的“手”。通过I2C给MP2642GR-Z写寄存器设定均衡电流的大小和方向。这里有个细节MP2642GR-Z 的方向控制通常是通过配置它工作在充电模式还是放电模式来实现的。当需要从上节搬能量到下节时让芯片从上节取电经过变换后给下节充电反向则相反。MCU要根据判断结果动态切换芯片的工作模式。3.3 资源分配ADC、I2C、定时器怎么排布STM32F042K6 的资源不多得精打细算。我的分配方案是这样的ADC用两个通道一个采总压分压一个采中点分压。ADC配置成扫描模式由定时器触发比如每100ms采样一次。采样时间设长一点比如239.5个周期让采样电容充分充电减少误差。I2C用硬件I2C速率设400kHz。MP2642GR-Z的寄存器不多400kHz足够在几毫秒内完成一次配置。注意I2C的上拉电阻要选对一般4.7kΩ总线电容大的话要减小。定时器用一个基本定时器做系统时基比如1ms中断一次在中断里做软件计时。另一个定时器触发ADC保证采样周期稳定。GPIO留几个做状态指示和使能控制。比如一个引脚控制MP2642GR-Z的使能一个引脚驱动LED指示均衡状态。这里有个经验不要把ADC采样放在主循环里轮询。主循环里如果有I2C通信、状态机切换等耗时操作采样周期会抖动导致电压计算出现周期性误差。用定时器触发ADC配合DMA搬运结果是最稳的做法。F042虽然资源少但DMA通道还是有的用起来不亏。4. 硬件设计从原理图到PCB的落地细节4.1 功率级拓扑电感、电容、采样电阻怎么选MP2642GR-Z 的功率级是典型的升降压拓扑外围核心元件是电感、输入输出电容和电流采样电阻。电感的选型要看开关频率和电流纹波。假设开关频率设为400kHz均衡电流最大1A纹波电流取额定电流的30%即0.3A根据公式 L (Vin × (1 - D)) / (f × ΔI)在升降压边界附近估算电感值大概在几微亨到十几微亨之间。我一般会选4.7μH到10μH的屏蔽电感饱和电流要大于最大均衡电流的1.5倍直流电阻越小越好减少铜损。屏蔽电感很重要否则均衡时电感啸叫或者干扰采样。输入输出电容的作用是滤除开关纹波。MP2642GR-Z 的datasheet会给出推荐值通常输入侧和输出侧各需要几十微法的陶瓷电容再并一个几百微法的电解或者钽电容做储能。陶瓷电容选X5R或X7R耐压要高于电池最高电压的1.5倍。电解电容的ESR要低否则纹波会很大。电流采样电阻决定均衡电流的测量精度。MP2642GR-Z 通常用外部采样电阻阻值根据最大电流和芯片采样范围来定。比如最大均衡电流1A采样电压范围50mV那采样电阻就是50mΩ。这个电阻的功率要算够1A × 1A × 50mΩ 50mW选0805或1206封装的合金电阻温漂要小。采样走线要用开尔文接法从电阻焊盘内侧引出避免走线电阻引入误差。4.2 采样电路分压电阻精度与滤波设计电压采样是均衡系统的“眼睛”眼睛不准后面全白搭。两节电池的总压最高8.4V中点电压最高4.2VSTM32F042K6的ADC参考电压是3.3V所以必须分压。分压电阻的选择有几个讲究。第一阻值不能太小否则会持续消耗电池电量。假设用两个100kΩ串联分压总电流是8.4V / 200kΩ 42μA对于长期待机的备用电源来说可以接受。如果用小到10kΩ电流就是420μA日积月累会明显影响待机时间。第二精度要高1%是底线0.1%更好。第三温漂要匹配两个电阻的温漂系数最好一致否则温度变化时分压比会漂。滤波方面分压点要并一个0.1μF的电容到地和分压电阻组成RC低通滤波截止频率大概在几十赫兹把开关噪声和工频干扰滤掉。但电容不能太大否则电压变化时ADC响应会滞后。我一般用0.1μF配100kΩ时间常数10ms对于100ms的采样周期来说刚好。还有一点容易被忽略ADC参考电压的稳定性。STM32F042K6 的VDDA如果直接接电池供电的LDO输出LDO的精度和温漂会直接影响采样结果。如果对精度要求高可以用外部基准芯片比如2.5V或3.0V的基准给VDDA供电。这样采样值只和分压电阻有关和电池电压波动无关。4.3 保护与隔离过流、过温、反接怎么防均衡系统工作在电池包内部环境恶劣保护设计不能省。过流保护MP2642GR-Z 本身有逐周期电流限制但那是芯片级的。系统级还需要MCU监控采样电流如果连续几个周期超过阈值就关断芯片使能并记录故障。阈值一般设为最大均衡电流的1.2倍。过温保护芯片内部有温度传感器MCU可以通过I2C读取结温。如果结温超过125°C就降低均衡电流或者暂停均衡。另外PCB上可以在芯片附近放一个NTCMCU用ADC采样做板级温度监控。双重保护更稳妥。反接保护电池包在装配或者维护时可能接反。虽然MP2642GR-Z 的输入输出有一定耐压但反接电压可能超过绝对最大额定值。简单做法是在电池输入串一个肖特基二极管但会带来压降和损耗。更好的做法是用P沟道MOSFET做理想二极管压降小效率高。不过这会增加成本和板面积要根据项目定位权衡。隔离方面如果均衡板和主控板距离较远I2C通信可以考虑加隔离器避免地环路干扰。但大多数电池包内部空间紧凑均衡板和电池就在一起隔离不是必须的。5. 软件逻辑均衡策略怎么写才不来回震荡5.1 电压差计算与阈值滞回设计均衡策略的核心是电压差。MCU每100ms采样一次总压和中点电压算出上节电压V1和下节电压V2然后算差值ΔV V1 - V2。如果直接用ΔV和0比较会出现什么问题假设ΔV在0附近波动比如采样噪声让ΔV在5mV和-5mV之间跳均衡方向就会频繁切换芯片一会儿充电一会儿放电电感啸叫效率极低。这就是震荡。解决办法是滞回。设定两个阈值启动阈值Vth_on和停止阈值Vth_off。比如Vth_on 30mVVth_off 10mV。当ΔV 30mV时启动正向均衡上节到下节当ΔV -30mV时启动反向均衡当|ΔV| 10mV时停止均衡。在10mV到30mV之间保持当前状态不变。这样就把震荡区间隔开了。滞回窗口的大小要根据采样噪声来定。如果ADC噪声峰峰值是5mV滞回窗口至少要是噪声的2倍以上也就是10mV起步。我一般设20mV到30mV的滞回实测比较稳。5.2 均衡电流的动态调节什么时候该大什么时候该小均衡电流不是越大越好。电流大均衡快但发热也大而且容易过冲。我的策略是分段调节电压差范围均衡电流理由10mV ~ 50mV小电流比如100mA差值小慢慢搬避免过冲50mV ~ 150mV中电流比如300mA差值中等兼顾速度和精度 150mV大电流比如800mA差值大快速拉近但要注意温升这个分段不是固定的要根据电池容量和热设计来调。电池容量大均衡电流可以相应放大散热条件差就要限制最大电流。MP2642GR-Z 的电流可以通过I2C寄存器设置MCU根据ΔV查表或者做线性插值动态写入。还有一个细节均衡电流的爬升和下降要缓变。不要从100mA直接跳到800mA那样电感电流会突变产生电压尖峰。可以在几十毫秒内分几步过渡让环路慢慢跟上。5.3 充电、放电、静置三种工况下的策略差异均衡策略不能一套逻辑用到底要分工况。充电时充电电流从外部灌入两节电池都在升压。这时候均衡的目标是让两节同时到达满充电压。如果上节先到4.2V下节才4.0V继续充会上节过充。所以充电时均衡要更积极阈值可以设小一点比如20mV就启动电流也可以大一点因为充电本身有能量输入均衡消耗的是输入能量不额外消耗电池。放电时两节电池都在降压目标是让两节同时到达截止电压。如果下节先跌到3.0V上节还有3.3V继续放会下节过放。放电时均衡同样要积极但要注意放电时系统本身在消耗能量均衡再搬能量总输出会减少。所以均衡电流要适当限制不能影响主输出。静置时没有充放电电流两节电池电压会慢慢回弹。这时候均衡主要是消除自放电差异带来的电压差。静置时均衡电流可以小一点因为不赶时间而且静置时系统可能处于低功耗模式MCU要定期唤醒采样均衡完再睡。三种工况的切换MCU可以通过检测总电流方向来判断。如果总电流明显为正充电进充电策略明显为负放电进放电策略接近零静置进静置策略。电流检测可以用霍尔传感器或者采样电阻精度要求不高能判断方向就行。6. 实测中遇到的坑与排查过程6.1 均衡不启动采样误差把电压差吃掉了板子焊好烧进程序上电两节电池电压差明明有80mV但均衡就是不启动。用万用表量分压点电压和MCU读到的ADC值对不上差了十几毫伏。排查过程先查分压电阻标称100kΩ实际量出来一个99.8kΩ一个100.3kΩ误差0.5%在1%以内不至于差十几毫伏。再查ADC参考电压VDDA是3.3V LDO输出实测3.28V也正常。最后查采样时序发现ADC采样时间设得太短只有7.5个周期而分压电阻是100kΩ等效源阻抗很高采样电容根本没充到稳定值。根因STM32的ADC采样保持电路需要足够的充电时间源阻抗越高需要的采样时间越长。100kΩ分压的等效源阻抗是50kΩ两个100kΩ并联对于12位精度采样时间至少要几十微秒。7.5个周期在48MHz ADC时钟下只有0.15μs远远不够。解决把采样时间改成239.5个周期大概5μs再配合外部0.1μF电容采样值稳定了。同时把分压电阻从100kΩ降到47kΩ牺牲一点待机电流换取更低的源阻抗。改完之后ADC读数和万用表差在2mV以内均衡正常启动。提示高阻分压做ADC采样采样时间一定要算够。STM32的参考手册里有源阻抗和采样时间的对应表别凭感觉设。6.2 均衡震荡滞回窗口设小了第一版程序里滞回窗口设了10mV结果均衡状态指示灯一直在闪电感有轻微的吱吱声。用示波器看均衡电流发现它在正负之间来回摆周期大概几百毫秒。根因ADC噪声峰峰值实测有8mV左右滞回窗口10mV只比噪声大一点ΔV在阈值附近时噪声直接把判断结果翻来覆去。加上均衡启动后能量搬运会让电压差快速缩小缩到阈值以下又停止停止后电压回弹又超过阈值形成极限环。解决把滞回窗口加大到30mV同时加入“最小均衡时间”——一旦启动均衡至少持续5秒即使ΔV已经小于停止阈值也不立即停等5秒后再判断。这样避免了频繁启停。另外在ADC采样后加了滑动平均滤波每4次采样取平均把噪声压到3mV以内。6.3 温升超标均衡电流和电感选型不匹配带载测试时均衡电流设到800mA跑了十分钟MP2642GR-Z的封装温度到了90°C电感也烫手。用热像仪看发热主要集中在芯片和电感。根因电感选的是4.7μH、额定电流1A的型号但直流电阻有80mΩ800mA时铜损是0.8×0.8×0.08 51mW不算大。问题出在电感的饱和电流上——4.7μH的电感在800mA时已经接近饱和电感量下降纹波电流急剧增大开关损耗和磁芯损耗都上去了。芯片的开关损耗也和电流平方成正比800mA比300mA时发热明显增加。解决换用10μH、饱和电流2A、直流电阻40mΩ的电感。同时把最大均衡电流限制在600mA超过600mA的电压差用更长的时间来均衡。改完之后满载跑半小时芯片温度65°C电感55°C可以接受。注意电感选型不能只看电感量和额定电流饱和电流和直流电阻同样关键。均衡这种连续工作的场景电感的温升往往比芯片还难搞。6.4 I2C通信偶发失败上拉电阻和总线电容的匹配调试时发现MCU偶尔读不到MP2642GR-Z的寄存器I2C报NACK。用逻辑分析仪抓波形发现SCL上升沿有点缓特别是在均衡工作时波形更差。根因I2C总线上挂了MCU和MP2642GR-Z走线大概5cm总线电容估计有50pF。上拉电阻用的是10kΩ上升时间 τ R × C 10k × 50p 0.5μs对于400kHz的I2C来说上升时间偏大接近规范上限。均衡工作时开关噪声耦合到总线上进一步恶化了信号质量。解决把上拉电阻从10kΩ降到4.7kΩ上升时间降到0.235μs波形明显改善。同时在I2C走线旁边加了地线屏蔽减少噪声耦合。改完之后连续跑24小时没有出现NACK。7. 几个让均衡效果更好的经验技巧7.1 采样时机要避开开关动作MP2642GR-Z 开关时电感和MOSFET会产生电压尖峰和振铃如果ADC采样正好落在开关动作的瞬间采样值会偏。我的做法是让ADC采样和开关频率同步在开关管关断的中间时刻采样这时候电感电流平稳噪声最小。具体实现可以用定时器触发ADC定时器的相位和MP2642GR-Z的开关频率对齐。如果芯片的开关频率是内部固定的那就把ADC采样周期设成开关周期的整数倍多采几次取平均也能滤掉大部分开关噪声。7.2 均衡线束的压降要算进去均衡电流流过线束和接插件时会产生压降。如果均衡电流是500mA线束电阻是50mΩ压降就是25mV。这个压降会叠加在采样电压上导致MCU算出的电压差偏大或偏小。对于大电流均衡线束压降可能达到几十毫伏和均衡阈值一个量级不能忽略。解决办法有两个一是用开尔文采样把电压采样点放在电池极耳上而不是均衡板的输入端这样线束压降不进入采样回路二是软件补偿根据均衡电流和已知线束电阻算出压降从采样值里减掉。第一种更准但布线麻烦第二种简单但需要提前测准线束电阻。7.3 长期静置时的低功耗均衡策略备用电源可能几个月都不充放电这时候均衡系统如果一直全速运行会把电池耗干。我的策略是静置时MCU进入Stop模式RTC定时唤醒比如每10分钟唤醒一次采样两节电压如果ΔV超过阈值启动一次短时均衡比如30秒然后继续睡。均衡电流设小一点100mA足够。这样平均功耗可以压到几十微安对电池影响很小。唤醒后的采样要注意Stop模式刚退出时ADC参考电压和电源可能还没稳定要延时几毫秒再采样。另外均衡启动后如果电压差在短时间内没有缩小可能是电池老化或者采样故障MCU要记录异常并停止均衡避免无效消耗。7.4 用状态机代替if-else堆叠均衡逻辑如果全用if-else写代码会很难维护而且容易漏掉状态切换的边界条件。我推荐用状态机来写。定义几个状态IDLE空闲、BALANCE_UP上节到下节、BALANCE_DOWN下节到上节、FAULT故障。每个状态里处理采样、判断、控制输出状态之间根据条件跳转。这样逻辑清晰调试时也容易定位问题。状态机的跳转条件要写清楚比如从IDLE到BALANCE_UP的条件是ΔV Vth_on且无故障从BALANCE_UP回IDLE的条件是ΔV Vth_off或者均衡超时。每个状态进入时做初始化退出时做清理避免状态残留。8. 这套方案还能怎么扩展两节电池的均衡是最小系统但同样的思路可以往上扩展。比如三节、四节串联可以用多颗MP2642GR-Z每颗负责相邻两节之间的能量搬运MCU统一调度。或者用一颗芯片配合多路开关矩阵分时复用降低成本。STM32F042K6的资源有限如果串数多了可能要换F103或者G0系列ADC通道和I2C接口更多。另一个扩展方向是加入电量计。现在均衡只看电压但电压和SOC荷电状态不是线性关系特别是在磷酸铁锂电池上电压平台很平电压差小但SOC差可能很大。如果能结合电流积分或者阻抗跟踪均衡会更精准。不过这需要额外的电量计芯片和更复杂的算法适合对精度要求高的场景。通信方面可以把均衡状态通过CAN或者UART上报给主控主控再上传到云端或者本地显示屏。这样运维人员能看到每节电池的健康状态提前发现老化或者故障。STM32F042K6自带CAN加个收发器就能用硬件成本增加不多。我在实际项目里用这套方案跑了半年多两节电池的电压差长期稳定在15mV以内充放电循环后也没有明显扩大。中间换过几次电感型号调整过几次滞回参数整体稳定性是够的。如果你也在做类似的东西建议先把采样精度和滞回逻辑调稳再优化均衡电流和热设计顺序反了会走很多弯路。