锂电池是所有嵌入式项目最常见的电源方案,但用不好就会变成"定时炸弹"。过充会鼓包,过放会永久损坏,短路直接冒烟。今天我们就来聊聊怎么设计一个靠谱的锂电池充电保护电路。
为什么需要保护电路?
锂电池的脾气比你想的要大:
- 过充(>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 的充电过程分三个阶段:
- 预充阶段(电池电压 < 2.9V):以小电流(约 1/10 设定电流)涓流充电,唤醒深度放电的电池
- 恒流阶段(2.9V ~ 4.2V):以设定电流恒流充电,这是主要的充电阶段
- 恒压阶段(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-USB5V →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)
- 不要混用新旧电池
设计建议总结
- 新手:直接买 TP4056 带保护模块,插上就能用
- 进阶:自己画板,TP4056 + DW01 + 8205A 完整方案
- 大功率:考虑开关充电芯片(CN3063、BQ24074),效率更高
- 多节电池:需要串联平衡充电板(2S/3S BMS)
- 安全:永远不要跳过保护电路,锂电池不是闹着玩的
硬件清单汇总
| 元件 | 型号 | 数量 | 总价(元) |
|---|---|---|---|
| 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 元 |
希望这篇博客文章对您有所帮助!