
做储能和备用电源系统的人迟早都要面对同一个问题串联电池组用久了两节电池的电压总是越差越大。明明刚充满的时候都是同一块充电板带出来的放一段时间再测差的就越来越明显有的电池还在正常放电另一节已经因为过放被保护切断。以前我做24V备电系统时也栽过跟头后来用 MP2642GR-Z 加 dsPIC33EP512MU810 搭了一套主动均衡方案才把这个问题解决干净。这篇文章就把从硬件选型到控制算法的完整实现过程分享出来也把调试时踩过的那些坑一并写清楚。1. 串联电池为什么必须做均衡1.1 不均衡的根源不只是“电池不行”很多人有个误解觉得串联电池组不均衡是因为电池质量差。实际上就算出厂时电压、内阻都匹配得很好使用一段时间后依然会出现压差。原因有几个一是每节电池的自放电率不可能完全一致铅酸电池尤其明显同一批次的电池自放电差异甚至能到每月几个百分点二是电池组的散热条件不一样串联排列时中间那节电池温度往往比两端高温度越高自放电越快还影响内阻和容量衰减速度三是每次充放电循环中每节电池的库仑效率不完全相同日积月累就变成了明显的荷电状态偏移。这个问题的可怕之处在于串联电池组中容量最小的一节决定了整组的可用容量。如果两节12V电池串联成24V系统其中一节容量只剩80%那整个系统的放电容量就只有80%哪怕另一节状态再好也发挥不出来。更麻烦的是放电末期容量低的那节电压掉得特别快系统一旦检测到单节欠压就整体停机另一节明明还有电也只能干瞪眼。1.2 被动均衡和主动均衡怎么选早期的均衡方案大多是被动均衡原理就是给每节电池并联一个放电电阻电压高的那节通过电阻把多余能量以热量形式消耗掉。被动均衡结构简单、成本低但有两个硬伤一是能量被白白浪费均衡电流稍大一点电阻就烫得厉害二是均衡速度慢如果两节电池压差有100mV用0.3A的均衡电流去耗几小时可能都拉不回平衡。这在储能和备电这种经常需要长时间浮充、又要快速恢复备电能力的场景里非常不划算。主动均衡的思路完全不同它的核心不是把能量“烧掉”而是把能量从电压高的电池搬到电压低的电池里去。理想情况下两节电池最终都能达到接近相同的电压能量守恒效率高均衡速度快发热也小。这次项目用的 MP2642GR-Z 就是负责能量搬运的核心器件而 dsPIC33EP512MU810 则作为控制大脑实时采集电压、判断均衡方向、控制搬运电流。这套架构在小型储能和备用电源里面算是比较典型的主动均衡设计。2. 硬件系统拆解与关键参数设计2.1 整体架构采样、控制、功率三部分整套系统可以分成三个功能段采样段负责把两节串联电池的端电压准确采集到DSC的ADC里控制段由 dsPIC33EP512MU810 完成负责滤波、均衡判定和PWM驱动功率段则由 MP2642GR-Z 配合外围电感、MOS管和电感电流采样电路组成实现两节电池之间的双向能量转移。电池组的连接方式是这样的两节电池串联正极那一节叫B1负极那一节叫B2两节之间的连接点叫中点。采样电路分别测量B1和B2的端电压或者直接测量总电压和中点电压再相减。MP2642GR-Z 在功率级别需要跨接在两节电池之间也就是说它的两个功率端口分别接在B1的正极和B2的负极中间串一个大功率电感。当B1电压高于B2时MP2642GR-Z 把B1的能量抽出通过电感传递给B2反过来B2电压高时则把B2的能量传递给B1。这就是双向升降压的拓扑结构上其实就是一个同步Buck-Boost电路。这里要提醒一句MP2642GR-Z 具体是多大电流能力、什么封装和引脚排列不同批次的数据手册要以实物为准我这个项目里用的是2A级别配置。选它主要是看中它集成了同步整流控制逻辑和电流检测接口外围不需要额外搭运放电路省了很多事。2.2 电压采样电路设计细节电池均衡控制最怕的就是采样不准。采样准不准直接决定均衡方向对不对。这次我用的采样方式是精密电阻分压加RC低通滤波再接DSC的ADC引脚。以12V铅酸电池为例电池最高电压能到14.5V左右DSC的ADC参考电压是3.3V所以分压比至少要保证最大输入电压时不超量程。我用的是5.1kΩ和3.3kΩ的电阻组合分压比大约是0.39314.5V输入对应约5.7V这个还是超了。因此实际我把分压比做了调整用10kΩ和3kΩ分压比0.23114.5V对应约3.35V刚好压线。实际项目中我会留10%以上的裕量把满量程设计成13V左右对应的ADC满刻度这样更稳妥。分压电阻的精度要选0.1%温漂也要控制在25ppm以内否则温度一变两节电池的采样值都漂了压差计算就出现系统性误差均衡方向都可能搞反。电阻后面接了RC滤波我用的是100Ω串联100nF对地截止频率大约16kHz这个值要结合后续ADC采样率统一设计不是随便选的。还有一个特别容易踩的坑采样地不能用功率地。功率通道里流过的是几安培的均衡电流线路阻抗上的压降看起来只有几十毫伏但这已经是均衡判断阈值的数量级了。所以我在布线时把采样地单独走线从电池负极单独拉一根细线回到DSC的模拟地引脚避免采样地和功率地混在一起。2.3 功率级设计MP2642GR-Z 与外围功率器件MP2642GR-Z 做能量搬运时外围最关键的是电感、MOS管和电流采样电阻。电感需要根据开关频率和均衡电流来选。我用的开关频率是200kHz目标最大均衡电流2A输入输出电压范围在10V到15V之间电感量取22μH比较合适。饱和电流一定要留足余量至少按2.5倍最大稳态电流选也就是5A以上不然在大压差工作瞬间电感会饱和电流尖峰直接损坏MOS管。MOS管选的是低导通电阻的N-MOS单个导通电阻在10mΩ级别两个对管组成同步整流桥臂。驱动由MP2642GR-Z内部完成DSC只需要给它发使能信号和方向选择信号不需要自己去控制MOS管的开关时序。电流采样电阻我用的是10mΩ的精密电阻满载2A时压降只有20mV损耗很小但在PCB上要用四线开尔文接法采样线要很细避免走线电阻引入误差。再有就是输入和输出侧的滤波电容我这里各用了两颗470μF的电解电容并联再并一颗0.1μF的陶瓷电容滤高频纹波。这个电容容值是根据均衡电流的纹波要求算的不能随便缩小否则电压纹波会影响DSC的采样精度。2.4 核心器件选型速查模块推荐配置备注主控DSCdsPIC33EP512MU810512KB Flash、48KB RAM双ADC核能量转换芯片MP2642GR-Z双向升降压控制内集驱动与电流检测储能电感22μH / 5A饱和电流200kHz开关频率下匹配MOSFET低导通电阻N-MOS对管10mΩ级别散热小电流采样电阻10mΩ精密电阻四线接法开尔文布线分压电阻10kΩ / 3kΩ0.1%精度温漂25ppm以内3. 均衡控制算法与软件实现3.1 DSC资源分配与初始化dsPIC33EP512MU810 这颗DSC的亮点在于它有两个ADC核可以真正做到同一时刻采集两节电池的电压。这对均衡控制特别重要因为电池电压在均衡过程中是波动的如果两个采样时刻差了几毫秒算出来的压差就会混入动态误差。我是把ADC1接B1电压采样通道ADC2接B2电压采样通道两个核同时触发转换转换完成后进入中断读取结果。PWM方面我用了一个标准的定时器输出用于产生控制信号给MP2642GR-Z的使能和方向引脚。均衡电流的大小则通过PWM占空比调节MP2642GR-Z内部参考值来间接控制。因为功率级的开关频率是200kHz这个PWM不需要太快实际我用的是1kHz左右的慢速调节周期每毫秒更新一次均衡电流目标值。初始化代码大致是这个样子void init_system(void) { // 配置系统时钟使用内部振荡器倍频到70 MIPS CLKDIVbits.PLLPOST 0; CLKDIVbits.PLLPRE 0; PLLFBDbits.PLLDIV 42; __builtin_write_OSCCONH(OSCCON, 0x01); __builtin_write_OSCCONL(OSCCON, 0x01); while(OSCCONbits.LOCK ! 1); // ADC1和ADC2双核同步采样配置 ADCON1 0; // 设置ADC1寄存器 ADCON2 0; AD1CHS0bits.CH0SA 1; // B1电压采样通道 AD2CHS0bits.CH0SA 5; // B2电压采样通道 AD1CON1bits.ADON 1; AD2CON1bits.ADON 1; // PWM输出引脚控制均衡方向和电流 TRISBbits.TRISB0 0; // 方向控制输出 TRISBbits.TRISB1 0; // 使能控制输出 LATBbits.LATB0 0; LATBbits.LATB1 0; // 定时器中断1ms周期执行均衡控制 T1CON 0x0030; PR1 70000; T1CONbits.TON 1; _T1IF 0; _T1IE 1; }3.2 电压采集滤波与均衡判定有了ADC数据之后不能直接用第一件事是滤波。电池电压不是纯净的直流上面叠加有开关纹波和负载波动。我做了两级处理第一级是中值滤波连续采5个点取中间值专门对付偶发的尖峰干扰第二级是滑动平均取最近10个中值再做算术平均得到最终的B1和B2电压估计值。均衡判定采用滞回比较的方式。设定两个阈值启动阈值和停止阈值。以铅酸电池为例启动阈值取50mV停止阈值取10mV。逻辑是这样的if (fabs(v1 - v2) BAL_START_THRESHOLD) { if (v1 v2) { set_balance_direction(DIR_B1_TO_B2); } else { set_balance_direction(DIR_B2_TO_B1); } bal_enable 1; } else if (fabs(v1 - v2) BAL_STOP_THRESHOLD) { bal_enable 0; set_balance_direction(DIR_NONE); }滞回区间存在的意义是防止均衡在阈值附近反复切换。如果没有这层滞回一旦压差在50mV上下抖动MOS管就会频繁开关不仅产生噪音还会加剧器件发热。停止阈值拉低到10mV后系统每次都会把电池真正均衡到位才停下来。还有一个细节是均衡方向切换的互锁。在均衡进行中如果要改变方向必须先经过一个强制关闭时间把MP2642GR-Z的使能关掉等待电感电流完全放完再反向启动。我发现如果不做这一步强制间隔电感上的残流会瞬间拉反压把MOS管损坏。这个强制关闭时间我取了2ms对控制环来说感知不到延迟但对硬件保护很关键。3.3 主循环控制逻辑主循环其实很简单定时器中断里完成采样、滤波和均衡判定主循环只处理故障保护和人机界面。这种做法比把所有逻辑都塞进大循环里要稳定得多尤其是采样时刻不会因为主循环的耗时波动而产生抖动。void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void) { // ADC双核同步转换完成判断 while(!AD1CON1bits.DONE); while(!AD2CON1bits.DONE); uint16_t raw1 ADC1BUF0; uint16_t raw2 ADC2BUF0; // 换算成实际电压这里分压系数是0.231 float v1 raw1 * 3.3f / 4095.0f / 0.231f; float v2 raw2 * 3.3f / 4095.0f / 0.231f; // 中值滤波 滑动平均 v1 median_filter(v1, buf_v1); v2 median_filter(v2, buf_v2); // 均衡控制 float diff v1 - v2; if (fabs(diff) BAL_START_THRESHOLD) { set_balance_direction(diff 0 ? DIR_B1_TO_B2 : DIR_B2_TO_B1); bal_enable 1; } else if (fabs(diff) BAL_STOP_THRESHOLD) { bal_enable 0; set_balance_direction(DIR_NONE); } // 保护判断 if (v1 CELL_OVP_THRESHOLD || v2 CELL_OVP_THRESHOLD) { bal_enable 0; set_balance_direction(DIR_NONE); fault_flag | FAULT_OVP; } _T1IF 0; }实际代码里的浮点运算在DSC上跑没有问题70 MIPS的主频算这点东西绰绰有余。如果追求更高的性能可以把浮点改成定点运算用整数直接算电压差这样甚至可以把控制周期缩到微秒级但对于电池均衡这种秒级过程1ms的控制周期已经远远够用。3.4 防止过均衡与保护策略主动均衡也有风险最怕的就是把高电压电池的能量过度搬到低电压电池结果低电压电池被充过头。所以在控制逻辑里我加了几个保护条件。第一个是单节过压保护任何一节电池电压超过设定的上限就立刻停止均衡。第二个是低压截止如果任何一节电池低于放电截止电压均衡也不启动因为此时再搬运能量可能导致过放电池被进一步透支。第三个是均衡超时保护。正常情况下两节电池的压差50mV在2A均衡电流下几分钟就能拉平但如果均衡持续了30分钟压差还是没有明显改善说明电池组可能有问题这时候强制退出均衡并报警。我在实际中遇到过这样的案例原因是其中一节电池内部微短路恒压充电条件下它始终是电压偏低的那节均衡器会一直尝试给它充电但实际上能量都被内部短路消耗掉了越均衡越危险。超时保护在这里就是最后一道安全闸。4. 调试实录、常见故障与排查技巧4.1 采样电压跳变压差上下抖动第一次上电调试的时候串口打印出来的电压值是跳动的B1和B2的压差在几十毫伏范围内乱跳均衡状态也跟着频繁切换。排查下来核心原因是两个一是ADC采样时刻和MP2642GR-Z的开关纹波没有同步功率通道的开关噪声正好被采进去了二是PCB布线时采样走线和功率走线挨得太近寄生电容把噪声耦合到了ADC引脚。解决方法是双管齐下。硬件上把采样线远离功率走线并在ADC引脚处再加了1kΩ串联电阻和10nF对地电容进一步压低高频噪声。软件上把采样时刻固定在均衡功率通道PWM关断的中间位置避开开关尖峰。这两个措施叠加后再打印电压波动从±30mV降到了±5mV以内均衡状态也就稳定下来了。4.2 均衡电流上不去最多只有零点几安均衡使能之后电流却达不到设计目标的2A实测只有0.4A左右而且MP2642GR-Z外壳明显有些发热。这个问题一开始怀疑是MOS管驱动不足后来测试发现实际上是因为电感的感值选偏了。我的工作温度范围跨度比较大国产电感在不同温度下饱和电流特性不稳定温度上升后电感量下降得厉害导致电流纹波变大、有效值电流变小。解决方法是换了一颗饱和电流余量更大的功率电感同时把PWM频率从200kHz降到150kHz这样电感的伏秒积更大同样感值下能传递的功率更大。另外检查发现电流采样电阻的焊盘加了过孔过孔电阻串联进采样回路导致检测到的电流偏大实际电流反而偏小。这个问题比较隐蔽是我用热成像仪偶然发现的。去掉过孔、直接贴片焊接后电流就恢复正常了。4.3 均衡完成后过段时间压差又回来这是最常见的投诉均衡做完时压差确实很小但静置一天之后压差又回到了原来的水平。这不是均衡器的问题而是电池本身的自放电差异造成的。两节电池的自放电率不一样静置时间越长压差自然再次拉大。尤其是环境温度高的场合比如设备机柜里动辄40℃以上自放电率成倍增加。这种情况下唯一有效的办法是让均衡器周期性自动唤醒而不是一次性均衡完就休眠。我在软件里加了定时唤醒均衡的功能每6小时自动启动一次均衡判定如果压差超过启动阈值就重新均衡。这样能保证电池组长期保持接近满电状态真正应对备电场景里“几个月不放电但随时要有电”的需求。4.4 故障排除速查表现象可能原因排查方法电压采样跳变采样线受功率开关噪声干扰调整采样时机、加强RC滤波均衡电流过大差异电感饱和、采样电阻焊盘过孔换大饱和电流电感均衡方向频繁切换滞回区间太小增大停止阈值、增加强制关闭时间均衡完成后压差反弹电池自放电差异大开启定时唤醒再均衡单节电池温度异常内部微短路强制退出均衡并报警均衡不启动ADC参考电压错误检查分压和参考电压5. 实际使用中的一点体会这套方案在储能和备用电源场景下连续跑了几个月最明显的感觉是电池组的可维护性大大提升。以前隔几个月就要人工对每节电池单独补充电现在只要定期检查一下均衡器的工作状态就行。那种“总有一节先不行”的老大难问题算是从根上解决了。最后再分享一个小经验做电池均衡采样系统的重要性远高于均衡算法本身。算法再聪明如果采到的电压是垃圾数据一切无从谈起。所以尽可能把时间和精力花在采样精度和抗干扰上这才是投入产出比最高的地方。如果后续想把方案扩展到4S或者8S电池组思路是一样的只是需要多几个MP2642GR-Z的均衡通道并由dsPIC33EP512MU810统一管理。这套架构的可扩展性在我当初选型时就重点考虑过实际证明没有走弯路。