用DCDC+MCU实现两节串联锂电池主动均衡的方案设计

发布时间:2026/10/15 1:59:04
用DCDC+MCU实现两节串联锂电池主动均衡的方案设计
1. 两个串联单元为什么会失衡以及均衡到底在干什么1.1 串联电池组里最容易被放大的问题电芯不一致很多做储能、备用电源的朋友一开始都会把注意力放在电池保护上过充、过放、过流都做了结果系统还是时不时出毛病充电提前跳满、放电容量跑不到标称值、SOC显示一跳好几个百分点。追到最后十有八九是串联电池单元之间的电压差捅出来的娄子。两个电芯串联标称电压7.4V或者8.4V听起来简单但它和单节电池最大的区别在于放电回路里流过的电流是同一个可每节电池能放出的电量却不一样。电芯在生产时存在材料批次差异使用中又面临不同位置的温度差异、内阻差异、自放电率差异这些东西叠加起来就会让两节电池的实际可用电量逐渐拉开差距。差距一旦形成充电时电压高的一节先到保护电压低压的一节还没充满放电时电压低的一节先到截止电压高压的一节还有很多余量整个电池组就被最弱的那节电芯卡住了脖子。在备用电源或者储能系统里这种问题更明显因为电池大多数时间处于静置或者小倍率浮充状态长期微小的自放电差异也会被累积放大。如果不做均衡电池容量衰减速度几乎肉眼可见。1.2 均衡的本质让每节电池的电压和容量重新对齐均衡的核心目标不是把两节电池的电压强行拉成绝对相等而是让它们在工作过程中保持靠近尤其是接近满电状态时避免某一节提前进入过压保护。常见的做法有两种被动均衡和主动均衡。被动均衡的思路很直接检测到某节电池电压比另一节高就通过并联在它两端的电阻把多余的能量以热的形式放掉。它好处是电路简单、成本低坏处是能量直接被烧掉均衡电流一大发热就很明显而且均衡速度慢。在能量密度敏感、散热条件差的小型储能设备里被动均衡并不是理想方案。主动均衡则是把能量从高电压单元搬到低电压单元用电感、电容或者DCDC变换器做能量搬运。它不浪费能量只做转移均衡电流可以做得比较大速度也快得多。代价是电路结构复杂一些、要有MCU参与控制但在一套本来就带主控的BMS系统里这种代价通常是可以接受的。1.3 我为什么选了这个组合DCDC功率级加一颗带ADCC的MCU做两个串联单元的主动均衡正好落在了一个很有意思的硬件组合里用一颗同步降压转换芯片做功率级再用一颗自带高分辨率ADC和运放的单片机做控制和采样。我在这个项目里选的是MP2642GR-Z作为功率级PIC18F57Q43作为主控。MP2642GR-Z本身是一颗同步降压转换芯片输入耐压能覆盖两节串联锂电池的最高电压输出电流能力足以支撑几百毫安到安培级的均衡电流而且芯片内部集成同步整流管外围元件少、效率高非常适合被改造成一个受控的能量搬移电源。PIC18F57Q43则提供了12位ADC、可配置运放、多路PWM和丰富定时器采样电压、计算差值、输出脉宽调制信号这些工作靠一颗芯片就能全部完成。配合起来均衡器就是一个带软件闭环的高效电源。2. 硬件搭档拆解MP2642GR-Z和PIC18F57Q43各自扮演的角色2.1 MP2642GR-Z作为功率级的几个关键点很多人一听到均衡器第一反应是找一颗专门的电池均衡芯片。专用芯片当然省事但它通常绑定了固定的均衡策略和均衡通路灵活性有限。用通用DCDC芯片的好处是策略完全掌握在自己手里均衡电流、开关时机都可以按项目实际情况调。MP2642GR-Z这颗芯片在这个项目里的定位是可控的电流源。它本身是电压型降压芯片我们可以利用它的反馈引脚、使能引脚和软启动引脚把它的输出电压或者输出电流限制在MCU设定的目标值上。实际中我是通过PIC18F57Q43产生PWM经过RC低通滤波得到模拟电平再去控制这颗芯片的反馈参考网络以此间接设定均衡电流。也可以更简单直接把MP2642GR-Z配置成固定电压源通过限流电阻或者电流采样闭环的方式把电流限制住。对于两节电芯之间0.3A到1A的均衡电流来说这种方案非常成熟。需要注意MP2642GR-Z的开关频率、电感和输出电容的搭配需要按数据手册来。均衡电路对纹波要求不像后端供电那么苛刻但也不能随意乱配否则轻载时容易进入脉冲模式电流输出忽大忽小软件闭环就不好做了。我实际取的是接近数据手册推荐值的电感和输出电容组合并把芯片设置在连续导通模式下运行让均衡电流保持平稳。2.2 PIC18F57Q43承担采、算、控三件事PIC18F57Q43这颗MCU的定位也很清晰就是“采、算、控”。先说采样。均衡控制的前提是知道两节电池各自电压多少。PIC18F57Q43内部集成的12位ADCC模块可以分别采样两个单元的分压点分辨率能做到大概1mV左右对于均衡门限4mV、10mV甚至20mV这些档位来说绰绰有余。而且这颗MCU的ADC还支持多通道扫描和累加平均非常适合做采集滤波。然后是计算。MCU需要把采样值换算成真实电压再判断差值是否超过启动阈值、是否进入稳定区、是否需要停止均衡。这些逻辑用状态机来写非常清晰不需要跑系统裸机轮询就能做得很好。最后是控制。PIC18F57Q43有多路PWM模块我用了其中一路作为DCDC芯片的设定基准另一路作为保护或者通讯用途。它的PWM分辨率足够精细哪怕只用来做低速调节也不会出现电流控制步进太粗的问题。另外这颗MCU还带运放模块我直接用内部运放做电流采样信号放大省掉了一颗外部运放原理图上少好几个元件。2.3 这套组合真正划算的地方在哪里用通用DCDC加MCU做均衡最大的收益其实不是成本而是灵活性。储能和备用电源产品的规格经常变化今天做两节串联明天可能做四节串联今天均衡电流要0.3A明天客户要求1A。专用均衡芯片遇到这种变化往往要换料而DCDC加MCU的方案只需要改一下固件参数功率级可能连动都不用动。另外这颗MCU承担了均衡控制之外还能顺手干别的活比如和BMS主控通讯、上报均衡状态、记录历史数据。在一个产品里少一颗芯片对整机成本和调试工作量都是实打实的优化。PIC18F57Q43虽然定位不算高但外设覆盖能力已经让我不需要再外挂专门的采集芯片。3. 实际电路拓扑与关键设计细节3.1 双节串联下的能量搬移通路我按常规两节串联的结构来搭下节叫CELL1上节叫CELL2串联中点引出。主动均衡的最终目的是让CELL1和CELL2的电压接近能量从高的一节流向低的一节。如果只做单向均衡也就是永远从CELL2往CELL1搬那CELL2一旦比CELL1低就没办法处理。所以我在功率级前端加了一组换向开关用两个MOS管或者一个小型双刀继电器根据MCU判断的结果决定DCDC输入端接哪节电池、输出端接哪节电池。MP2642GR-Z在这里工作于降压模式输入来自电压较高的电池单元输出经过电流采样后灌入较低的电池单元。由于两节电池电压差一般不会超过几百毫伏到一两伏DCDC的负载其实很轻它的效率在这个区间也能保持在一个比较好水平。做换向开关时需要特别注意公共地的问题。两节电池串联中点电位和系统地之间是有关系的开关导通路径必须避免把电池正负极直接短路。我在原理图设计时用四颗MOS管搭成了两个单刀双掷结构MCU的IO口通过驱动芯片控制栅极保证在任何时刻都只有一条搬移路径导通。3.2 采样网络怎么搭才不会被均衡电流干扰电压采样看似简单实际里有不少坑。直接拿MCU的ADC去采电池正极对地电压是不行的因为两节串联电池的电平都悬浮在系统地上必须先做电阻分压把电压降到ADC输入范围内。我用的分压方案是CELL1直接采它对系统地的电压CELL2则先采样CELL2正极对地电压再减去CELL1的电压换算得到CELL2两端电压。也可以选择采样串联中点对地的电压再用差分方式计算。为了保证测量精度分压电阻我选了精度1%的金属膜电阻电阻值尽量选大一些减小对电池的静态消耗但也不能太大否则ADC输入阻抗会拉低采样点电压造成读数偏低。更关键的是采样点必须远离均衡电流的路径。我把电压采样点直接接在电池端子和均衡功率输入的交汇点之前而不是接在DCDC输入电容后面因为功率路径上流过均衡电流时会产生压降如果采样点取在负载侧测到的就不是电池真实电压了。第一次搭板时我没注意这个细节均衡一启动电压读数就跳十几毫伏后来把采样走线重新调整后才稳定下来。3.3 电流采样和闭环调节电流采样我用的是低边采样电阻加运放放大的方案。采样电阻放在DCDC输出回路上两端压差经过PIC18F57Q43的内部运放放大后送入ADC。由于均衡电流最大也就1A级别采样电阻功率选0.25W就够阻值几十毫欧即可。放大倍率按ADC量程和满量程电流计算留出一点余量防止过采样。闭环调节我写在固件里用软件PID做电流环。目标电流由均衡策略给出实际电流由ADC每50ms采样一次PID输出控制PWM的占空比PWM经过RC滤波后调整MP2642GR-Z的参考电压。整个环路的带宽不用太高毕竟均衡本身是个慢过程太高了反而容易把采样噪声放大导致均衡电流来回抖。3.4 安全和保护元件不能省做储能、备用电源相关的东西安全永远是第一位的。我在功率输入和输出两端都加了慢断保险丝防止万一MOS驱动失效导致电池正负极直通。均衡启动时通过软启动斜坡逐步提高电流避免瞬间大电流冲击电池和DCDC芯片。MCU侧除了看门狗还做了ADV值超范围保护一旦采样电压异常就直接把所有MOS和DCDC使能关掉。4. 固件状态机与均衡控制逻辑的实现思路4.1 状态机设计让均衡器知道自己每一步该干什么我把整个均衡控制做成了五个状态空闲、采样、判断、均衡、保护。这样逻辑清晰也方便调试时通过串口打印当前状态。空闲状态下MCU所有输出关闭仅保留电压采样和阈值判断。采样状态下连续采样两节电池电压做一轮软件滤波更新电压平均值。判断状态会根据最新电压差和电池状态决定是否进入均衡均衡状态下启用DCDC和换向开关周期性地刷新目标电流。一旦检测到电压超范围、电流过流或者通信超时就立刻进入保护状态关闭全部输出记录故障标志。状态机里最容易被忽略的是状态切换的防抖。电池电压不是绝对静止的负载波动、自恢复反应都会让电压出现短时抖动。如果电压一超过阈值就启动均衡很可能均衡刚启动电压差又掉回去了来回切换会非常伤MOS和电池。我的做法是连续多次采样都超过启动阈值才进入均衡退出时也用滞回判断启动阈值和停止阈值之间留10到20mV的间隔。4.2 ADCC采样、均值滤波和校准补偿PIC18F57Q43内部的12位ADC采样速度完全可以满足这个项目的需求。我把两个电压采样通道每通道连续采样16次取平均值消除大部分白噪声和开关纹波。虽然均衡电流回路本身是低纹波的但PWM调节产生的微小波动还是会耦合到采样线上过采样平均是成本最低的办法。校准补偿我也做了。分压电阻虽然是1%精度但两节电池的采样链路电阻值并不完全一致会带来固定偏差。我在装配完成后用电台表测量两节电池的实际电压和MCU读到的ADC值做对比生成两个通道的增益和偏置校准系数烧录在Flash里。这个步骤投入小、收益大校准后电压测量的最大误差能控制在5mV以内。4.3 控制判断逻辑怎么写均衡判断的核心就是两个指标电压差和电压区间。电压差决定要不要动作电压区间决定是否允许动作。例如当两节电池电压差超过20mV且两节电压都在2.5V到4.3V的安全区间内时进入均衡态。目标是把电压差拉到10mV以下然后停止均衡。滞回值的存在可以防止临界点来回跳动。如果某一节电池电压已经接近过压保护值均衡方向只能是从这一节往另一节搬能量如果一节在低位就先判断是否低位欠压欠压则不做均衡防止把本来就有问题的电池进一步拉低。在大电流充电或者放电过程中我也允许均衡工作但会把目标电流压低一些避免和主回路电流叠加后导致电池电压波动太大。4.4 核心代码逻辑示意下面是一段简化但结构完整的伪代码展示判断与执行部分的思路typedef enum { IDLE, SAMPLE, JUDGE, BALANCE, FAULT } bal_state_t; volatile bal_state_t state IDLE; volatile uint16_t cell1_filtered_mv; volatile uint16_t cell2_filtered_mv; void balance_task(void) { switch(state) { case IDLE: balance_output_enable(false); state SAMPLE; break; case SAMPLE: cell1_filtered_mv adc_average_filter(CELL1_CH); cell2_filtered_mv adc_average_filter(CELL2_CH); state JUDGE; break; case JUDGE: int32_t diff_mv (int32_t)cell2_filtered_mv - cell1_filtered_mv; if (diff_mv START_THRESHOLD_MV) { // CELL2 高能量从 CELL2 搬到 CELL1 set_transfer_dir(DIR_CELL2_TO_CELL1); target_current_ma BALANCE_CURRENT_MA; state BALANCE; } else if (diff_mv -START_THRESHOLD_MV) { // CELL1 高能量从 CELL1 搬到 CELL2 set_transfer_dir(DIR_CELL1_TO_CELL2); target_current_ma BALANCE_CURRENT_MA; state BALANCE; } else { state SAMPLE; } break; case BALANCE: if (voltage_diff_in_stop_zone()) { balance_output_enable(false); state SAMPLE; } else if (software_pid_step(target_current_ma) ! PID_OK) { state FAULT; } else { balance_output_enable(true); } break; case FAULT: balance_output_enable(false); save_fault_flag(); break; } }实际工程里还需要把采样、PID计算、保护检查分别放到定时器中断或者主循环的不同时间槽里避免相互阻塞。这里只给框架让思路更直观。4.5 固件里几个容易出问题的小地方第一个是PWM初始化的顺序。上电时如果PWM输出先跑起来DCDC芯片的使能还没有准备好可能导致输出电压快速冲击电容。我习惯先配置IO和使能引脚为关闭状态再初始化PWM最后打开均衡输出。第二个是基准电压选择。PIC18F57Q43的ADC可以使用内部基准但内部基准在全温度范围下会有漂移。在储能场景里环境温度可能在几十度范围内变化电压采样误差会跟着漂。我对精度要求比较高的应用场景用外部基准芯片或者板载精密基准分压做参考实测稳定性好了不少。第三个是看门狗。软件主循环和状态机误差不大但一旦出现异常死循环DCDC可能保持输出卡死非常危险。我把看门狗独立开了一个定时器喂狗任务任何一个状态执行超时都会触发复位复位后默认所有输出关闭。5. 实测数据、调试过程与常见坑5.1 均衡效果的实测过程我搭了完整电路做验证电池用两节标称3.7V、容量2Ah的锂离子电芯串联在人为制造出95mV电压差之后启动主动均衡目标电流设定为0.5A。整个测试过程用高精度万用表和上位机同时记录电压变化。测试结果显示头5分钟电压差从95mV快速回落到58mV下降速度比较明显后面随着电压差缩小回落的斜率变缓大约22分钟后电压差稳定在12mV附近进入滞回停止区间均衡器自动退出。停止后静置半小时电压差又缓慢回升到18mV但幅度很小属于电芯本身的电压回弹不是均衡电路失效。这个结果对于2Ah电芯来说基本符合预期。如果想要更快的均衡速度可以把电流提高到1A代价是热耗增加、DCDC和电池端子的温升更明显。对于储能系统来说0.5A往往已经足够因为不均衡是一个慢慢累积的过程不需要追求过快的收敛。5.2 调试中最折腾的三个问题第一是采样线干扰导致的误判。最初我把采样线走得比较靠近DCDC电感均衡电流一大ADC读数就跟着跳甚至出现超过30mV的假电压差。后面把采样走线改成双绞线并远离电感区域在ADC引脚加了RC滤波电容问题才消失。后来我再做板子时干脆把分压电阻和ADC输入电容放在一起中间走线尽量缩短这个经验分享给同样做电压采集的朋友。第二是换向开关的导通时序。一开始换向时我先打开目标方向的MOS再关断原来方向的MOS结果在切换瞬间两个方向的MOS同时导通了一段相当于把DCDC输入输出短路了触发了过一次流保护。后来的处理方式是先关闭所有MOS延时5ms确保完全关断再打开目标MOS彻底避免直通。第三是PWM到DCDC参考电压的响应曲线问题。RC滤波后的模拟控制电压和DCDC输出电流之间不是线性关系在小电流区间尤其明显。我在固件里做了一个分段线性插值用小电流段更密的校准表把非线性掰回来均衡电流的稳定度提升很明显。5.3 顺手整理了一张故障排查表故障现象可能原因排查方向均衡启动后电压差变大换向方向反了检查MOS开关逻辑和电压判断正负号ADC读数跳动超过20mV采样线受开关节点干扰加滤波、调整走线、缩短采样路径均衡电流比设定值低RC滤波电压和实际输出不匹配重新做分段校准或改用运放闭环MOS温度异常升高开关频率与死区设置不对检查驱动波形、驱动电阻和死区时间电池电压采样偏低分压电阻阻值过大加ADC负载换大输入阻抗方式或增强运放跟随5.4 关于均衡策略的进一步思考两节电池的主动均衡做完之后我顺手往四节方向扩展了一下思路。其实每一节之间的均衡还是同样的DCDC加换向开关只是MCU需要管理更多通路状态机也要从一对一的判断改成多对多的轮询。对于现在很多小型储能产品来说先做两节串联验证方案后面再扩展到更多节数是一个投入产出比很高的路线。在策略方面还可以考虑结合电池充电状态来决定均衡时机。例如在充电末端电压上升快的阶段加大均衡电流在静置期减小均衡电流。这样既能保证均衡效果又能减少不必要的能量搬移。6. 写在最后做这套均衡器的一些体会整个项目做下来我最深的感受是主动均衡的难点不在DCDC或者MCU单个器件上而在于把功率级、采样网络、控制逻辑串成一个闭环并且让这个闭环在异常情况下还能安全收尾。MP2642GR-Z和PIC18F57Q43这套组合胜在每一项都很常规不依赖什么黑科技但组合起来之后均衡速度、效率和可维护性都要比传统被动方案舒服得多。如果让我给后来人一个建议那就是在做原理图之前先把采样点、换向开关逻辑、保护条件这三件事想清楚。它们决定了后续调试的时间成本。我在这三个地方各踩过一次坑加起来花掉的调试时间比写整套固件还要多。希望这篇文章能帮你少走这几段弯路。