锂电池充电保护电路设计:TP4056 与 DW01 实战指南

锂电池是所有嵌入式项目最常见的电源方案,但用不好就会变成"定时炸弹"。过充会鼓包,过放会永久损坏,短路直接冒烟。今天我们就来聊聊怎么设计一个靠谱的锂电池充电保护电路。

为什么需要保护电路?

锂电池的脾气比你想的要大:

  • 过充(>4.2V):正极析锂,内压升高,可能鼓包甚至起火
  • 过放(<2.5V):铜集流体溶解,电池永久失效
  • 过流/短路:瞬间大电流,发热起火
  • 过温:高温加速老化,极端情况热失控

一颗 18650 电芯标称 3.7V,实际工作范围 3.0V~4.2V。超出这个范围,电池就开始"闹情绪"了。

核心芯片:TP4056

TP4056 是目前最流行的线性锂电池充电管理芯片,原因很简单——便宜、好用、外围元件少。

关键参数

参数 数值
输入电压 4.5V ~ 6.5V(USB 5V 直供)
充电电流 可编程,最大 1A
充电精度 ±1%(4.2V 截止电压)
工作模式 预充 → 恒流(CC) → 恒压(CV)
封装 SOP-8 / MSOP-10
单价 约 0.3~0.8 元

充电三阶段

TP4056 的充电过程分三个阶段:

  1. 预充阶段(电池电压 < 2.9V):以小电流(约 1/10 设定电流)涓流充电,唤醒深度放电的电池
  2. 恒流阶段(2.9V ~ 4.2V):以设定电流恒流充电,这是主要的充电阶段
  3. 恒压阶段(4.2V 截止):电压恒定在 4.2V,电流逐渐减小,当电流降到设定值的 1/10 时停止充电

完整电路设计

方案一:TP4056 模块(新手推荐)

如果你不想自己画板子,直接用 TP4056 成品模块是最快的方案:

硬件清单:

元件 型号 数量 单价(元)
TP4056 充电模块 带保护版(DW01+8205A) 1 1.5
18650 锂电池 Panasonic/NCR18650B 1 15
Micro-USB 座 直插式 1 0.2
1N5819 肖特基二极管 防反充 1 0.1

接线方式:

  • Micro-USB 5V → TP4056 模块 IN+
  • TP4056 模块 B+ → 电池正极
  • TP4056 模块 B- → 电池负极
  • TP4056 模块 OUT+/OUT- → 负载供电输出

注意:TP4056 的 OUT 和 B 是连在一起的,负载和电池并联。充电时负载同时工作,充电电流会被负载分流,这是正常现象。

方案二:分立元件设计(进阶)

如果你想自己画 PCB,下面是完整原理:

          VCC (5V USB)
            │
         ┌──┴──┐
         │ TP4056 │
         └──┬──┘
            │ BAT (4.2V)
         ┌──┴──┐
         │  电芯  │
         └──┬──┘
            │
      ┌─────┴─────┐
      │  DW01 + 8205A │ ← 保护 IC
      └─────┬─────┘
            │
         PACK- (输出负极)

核心元件清单:

元件 型号 数量 单价(元) 作用
充电 IC TP4056 1 0.5 充电管理
保护 IC DW01-A 1 0.15 过充/过放检测
MOS 管 8205A (双 N-MOS) 1 0.1 充放电控制开关
充电电流设定电阻 1.2kΩ 1 0.01 设定 1A 充电电流
输入电容 10μF/10V 1 0.05 输入滤波
输出电容 10μF/10V 1 0.05 输出滤波
状态 LED 红色/绿色 0603 各1 0.02 充电状态指示
肖特基二极管 1N5819 1 0.1 防止电池反充

充电电流计算公式:

I_CHARGE = 1000 / R_PROGRAM  (单位:mA)

例如:R_PROGRAM = 1.2kΩ → I_CHARGE ≈ 833mA
      R_PROGRAM = 2kΩ   → I_CHARGE ≈ 500mA
      R_PROGRAM = 1.5kΩ → I_CHARGE ≈ 667mA

根据电池容量选择充电电流,一般建议 0.5C~1C(C 为电池容量)。18650 常见 2000~3400mAh,用 1A 充电比较合适。

DW01 保护电路详解

DW01 是单节锂电池保护 IC,内部集成了过充比较器、过放比较器和短路检测。配合 8205A(双 N-MOS)实现充放电通断控制。

保护阈值

保护类型 触发条件 恢复条件
过充保护 电池电压 ≥ 4.25V ± 0.05V 充电电压降至 4.15V ± 0.05V
过放保护 电池电压 ≤ 2.4V ± 0.08V 充电电压升至 3.0V ± 0.1V
过流保护 放电电流过大(MOS Rds 压降超标) 负载移除后自动恢复
短路保护 输出端直接短路 短路移除后自动恢复

DW01 引脚说明

引脚 名称 功能
1 CO 过充控制输出 → 8205A 的充电 MOS
2 VM 过流/短路检测 → 串联在放电回路
3 DO 过放控制输出 → 8205A 的放电 MOS
4 VSS
5 CS 电池正极检测输入
6 VD 内部振荡器(悬空或接电容)

实战:用 Arduino 监控电池状态

