尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

多化学体系线性电池充电器设计:从CC/CV到镍氢-ΔV终止策略

多化学体系线性电池充电器设计:从CC/CV到镍氢-ΔV终止策略 做电源相关的项目也算有年头了如果要我选一种“看着简单、做起来全是坑”的电路线性电池充电器绝对排在前三。表面上看一个调整管、一个检流电阻、一两个运放就能搭出充电回路可一旦把“Multi-Chemistry Operation多化学体系兼容”加进来整个项目的复杂度不是加法而是乘法——同一套硬件要在锂离子、磷酸铁锂、铅酸、镍氢之间切换充电曲线和终止逻辑任何一个参数配错轻则电池容量充不满重则电池胀气甚至起火。我最近用“线性恒流恒压架构 MCU 逻辑管理”完成了一个多化学体系充电器支持 1S 锂离子Li-ion、1S 磷酸铁锂LiFePO4、12V 铅酸Lead-Acid和 1S 镍氢NiMH四类电池输入为 5V USB 和 12V 适配器双电源最大充电电流 1A。这篇文章把需求拆解、算法设计、硬件热计算、固件状态机到现场排查的完整过程写下来适合刚接触充电管理的嵌入式工程师、电源工程师以及想自己动手做充电器的硬件爱好者。里面的很多问题不是数据手册会写的是我实际试错试出来的。1. 项目概述与设计思路拆解1.1 需求定位兼容四种电池核心难点到底在哪很多人第一反应是“不就是把充电电压和电流参数做成可配置吗”这个想法会误导整个设计方向。真正做起来你才会发现这四种电池的差异横跨了电压、充电方法、终止条件、温度策略和安全边界五个维度绝不是改两个寄存器那么简单。先看电压域。1S 锂离子充满电压是 4.2V高压锂电有 4.35V1S 磷酸铁锂是 3.6V12V 铅酸的吸收电压是 14.4V 到 14.7V、浮充电压是 13.6V 到 13.8V而 1S 镍氢电池标称才 1.2V充电过程中电压会随 SOC 变化但你不能拿恒压方式去“压”它。这四个电压域跨度接近 12V前端输入电源管理、采样分压比、过压保护门限都必须分开设计。再看充电方法。锂电和磷酸铁锂是标准的 CC/CV恒流恒压铅酸实际上是 IU 曲线先恒流、到达吸收电压后恒压、最后转浮充镍氢则是恒流快充加 -ΔV负电压变化率或 dT/dt温升速率终止。三种充电逻辑完全不同硬要说成“都是恒流恒压”就会在镍氢上翻车。再加上终止条件锂电看电流截止铅酸看浮充维持镍氢看电压跌落的拐点每一种都对应不同的检测精度要求和抗干扰手段。电压域跨度大采样电路和保护门限要按化学类型切换。充电方法不同CC/CV、IU、恒流负Delta V 三种控制策略并存。终止条件不同直接影响 ADC 采样精度、滤波算法和固件状态机设计。温度策略不同锂电严禁低温充电铅酸需要温度补偿镍氢要靠温度辅助终止。1.2 为什么选线性拓扑效率、噪声与成本的三方权衡项目定义阶段我其实纠结过要不要上 Buck 或者 Buck-Boost 拓扑毕竟“线性”两个字一听就不够高级效率上限摆在那里。但最后确认采用线性架构理由有三个而且对这类多化学体系通用充电器来说都是硬需求。第一是噪声。镍氢充电的 -ΔV 终止检测需要在电池电压上分辨每节 5mV 到 10mV 的负斜率拐点如果前端是个开关电源纹波和开关噪声叠加在采样信号上这个拐点会被噪声彻底淹没。线性拓扑的输出纹波可以做到微伏级这是开关拓扑很难比的。第二是外围复杂度。线性充电器的核心就是一个工作在放大区的调整管加两个误差放大器不需要电感不需要反馈补偿网络调环路。多化学体系已经让固件复杂度上来了硬件上再引入 DCDC 的电磁兼容和环路稳定性问题调试周期至少翻一倍。第三是小电流场景下效率差距没有想象的大。以 5V 输入充 1S 锂电为例CC 阶段电池电压从 3.0V 升到 4.2V芯片上的损耗功率是 (Vin - Vbat)×I。起始阶段电池约 3.0V损耗 2W效率只有 60%但到 CV 阶段电流自动下降损耗也跟着降。如果控制充电电流在 1A 以内配合合理的散热设计线性方案完全够用而且元器件成本可能只有开关方案的零头。等到你需要 3A 以上的充电电流或者输入电压和电池电压差特别大时再切换拓扑才划算。2. 四种化学体系的充电特性与终止策略2.1 锂电家族的 CC/CV 充电数学与终止判定锂离子和磷酸铁锂都属于“恒流-恒压”家族但细节上还是要分开对待。锂离子电池的典型充电曲线是预充Precharge→ 恒流CC→ 恒压CV→ 截止。以 1S 锂电、1A 恒流为例电池电压低于 3.0V 时先用 0.1C100mA小电流预充避免大电流冲击损坏深度放电的电池电压恢复到 3.0V 以上后切到 1A 恒流电池电压上升到 4.2V 后自动进入恒压阶段此时电流逐渐下降当电流降到 C/2050mA时判定充满。这里有个容易被忽略的数学关系恒压阶段的电流是按指数规律衰减的时间常数主要由电池等效串联阻抗和充电电压与电池开路电压的差决定。如果你把截止电流设得越低充入的电量越接近 100%但最后那几毫安要花很长时间。我实测下来把截止电流从 C/20 放宽到 C/10100mA充电总时间可以缩短 10 到 15 分钟但容量会少 1% 到 3%。所以做产品时这个参数一定要和客户确认不要想当然。磷酸铁锂的平台电压非常平坦大约在 3.2V 附近充满电压一般取 3.6V有些厂家允许到 3.65V。它的终止电流门槛也可以放宽到 C/20 到 C/50但要注意因为平台平坦电压对 SOC 的指示作用很弱你没法靠电压判断充电进度只能靠电流截止所以采样精度更重要。我在这版设计里对两种锂电用了同一个检流电阻但 ADC 采样和终止判定的滤波参数是分开配置的避免磷酸铁锂的微弱电流信号被噪声干扰提前终止。2.2 铅酸电池的 IU 曲线与浮充逻辑铅酸电池的充电逻辑和锂电完全不同它是“限流恒压 浮充”的 IU 特性。12V 铅酸电池是 6 个单体串联单体吸收电压约 2.44V 到 2.45V整个电池就是 14.4V 到 14.7V浮充电压单体约 2.27V整体就是 13.6V 到 13.8V。正确流程是先用恒流充电一般取 0.15C 到 0.4C电池电压被顶到吸收电压后保持恒压此时电流开始下降当电流降到 0.02C 以下或者吸收阶段计时到了2 到 4 小时就切到浮充电压。浮充是铅酸电池的必需品因为铅酸电池有自放电浮充电流用来抵消自放电电压长期保持在 13.6V 到 13.8V 不会损坏电池。铅酸还有个锂电没有的大坑温度补偿。铅酸电池的推荐充电电压随温度变化典型系数是 -3.3mV/°C/单体换算到 12V 电池就是约 -20mV/°C。在 40°C 环境温度下吸收电压要往下调 0.3V 左右不做补偿就会电池失水甚至热失控。这也是为什么多化学体系充电器里NTC 温度采样不是选配而是标配。对比一下锂电是最忌讳浮充的长期浮充会导致析锂和寿命衰减所以锂电充满后必须切段充电通路顶多做极微小的补充铅酸反过来必须长期挂着浮充。这个区别在固件状态机里体现得非常直接我在第 4 节会详细讲。2.3 镍氢电池的 -ΔV 与 dT/dt 终止挑战镍氢电池是这四种里最难搞的。充电方式基本是恒流快充终止不是靠电压到达某个绝对值而是靠检测电压随充电进程的“拐点”电池充满时内部氧复合反应加剧电压会先到达峰值然后回落约 5mV 到 10mV/节这个回落就是 -ΔV 终止信号。听起来简单实际实现全是细节。1S 镍氢电池满电峰值大约 1.4V 到 1.5V-ΔV 信号只有 5mV 到 10mV而你的 ADC 采样噪声、检流电阻上的压降波动、接触电阻的变化都可能产生比这更大的假信号。我的做法是先做滑动窗口平均窗口取 3 到 5 秒再判断连续 2 到 5 秒内电压是否累计下降了设定阈值而且 -ΔV 检测要加锁定时间——充电开始后至少 5 到 10 分钟之内不启用避免电池初始电压波动导致误判。镍氢还有两个备用终止手段dT/dt 和温度绝对值。温度上升速率超过每分钟 0.8°C 到 1°C 就终止这个可以通过 NTC 检测电池本体温度超过 50°C 到 60°C 也必须强制终止。有一个时间备份也很重要我按 0.5C 充电电流设置 3 小时的安全超时一旦超时就停止快充并转涓流C/20 到 C/40防止任何终止手段都失效时电池过充。3. 硬件电路设计与热管理计算3.1 线性恒流恒压环路架构整个充电通路核心是一个工作在放大区的 P 沟道 MOSFET 作为调整管搭配两个误差放大器一个控制电压环一个控制电流环。电流环通过检流电阻采样充电电流与 DAC 给出的电流基准比较输出驱动调整管栅极电压环采样电池电压与 DAC 给出的目标充电电压比较。两个环路经过二极管“或”逻辑谁要求更小的占空比谁接管从而实现 CC/CV 自动切换。我前面说过要多化学体系兼容所以这两个基准不是固定电阻分压而是 MCU 通过 DAC 或者 PWM 加 RC 滤波产生。以铅酸电池为例吸收电压 14.7V 和浮充电压 13.8V 之间差 0.9V如果用固定基准根本没法兼容只有可编程基准才能在一套硬件上平滑切换。检流电阻我用的是 0.1Ω 的合金电阻配合低温漂运放。这里有个关键细节检流电阻的布线必须用开尔文四线接法把采样走线直接连到电阻两端焊盘内侧不要经过铜皮或过孔否则铜皮的压降会直接变成采样误差。终止电流 50mA 时0.1Ω 电阻上的压降只有 5mV运放输入失调电压如果达到 1mV误差就是 20%所以运放必须选失调电压小于 0.5mV 的型号。3.2 功率管与热设计参数计算线性充电器最大的敌人是热这个必须开头就说。计算很简单P_diss (Vin − Vbat) × I。以 5V 输入、充 1S 锂电为例CC 阶段电池电压最低约 3.0V 到 3.2V充电电流 1AP (5.0 − 3.2) × 1 1.8W这 1.8W 全部耗在调整管上。不同封装的散热能力差距非常大我一开始想用小体积的 SOT-23 封装调整管做验证RthJA 大概在 100°C/W 到 150°C/W 之间1.8W 意味着温升 180°C 以上直接超结温。后来换用 SOT-223 封装并加大 PCB 铜皮面积RthJA 能压到 50°C/W 到 60°C/W温升约 100°C在 40°C 环境温度下结温 140°C还是偏险。最终量产版用了 DPAK 封装加 4cm² 以上的铜皮RthJA 约 40°C/W温升约 72°C才算是留出了安全裕量。条件允许的情况下先估算最坏情况的 P_diss (Vin_max − Vbat_min) × I_max。然后根据封装 RthJA 和最高环境温度反推结温Tj Ta RthJA × P_diss。结温超过 125°C 就必须换封装、降电流或者加风冷不要指望“偶尔工作一下没事”。我在这版设计中加了热节流功能在 PCB 上靠近调整管放 NTC或者用带温度输出的功率管当检测到温度接近 110°C 时MCU 自动把恒流目标从 1A 降到 0.5A温度回落再恢复。3.3 化学类型切换与采样电路设计化学类型切换我强烈建议用硬件可读的方式比如拨码开关或者跳线而不是只在软件里配一个变量。原因很现实充电器是给现场人员用的如果哪天有人把 1S 锂电当成磷酸铁锂充电3.6V 的截止电压会导致锂电长期充不满虽然不安全但至少能发现反过来如果把磷酸铁锂当成锂离子按 4.2V 充电池温度会明显升高轻则鼓包重则起火。硬件可读能让上电自检环节多一道校验软件配置被误改的风险大幅降低。电池电压采样电路要兼顾四个电压域。我采用的方法是分压电阻链加模拟开关MCU 根据化学类型选择不同的分压通路镍氢电池电压低用小的分压比铅酸电压高用大的分压比。这样 ADC 的满量程利用率在每一种化学类型下都能保持合理采样的有效位数不至于浪费。NTC 温度采样是共用的但温度策略独立配置因为四种电池的温度窗口和补偿系数都不一样。4. 固件状态机与多化学体系参数配置4.1 充电状态机设计与迁移条件固件是整个多化学体系充电器的大脑我用一个统一的状态机来管理所有化学类型的充电流程状态包括空闲、预充、恒流、恒压、终止、浮充/涓流、故障。不同化学类型只是走不同的状态迁移路径而不是各自维护一套独立的流程代码这样维护成本最低。typedef enum { ST_IDLE, ST_PRECHARGE, ST_CC, ST_CV, ST_DONE, ST_FLOAT, ST_TRICKLE, ST_FAULT } charge_state_t;以锂电为例上电后进入 ST_IDLE检测到电池电压在 3.0V 以下则进入 ST_PRECHARGE用 0.1C 电流预充如果 30 分钟内电压还上不来说明电池内部可能有微短路直接进 ST_FAULT电压恢复到 3.2V 以上进 ST_CC恒流充电直到电压到 4.2V进入 ST_CV 后电流逐渐下降低于 50mA 进 ST_DONE然后彻底关断。铅酸的情况则是 ST_CC 到 14.7V 后进 ST_CV也就是吸收阶段等电流降到 0.02C 或吸收计时到了转到 ST_FLOAT 长期维持浮充。镍氢不同恒流快充过程要实时跑 -ΔV 和 dT/dt 检测一旦检测到终止信号就进 ST_DONE需要维持时再进 ST_TRICKLE 涓流。状态机的核心是迁移条件里的“防抖”设计。任何终止或者故障判断都不能瞬时触发我的做法是连续采样 N 次满足条件才迁移N 根据信号类型取 3 到 5 次采样间隔 100ms 到 500ms。这个细节直接决定了充电器会不会在充满之前误停机。4.2 化学体系参数表与终止判定函数多化学体系设计的精髓是把所有可调参数集中到一张表里而不是散落在代码各处。我建了一张参数结构体每种化学类型实例化一份包含预充电压门限、目标充电电压、恒流大小、终止电流、涓流电流、安全超时、温度窗口等字段。固件运行时根据当前化学类型直接读取对应实例逻辑代码完全复用。参数1S 锂离子1S 磷酸铁锂12V 铅酸6 节1S 镍氢标称电压3.7V3.2V12V1.2V充电目标4.2V 恒压3.6V 恒压吸收 14.4-14.7V浮充 13.6-13.8V不恒压预充电流0.1C0.1C——预充恢复阈值3.0V2.8V10.5V1.0V恒流充电电流0.5C-1C0.5C-1C0.15C-0.4C0.3C-1C终止条件电流 C/20电流 C/20电流 0.02C 或吸收计时到-ΔV / dT/dt / 温度上限浮充/涓流禁止禁止浮充必须涓流 C/20-C/40充电温度窗口0-45°C0-45°C-20-50°C 需补偿0-40°C终止判定函数是充电器最需要精心打磨的部分。以锂电的电流截止为例实现时不能只看瞬时采样值要加滑动平均滤波滤掉接触噪声和系统负载波动。这里分享一个我踩过的坑如果充电端口同时接了系统负载终止判定电流要把负载电流考虑进去否则系统负载拉掉 30mA充电器就会误以为电池电流已经降到 50mA 而提前终止。解决方法是专门做个“背景电流校准”充电开始前先记录负载电流终止判定时用 ADC 采到的总电流减去背景电流。4.3 温度补偿与故障保护逻辑温度在四种化学类型里有完全不同的角色。锂电是“保护”NTC 采样温度低于 0°C 或高于 45°C 时不充电或降低电流否则低温析锂、高温胀气。铅酸是“修正”前面提到的 -20mV/°C 补偿系数MCU 根据 NTC 温度实时调整吸收电压和浮充电压。镍氢是“终止辅助”dT/dt 和绝对温度上限作为后备保护防止 -ΔV 失效。故障保护逻辑我在本版固件里实现了六类输入欠压、输出过压、充电超时、NTC 开路或短路、电池反接、热节流。其中 NTC 开路和短路最容易忽略如果 NTC 脱落采样温度要么是极低要么是极高如果不做识别可能会先触发低温保护导致充电器完全不工作或者更危险地直接触发高温保护误判电池过热。我的做法是在上电自检阶段测一次 NTC 阻值开路和短路直接报 THERMISTOR_FAULT不进充电流程。5. 常见问题与排查技巧实录5.1 温升过高与热节流失效这个项目调试阶段遇到最直接的问题就是调整管发烫。第一版 PCB 用了 SOT-23 封装5V 输入、1A 充电实测工作 10 分钟手摸上去已经烫得不敢碰红外测温接近 110°C。这是典型的散热设计不足不是器件坏。排查思路是先算功率测量输入电压、电池电压和充电电流用示波器确认不是震荡导致的异常损耗然后用热像仪看发热集中在哪个封装最后决定换封装还是降电流。我这里强调一点热节流不是让你硬扛而是让充电器在极限条件下“优雅地降级”。我在固件里设了两级热管理温度达到 100°C 时恒流目标减半达到 125°C 时直接暂停充电进入冷却状态温度低于 80°C 才恢复。实测下来50°C 环境温度下满功率充电充电器能稳定工作在 0.7A 左右虽然充电时间变长但至少不会烫坏。5.2 充电提前终止与“充不满”锂电“充不满”是另一个高频问题。表现为充电器很快显示充满但电池一用就没电。我用示波器抓电池电压和充电电流发现 CV 阶段电流下降速度快得异常还没到 50mA 就被判定终止了。后来定位到两个原因一是检流电阻布线走了 CPU 的地回路MCU 自身的功耗在采样线上产生了额外压降造成电流采样偏高二是 PCB 布局导致检流电阻与电池之间串联了约 0.15Ω 的线阻这部分阻抗在 CC 阶段压降大让 CV 阶段提前进入。解决方法是把检流电阻的采样走线改为开尔文接法电池到检流电阻之间的功率走线加粗到 2mm 以上并且把系统负载的返回路径独立出来不经过采样电阻。改版后相同条件下充电终止电流从 50mA 变成了实测 48mA精度明显恢复。如果你也遇到充不满先量一下充电回路内的总串联电阻超过 0.1Ω 就要小心了。5.3 镍氢误判与接触电阻干扰镍氢的 -ΔV 误判是我在这项目里反复折腾最久的事。一开始用弹簧夹子夹具测试充电电流 500mA实测电压波形上经常出现超过 10mV 的随机跳变导致 -ΔV 逻辑频繁误触发充电 20 分钟就显示充满实际电池才充了一半。排查后确认是夹具接触电阻不稳定电流变化时接触电阻上的压降跟着变产生了类似 -ΔV 的假信号。换用压接夹具或焊接连接减少接触电阻变化。-ΔV 判定窗口从 1 秒延长到 3 到 5 秒滑动平均过滤瞬时毛刺。增加连续确认次数连续 3 次采样都满足阈值才判定。增加起始锁定时间充电开始后 5 分钟内不启用 -ΔV 检测。保留 dT/dt 和温度上限作为无条件终止的后备手段。5.4 故障排查速查表现象可能原因排查思路调整管温度过高散热铜皮不足、功率超标、热节流未生效先算实际 P_diss换封装或降流检查 NTC 是否贴到功率管附近锂电提前充满检流采样不干净、线阻太大、负载电流未扣除检查开尔文布线测量回路总串联电阻校准背景电流铅酸永远充不满吸收时间不够、终止电流设得太低、温度补偿没做拉长吸收时间到 4 小时确认电流降到 0.02C检查 NTC 温度补偿系数镍氢频繁误终止接触电阻变化、噪声干扰、锁定期过短换夹具、加滑动平均、加锁定时间和温度后备电池温度正常却不充电NTC 开路/短路被误判、温度窗口配置错误上电测 NTC 阻值区分 THERMISTOR_FAULT 和正常温度越限每个问题的排查顺序也很重要。我的习惯是先看硬件再动软件先用万用表和示波器确认电压、电流、温度三个物理量的真实值再对照固件日志里记录的采样值和状态迁移点很快就能定位到是传感器、执行器还是算法的问题而不是盲目调参数。做完整套设计我最想说的是多化学体系充电器不是“一个充电芯片 几根跳线”就能搞定的事它本质上是把四种电池管理经验浓缩进一套软硬件。线性拓扑在这个场景里反而是最合适的选择它让你把精力集中在算法和终止逻辑上而不是被开关噪声干扰到怀疑人生。如果后续要做大电流版本建议在保持主控逻辑不变的前提下把调整管换成同步 Buck 拓扑充电状态机、参数表和终止判定函数都可以直接复用。这个项目的固件代码我整理好之后下一篇文章再放出来和大家细聊。
返回列表