保护电路是硬件层面的"最后防线",但我们还可以用软件层面实时监控电池状态。

// 锂电池电压监控 - Arduino/ESP32 通用
// 通过电阻分压读取电池电压

const int BATTERY_PIN = A0;  // ADC 输入引脚
const float R1 = 100000.0;   // 上分压电阻 100kΩ
const float R2 = 10000.0;    // 下分压电阻 10kΩ
const float ADC_REF = 3.3;   // ADC 参考电压 (ESP32=3.3, Arduino=5.0)

float readBatteryVoltage() {
  int adcValue = analogRead(BATTERY_PIN);
  float voltage = (adcValue / 4095.0) * ADC_REF;  // ESP32 12-bit ADC
  // 还原分压前的电压
  float batteryVoltage = voltage * (R1 + R2) / R2;
  return batteryVoltage;
}

float getBatteryPercent(float voltage) {
  // 简化的锂电池放电曲线映射
  if (voltage >= 4.20) return 100.0;
  if (voltage >= 4.10) return 95.0;
  if (voltage >= 4.00) return 85.0;
  if (voltage >= 3.90) return 70.0;
  if (voltage >= 3.80) return 55.0;
  if (voltage >= 3.70) return 40.0;
  if (voltage >= 3.60) return 25.0;
  if (voltage >= 3.50) return 15.0;
  if (voltage >= 3.40) return 8.0;
  if (voltage >= 3.30) return 4.0;
  if (voltage >= 3.00) return 1.0;
  return 0.0;  // 过放保护触发
}

void setup() {
  Serial.begin(115200);
  Serial.println("锂电池监控启动");
}

void loop() {
  float voltage = readBatteryVoltage();
  float percent = getBatteryPercent(voltage);

  Serial.printf("电压: %.2fV | 电量: %.0f%%\n", voltage, percent);

  if (voltage < 3.2) {
    Serial.println("⚠️  警告:电量低!即将触发过放保护");
  }
  if (voltage > 4.25) {
    Serial.println("⚠️  警告:过充!检查充电电路");
  }

  delay(5000);
}

分压电阻选择要点:

分压后的电压必须 ≤ ADC 参考电压。以 4.2V 满电为例:

V_ADC = 4.2 × R2 / (R1 + R2)

R1=100k, R2=10k → V_ADC = 4.2 × 10/110 ≈ 0.38V (安全)
R1=300k, R2=100k → V_ADC = 4.2 × 100/400 = 1.05V (安全)

电阻值不宜过小,否则静态功耗大。建议总阻值 ≥ 100kΩ。

常见问题排查

1. 充电充不满(停在 3.8V)

原因

  • 充电电流设置过大,电池内阻压降导致 CV 阶段提前到达
  • 电池老化,内阻增大
  • USB 供电不足(电脑 USB 口可能只有 500mA)

解决

  • 检查 R_PROGRAM 阻值是否正确
  • 换用 2A 充电头测试
  • 尝试更换电池排除老化问题

2. 充电后电压迅速下降

原因

  • 电池内阻过大(老化或劣质电芯)
  • 充电未完成就断开(CV 阶段需要较长时间)
  • 负载电流过大

解决

  • TP4056 的 CV 阶段可能需要 2~3 小时,耐心等待
  • 检查充电指示灯是否从红色变为绿色
  • 考虑使用容量更大的电池

3. 保护板不放电

原因

  • 过放保护触发后需要充电才能恢复
  • 负载短路导致保护锁定
  • DW01 的 CO/DO 引脚状态异常

解决

  • 接上充电器,充到 3.0V 以上自动恢复
  • 移除负载后重新连接
  • 用万用表检查 DW01 各引脚电压

4. 充电芯片发烫

原因

  • TP4056 是线性充电芯片,压差大时发热正常
  • 输入电压过高(超过 6V)
  • 散热不良

解决

  • 确保输入电压在 5V(USB 标准)
  • PCB 设计时底部加散热焊盘(GND pad)
  • 大电流充电(>500mA)时考虑加小散热片
  • 如果输入电压高,改用开关充电芯片(如 CN3063)

5. 电池鼓包

原因

  • 过充(保护电路失效)
  • 充电电流过大
  • 电池质量问题

解决

  • 立即停用鼓包电池,存在安全风险
  • 检查保护电路是否正常工作
  • 使用品牌电芯(松下、三星、LG)
  • 不要混用新旧电池

设计建议总结

  1. 新手:直接买 TP4056 带保护模块,插上就能用
  2. 进阶:自己画板,TP4056 + DW01 + 8205A 完整方案
  3. 大功率:考虑开关充电芯片(CN3063、BQ24074),效率更高
  4. 多节电池:需要串联平衡充电板(2S/3S BMS)
  5. 安全:永远不要跳过保护电路,锂电池不是闹着玩的

硬件清单汇总

元件 型号 数量 总价(元)
TP4056 充电 IC SOP-8 1 0.5
DW01 保护 IC SOT-23-6 1 0.15
8205A MOS 管 SOT-26 1 0.1
18650 电池座 弹簧式 1 0.3
电阻电容 0603 封装 若干 0.5
Micro-USB 座 直插 1 0.2
18650 锂电池 2600mAh 品牌电芯 1 12
合计 约 14 元

希望这篇博客文章对您有所帮助!