1. 从一颗小芯片说起:TP4056到底解决了什么问题
如果你拆过充电宝、蓝牙耳机充电仓、或者自己DIY过带锂电池的小设备,大概率见过一颗丝印为TP4056的SOP-8贴片芯片。它旁边通常跟着一个0805封装的电阻、两颗LED、一个微型USB口或者Type-C口,再加一块薄薄的软包电芯——这就是一套最经典的锂电池充电电路。
TP4056是一颗线性锂电池充电管理IC,最大特点是外围极简、成本极低、单节锂电专用。它内部集成了恒流恒压充电逻辑、温度监测、电池反接保护(部分版本)、充电状态指示,外部只需要一个编程电阻设定充电电流,就能把5V输入稳定地灌进4.2V的锂电池里。对于做STM32项目、小型物联网节点、便携仪器的人来说,它几乎是绕不开的入门级电源管理方案。
但问题也恰恰出在这里:太多人把它当成"接上就能用"的黑盒,结果遇到充不满、红灯不变绿、芯片发烫、电池鼓包、并联充电炸管等一系列问题。这些坑我在实际项目里几乎踩了个遍。这篇内容就把TP4056从原理到工程落地完整拆一遍,包括编程电阻怎么算、散热怎么处理、和STM32怎么配合做电源管理、常见故障怎么排查,以及那些数据手册上不会写但实际会要命的细节。
适合阅读的人群:正在做STM32嵌入式项目需要加锂电池供电的开发者、DIY充电宝或便携设备的硬件爱好者、以及想搞懂锂电池充电管理底层逻辑的电子专业学生。不需要你有多深的模拟电路功底,但至少要能看懂基本的电阻电容符号和万用表读数。
2. 电路整体设计与方案选型思路
2.1 为什么是线性充电而不是开关充电
锂电池充电方案分两大流派:线性充电和开关充电。TP4056属于线性方案,原理上就是把输入5V和电池电压之间的压差,通过内部调整管"消耗"掉,多余的能量以热量形式散发。听起来很浪费,但它有几个开关方案比不了的优势。
第一是没有电感、没有开关噪声。开关充电器需要电感、续流二极管、滤波电容,工作时会在几百kHz到MHz频率上产生纹波,这对旁边的模拟电路、射频模块、高精度ADC是灾难。线性方案输出干净,对STM32内部的12位ADC几乎无干扰。
第二是外围元件数量少。TP4056的典型应用电路只需要1个编程电阻、2个指示LED及限流电阻、输入输出各1个电容,总共不到10个元件。开关方案动辄要15个以上,PCB面积和BOM成本都上去了。
第三是静态功耗和待机表现好。充电完成后TP4056进入涓流维护状态,自身消耗极低,适合长期插着充电线的设备。
代价也很明确:效率低、发热大。当电池电压在3.7V、输入5V时,压差1.3V,如果充电电流是1A,芯片上就要消耗1.3W的功率。SOP-8封装的热阻大约在100°C/W左右(具体看PCB铺铜),1.3W意味着温升可能超过100°C,芯片会触发内部热调节,自动降低充电电流。这就是为什么很多人发现"设了1A实际只有600mA"——不是芯片坏了,是它在保护自己。
所以选型逻辑很清楚:充电电流≤500mA、对噪声敏感、成本敏感的场景,选TP4056;充电电流≥1A、追求效率、散热条件差的场景,老老实实上开关充电IC。
2.2 单节锂电的充电曲线与TP4056的对应关系
要理解TP4056的工作,必须先理解锂电池的充电曲线。单节三元锂电池(标称3.7V,满电4.2V)的标准充电过程分三个阶段:
涓流充电(Trickle Charge):当电池电压低于约2.9V时,电池处于深度放电状态,此时不能用大电流猛充,否则会损伤电池内部结构。TP4056会以设定电流的十分之一左右进行小电流预充,把电压慢慢抬上来。
恒流充电(Constant Current, CC):电池电压升到2.9V以上后,进入恒流阶段,以设定的电流(比如1A)持续充电,电压稳步上升。这个阶段充进去的电量最多,大约占总容量的70%到80%。
恒压充电(Constant Voltage, CV):电池电压到达4.2V后,TP4056切换为恒压模式,保持4.2V不变,电流开始自然衰减。当电流衰减到设定值的十分之一左右时,充电结束,CHRG引脚状态翻转,红灯灭绿灯亮。
这个三段式逻辑全部由TP4056内部的状态机自动完成,用户唯一需要设定的就是恒流阶段的电流值,而这个值由PROG引脚上的电阻决定。
2.3 编程电阻的计算逻辑
TP4056的数据手册给出了一个公式:
I_bat = 1200 / R_prog
其中I_bat单位是安培,R_prog单位是欧姆。反推一下:
| 目标充电电流 | 编程电阻R_prog | 标准电阻取值 |
|---|---|---|
| 130mA | 9.23kΩ | 10kΩ |
| 250mA | 4.8kΩ | 4.7kΩ |
| 500mA | 2.4kΩ | 2.4kΩ |
| 800mA | 1.5kΩ | 1.5kΩ |
| 1000mA | 1.2kΩ | 1.2kΩ |
这里有个关键点:公式里的1200是典型值,实际芯片存在±10%左右的离散性。也就是说你焊1.2kΩ电阻,实际电流可能在900mA到1100mA之间波动。做产品时要留余量,别卡着电池的最大充电倍率设计。
还有一个容易被忽略的约束:充电电流不能超过电池的0.5C。比如一块1000mAh的软包电芯,最大充电电流就是500mA。你设1A虽然芯片能输出,但电池会发热、寿命骤减,严重的会鼓包。我见过有人拿TP4056给一块300mAh的小电芯设1A充电,半小时后电芯烫得能煎鸡蛋,这就是典型的过流充电。
2.4 和STM32系统的配合思路
TP4056本身是纯模拟芯片,不需要单片机控制就能工作。但在STM32项目里,我们通常希望知道充电状态、电池电压,甚至动态调整系统功耗。常见的配合方式有三种:
状态读取:把TP4056的CHRG和STDBY引脚接到STM32的GPIO上,配置为输入模式,通过电平判断当前是充电中、充满还是故障。注意这两个引脚是开漏输出,需要上拉电阻(通常10kΩ到VCC)。
电压监测:用STM32的ADC采集电池分压后的电压,换算成实际电量。这里要注意分压电阻的选取,阻值太大会导致ADC输入阻抗不匹配,太小会持续耗电。一般用100kΩ+100kΩ分压,配合0.1uF滤波电容。
电源路径管理:如果设备需要边充边用,TP4056本身不支持电源路径管理(充电时负载直接挂在电池上),需要外加PMOS或者专用负载开关。这个后面会详细讲。
3. 核心细节解析与实操要点
3.1 典型应用电路的完整拆解
一套完整的TP4056充电电路包含以下部分,我按信号流向逐个说明:
输入端:5V输入(USB或DC座),并联一个10uF到22uF的陶瓷电容做输入滤波。这个电容不能省,因为USB线缆有电感效应,插拔瞬间会产生电压尖峰,没有输入电容的话可能击穿芯片。我实测过,省掉输入电容的板子在热插拔时损坏率明显上升。
编程电阻:接在PROG引脚(第2脚)到地之间,决定充电电流。用1%精度的金属膜电阻,别用碳膜,碳膜温漂大,夏天和冬天充电电流能差出15%。
状态指示:CHRG(第7脚)和STDBY(第6脚)各接一个LED到VCC,中间串1kΩ限流电阻。红灯亮表示正在充电,绿灯亮表示充满。有些版本还有第三个引脚TEMP,接NTC热敏电阻做温度保护,不用的直接接地。
电池端:BAT引脚(第5脚)接电池正极,并联一个10uF电容。这个电容的作用是稳定电池端的电压波动,特别是在充电切换阶段。
散热焊盘:SOP-8封装的底部有一个裸露的散热焊盘,必须焊接到PCB的铜箔上,并且铜箔面积越大越好。很多人忽略这一点,导致芯片过热降流。我的经验是散热铜箔面积至少要做到1平方厘米,并且打过孔连接到背面的大面积地铜。
3.2 充电电流设定的实操计算
假设你有一块2000mAh的三元锂电池,希望用0.4C充电,也就是800mA。代入公式:
R_prog = 1200 / 0.8 = 1500Ω
选1.5kΩ的1%电阻。但这里要考虑芯片的离散性,实际电流可能在720mA到880mA之间。如果你希望更保守一点,可以选1.6kΩ,对应典型电流750mA,最大不超过825mA,对2000mAh电池来说完全安全。
再算一下发热。假设电池电压3.7V,输入5V,充电电流800mA:
P_chip = (5 - 3.7) × 0.8 = 1.04W
SOP-8封装加散热焊盘,在良好铺铜的情况下热阻大约60°C/W到80°C/W。取70°C/W计算,温升约73°C。如果环境温度25°C,芯片表面温度会到98°C左右。这个温度手摸上去很烫,但还在芯片的结温限制(通常150°C)以内。不过长期工作在高温下会加速老化,所以如果空间允许,建议把电流降到500mA,发热直接减半。
3.3 电池反接与保护设计
TP4056本身有一定的反接保护能力,但不同厂家批次的芯片表现不一致。稳妥的做法是在电池端加一个保护电路。最简单的方案是串一个肖特基二极管,但二极管有0.3V左右的压降,会浪费效率。更好的方案是用一颗锂电池保护IC(比如DW01)加双MOS,组成完整的过充、过放、过流保护。
这里要特别提醒:TP4056只负责充电管理,不负责过放保护。如果你的系统直接从电池取电,没有低压切断机制,电池会被放到2.5V以下,造成永久损伤。所以完整的锂电池系统应该是:TP4056负责充电 + DW01负责保护 + 你的负载电路。三者缺一不可。
3.4 PCB布局的几条硬规矩
TP4056的PCB布局有几个容易翻车的地方,我按重要性排序:
散热优先:芯片底部的散热焊盘必须连接到尽可能大的铜皮,最好在背面也铺一块地铜,用至少4个0.3mm的过孔连接。我见过有人把散热焊盘悬空,结果1A充电时芯片烫到自动降流到300mA,还以为是芯片质量问题。
输入电容紧贴芯片:10uF输入电容要放在VCC引脚旁边,走线越短越好。如果电容离得远,走线电感会让滤波效果大打折扣。
电池走线要粗:BAT引脚到电池连接器的走线宽度至少0.5mm(1oz铜厚),因为充电电流全部从这里过。走线太细会导致压降,芯片检测到的电池电压偏低,提前进入恒压阶段,结果就是充不满。
PROG电阻远离发热源:编程电阻对温度敏感,不要放在芯片散热焊盘旁边。我一般把它放在板子边缘,离芯片至少5mm。
LED限流电阻别省:有人直接把LED接在CHRG引脚上,结果LED电流过大烧了引脚。1kΩ是最低要求,用2kΩ更稳妥,亮度也够看。
4. 实操过程与核心环节实现
4.1 从零搭建一套TP4056充电模块
我以自己最近做的一个STM32数据采集节点为例,完整走一遍流程。需求是:2000mAh锂电池供电,充电电流500mA,STM32通过GPIO读取充电状态,ADC监测电池电压。
第一步:确定元件清单
| 元件 | 规格 | 数量 | 备注 |
|---|---|---|---|
| TP4056 | SOP-8 | 1 | 选带散热焊盘的版本 |
| 编程电阻 | 2.4kΩ 1% | 1 | 对应500mA |
| 输入电容 | 10uF 0805 | 1 | X7R材质 |
| 输出电容 | 10uF 0805 | 1 | X7R材质 |
| LED | 0805红色 | 1 | 充电指示 |
| LED | 0805绿色 | 1 | 充满指示 |
| LED限流电阻 | 1kΩ 1% | 2 | 0805封装 |
| 上拉电阻 | 10kΩ | 2 | 用于CHRG和STDBY |
| 电池连接器 | JST-PH 2.0 | 1 | 注意正负极 |
第二步:原理图设计要点
在EDA软件里画原理图时,注意几个细节。CHRG和STDBY是开漏输出,所以上拉电阻要接到VCC(5V),不是接到电池。TEMP引脚如果不用,直接接地,不要悬空。BAT引脚和电池连接器之间不要串任何元件,直接连。
第三步:PCB布局实操
板子尺寸40mm×25mm,双面。顶层放TP4056和所有元件,底层铺完整地铜。散热焊盘下面放9个过孔(3×3阵列),孔径0.3mm。输入电容距离VCC引脚不超过2mm。电池走线宽度0.8mm。PROG电阻放在板子最右侧,远离芯片。
第四步:焊接与上电测试
先焊电源部分,不接电池,用稳压电源给5V输入,测VCC引脚电压是否正常。然后测PROG引脚电压,正常应该在1V左右。接着接一个100Ω假负载代替电池,测充电电流。如果电流和计算值偏差超过15%,检查PROG电阻是否焊错。
第五步:接入真实电池
用一块放完电的2000mAh电池(电压约3.0V),接入电路。红灯亮,用万用表串联测充电电流,应该在480mA到520mA之间。充电过程中用手背轻触芯片表面,温热但不烫手(约50°C到60°C)属于正常。大约4小时后,绿灯亮,测电池电压应该在4.15V到4.20V之间。
第六步:STM32端代码实现
STM32的GPIO配置为输入模式,开启内部上拉(或者用外部上拉)。ADC配置为12位精度,采样时间设为最长(比如239.5个周期),因为分压电阻阻值大,需要长的采样时间让采样电容充分充电。
// GPIO初始化 void Charge_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); // PB0接CHRG,PB1接STDBY GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } // 读取充电状态 uint8_t Get_Charge_State(void) { uint8_t chrg = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); uint8_t stdby = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1); if (chrg == 0 && stdby == 1) return 1; // 充电中 if (chrg == 1 && stdby == 0) return 2; // 已充满 if (chrg == 1 && stdby == 1) return 0; // 未接电池或故障 return 3; // 异常状态 }ADC读取电池电压的代码:
// 电池电压采集,分压电阻100k+100k float Get_Battery_Voltage(void) { uint32_t adc_value = 0; float voltage = 0.0f; HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 100); adc_value = HAL_ADC_GetValue(&hadc1); HAL_ADC_Stop(&hadc1); // 12位ADC,参考电压3.3V,分压比2:1 voltage = (adc_value / 4095.0f) * 3.3f * 2.0f; return voltage; }这里有个细节:分压电阻用100kΩ+100kΩ,等效输出阻抗是50kΩ。STM32的ADC要求输入阻抗不超过50kΩ,刚好卡在边界上。稳妥的做法是在分压点加一个0.1uF电容,或者把电阻降到47kΩ+47kΩ。我用100kΩ+100kΩ加0.1uF电容的方案,实测精度在±30mV以内,够用了。
4.2 边充边用的电源路径设计
TP4056的一个硬伤是:充电时负载直接挂在电池上,充电电流和负载电流混在一起,导致两个问题。一是充电时间变长,因为一部分电流被负载吃掉了;二是充满判断不准,因为负载电流会让电池端电流始终高于截止阈值,绿灯永远不亮。
解决方案是加一个电源路径管理电路。最简单的做法是用一个PMOS,源极接5V输入,漏极接系统负载,栅极由电池电压控制。当5V存在时,PMOS导通,系统由5V供电,电池只充电不放电;当5V拔掉时,PMOS截止,系统由电池供电。
具体电路:PMOS选AO3401,栅极通过一个10kΩ电阻接到5V输入,同时通过一个100kΩ电阻接地。当5V存在时,栅极被拉高,PMOS截止(注意PMOS的导通条件是栅极低于源极)。等等,这里逻辑要理清楚。
正确的接法:PMOS源极接电池正极,漏极接系统负载,栅极接5V输入。当5V存在时,栅极电压5V,源极电压约3.7V到4.2V,栅源电压Vgs为正,PMOS截止,负载由5V通过一个肖特基二极管供电。当5V拔掉时,栅极被下拉电阻拉到地,Vgs为负,PMOS导通,负载由电池供电。
这个电路我实际用过,效果稳定。肖特基二极管选SS34,压降0.3V左右,系统电压从5V降到4.7V,对3.3V的STM32来说完全够用。
4.3 多节电池并联充电的处理
有些项目需要更大容量,会把多节电池并联。TP4056可以给并联电池组充电,但要注意几点。
并联电池必须是同型号、同批次、同老化程度的。新旧电池混并联,内阻不同,充电时电流分配不均,旧电池可能过充。我见过有人把一块新电池和一块旧电池并联用TP4056充电,结果旧电池鼓包了。
充电电流要按总容量重新计算。两节2000mAh并联,总容量4000mAh,0.5C就是2A。但TP4056最大只能输出1A左右(受限于封装散热),所以要么降低充电倍率到0.25C,要么换更大电流的充电方案。
并联电池的连线要等长等粗,确保每节电池的线路阻抗一致。最好用星型连接,从充电板出来先到一个汇流点,再从汇流点分别接每节电池。
4.4 充电截止电压的微调
标准TP4056的恒压值是4.2V±1.5%,也就是4.137V到4.263V之间。有些批次可能偏低,导致电池只能充到4.1V左右,用户感觉"充不满"。如果你需要精确控制截止电压,可以选TP4056的变种型号,比如TP4056-4.35V(用于高压锂电)或者通过外部电路微调。
但我不建议普通用户去改截止电压。4.2V是锂电池的安全上限,调高了有风险,调低了容量损失。如果你发现电池只能充到4.0V就转绿灯,先检查是不是电池老化内阻变大,或者充电线压降太大导致芯片检测到的电压偏高。用万用表直接测电池两端电压,如果确实是4.0V,那可能是芯片批次问题,换一颗试试。
5. 常见问题与排查技巧实录
5.1 红灯不变绿,一直充电
这是最高频的问题。可能原因有五个,按概率排序:
电池内阻过大:老化电池内阻可能从50mΩ升到200mΩ以上,充电时电池端电压被内阻抬高了,芯片检测到4.2V就转恒压,但实际电池内部还没充满。表现就是绿灯亮了,但电池一用就没电。解决办法是换电池。
充电线压降太大:劣质USB线线阻可能超过1Ω,500mA电流下压降0.5V,芯片输入只有4.5V,充电能力不足。换一根粗线试试。
PROG电阻虚焊:编程电阻开路时,TP4056会进入默认小电流模式(约130mA),充电极慢,看起来像不变绿。用万用表测PROG引脚对地电阻,应该是设定值。
芯片散热不良:芯片过热触发降流,充电时间大幅延长。摸一下芯片温度,如果烫手(超过80°C),检查散热焊盘是否焊好。
电池电压过低:如果电池被放到2.5V以下,TP4056会先涓流充电,这个阶段可能持续很久。耐心等,或者先用稳压电源把电池抬到3V以上再充。
5.2 芯片发烫严重
TP4056发烫是正常的,但烫到不能摸就不正常了。正常工作时芯片表面温度应该在50°C到70°C之间。如果超过80°C,检查以下几点:
输入电压是不是太高?有些人用9V或12V输入,压差太大,芯片功耗剧增。TP4056的输入范围是4V到8V,推荐5V。
充电电流是不是设太大了?重新计算PROG电阻,确保电流在合理范围。
散热焊盘有没有焊?用热风枪吹一下,确保焊盘和PCB铜箔充分连接。
PCB铜箔面积够不够?至少1平方厘米,越大越好。
5.3 电池充到4.0V就显示充满
这个问题在热词里也出现了,说明很常见。原因通常是电池端到芯片BAT引脚的走线压降。充电电流500mA,走线电阻0.2Ω,压降就是0.1V。芯片检测到4.2V时,电池实际只有4.1V。如果走线电阻0.4Ω,电池就只有4.0V。
解决办法:加粗BAT走线,缩短走线长度,或者在BAT引脚和电池之间加一个开尔文连接点,让芯片的电压检测走单独的细线,不经过大电流路径。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 红灯不亮 | 输入无5V | 测VCC引脚电压 | 检查USB线、接口 |
| 红灯不亮 | 芯片损坏 | 测PROG引脚电压 | 更换芯片 |
| 绿灯不亮 | 电池未接 | 测BAT引脚电压 | 接好电池 |
| 绿灯不亮 | 电池老化 | 测电池内阻 | 更换电池 |
| 芯片发烫 | 散热不良 | 摸芯片温度 | 补焊散热焊盘 |
| 芯片发烫 | 电流过大 | 测充电电流 | 增大PROG电阻 |
| 充不满 | 走线压降 | 测电池端电压 | 加粗走线 |
| 充不满 | 芯片离散 | 换芯片对比 | 更换芯片 |
| 充电极慢 | PROG虚焊 | 测PROG电阻 | 重新焊接 |
| 充电极慢 | 输入压降 | 测VCC电压 | 换粗线 |
5.5 几个数据手册不会告诉你的经验
经验一:TP4056的CHRG和STDBY引脚在未接电池时都是高电平,接上电池但未充电时也是高电平。只有真正在充电时CHRG才拉低。所以STM32判断"是否接电池"不能只看这两个引脚,要结合ADC电压判断。
经验二:TP4056在充电完成后,如果电池电压掉到4.05V左右,会自动重新启动充电。这个叫"再充电阈值",是正常行为。如果你发现绿灯亮了一会儿又变红灯,不是故障,是电池自放电导致的正常补电。
经验三:TP4056的TEMP引脚如果接NTC热敏电阻,可以做过温保护。但NTC的选型有讲究,要用10kΩ B值3435的,接在TEMP和GND之间,同时TEMP和VCC之间要接一个10kΩ电阻分压。不接的话直接接地,不要悬空,悬空会导致芯片进入保护状态不充电。
经验四:如果你用Type-C接口,注意CC引脚要各接一个5.1kΩ下拉电阻到地,否则某些充电器不输出5V。这个坑我踩过,板子焊好插上没反应,查了半天才发现是CC没处理。
经验五:TP4056的输入和输出电容要用X7R或X5R陶瓷电容,不要用Y5V。Y5V的容量随电压变化极大,标称10uF在5V下可能只剩3uF,滤波效果大打折扣。
6. 和STM32深度配合的进阶玩法
6.1 用STM32做智能充电管理
TP4056本身是"傻瓜式"充电,但配合STM32可以做出更智能的行为。比如:
动态调整充电电流:虽然TP4056的PROG电阻是硬件设定的,但你可以用STM32控制一个数字电位器或者模拟开关切换不同的PROG电阻,实现充电电流的分档调节。比如电池温度低时用小电流,温度正常时用大电流。
充电时间统计:STM32记录每次充电的起始和结束时间,通过RTC打时间戳,存到Flash里。这样可以分析电池健康度,充电时间明显变长说明电池老化了。
温度监控:在电池附近放一个NTC,STM32的ADC采集温度,超过45°C就通过GPIO控制一个MOS切断充电。虽然TP4056自带TEMP功能,但用STM32做可以更灵活,比如在OLED上显示温度曲线。
6.2 低功耗设计中的电源管理
STM32项目用锂电池供电时,功耗管理是核心。TP4056在充电时消耗的电流很小(约1mA),但在待机时如果STM32没有进入低功耗模式,电池很快就会被耗光。
我的做法是:STM32平时进入Stop模式,RTC定时唤醒(比如每10秒),采集一次电池电压和充电状态,然后继续睡。Stop模式下STM32的电流可以降到几微安,2000mAh电池可以撑好几个月。
唤醒后的代码逻辑:
void RTC_Wakeup_Handler(void) { // 清除唤醒标志 HAL_RTCEx_DeactivateWakeUpTimer(&hrtc); // 采集电池电压 float vbat = Get_Battery_Voltage(); // 采集充电状态 uint8_t state = Get_Charge_State(); // 如果电压低于3.3V,进入低电量报警 if (vbat < 3.3f) { Low_Battery_Alert(); } // 处理完继续睡 Enter_Stop_Mode(); }这里要注意:Stop模式下ADC和GPIO的状态要保持,唤醒后要重新初始化ADC。另外,分压电阻在Stop模式下会持续耗电,100kΩ+100kΩ的分压电阻在4.2V下消耗约21uA,对低功耗应用来说偏大。可以改用1MΩ+1MΩ,消耗降到2.1uA,但ADC采样时间要相应加长。
6.3 充电状态的上报与显示
如果你的STM32项目带显示屏(OLED或LCD),可以把充电状态做得更直观。比如:
- 充电中:显示电池图标闪烁,旁边显示"CHARGING"
- 充满:电池图标满格,显示"FULL"
- 未充电:显示当前电压和估算电量百分比
电量估算用简单的电压映射就行,不需要复杂的库仑计。三元锂电池的电压和电量对应关系大致是:
| 电池电压 | 估算电量 |
|---|---|
| 4.20V | 100% |
| 4.10V | 90% |
| 4.00V | 75% |
| 3.90V | 60% |
| 3.80V | 40% |
| 3.70V | 25% |
| 3.60V | 10% |
| 3.50V | 5% |
| 3.30V | 0% |
这个表是经验值,不同电池略有差异。注意锂电池的放电曲线中间有一段很平坦(3.7V到3.9V),电压变化很小但电量变化很大,所以单纯靠电压估算电量在中间段误差较大。要求高的话还是上库仑计芯片。
6.4 充电电路的仿真验证
在打板之前,可以用LTspice或者Multisim做一下仿真。TP4056的官方模型不一定好找,但可以用行为模型替代:用一个受控电流源模拟恒流阶段,一个受控电压源模拟恒压阶段,再加上电池的等效电路模型(一个理想电压源串一个内阻,再并一个电容)。
仿真主要验证两点:一是充电电流是否在预期范围,二是芯片功耗是否超过封装限制。我一般会扫一遍电池电压从3.0V到4.2V,看芯片功耗曲线,找出最大功耗点。对于500mA充电、5V输入的情况,最大功耗出现在电池电压最低时,约(5-3.0)×0.5=1.0W。确认散热设计能扛住这个功耗。
仿真的好处是可以在几分钟内试完不同参数,不用反复焊板子。但要注意仿真模型和实际芯片有差异,最终还是要以实测为准。
7. 一些实际项目中的体会
我做过的STM32项目里,TP4056几乎是标配。从最早的蓝牙温湿度计,到后来的LoRa环境监测节点,再到带OLED显示的便携数据记录仪,电源部分都是TP4056加锂电池的组合。踩过的坑多了,慢慢也总结出一些自己的习惯。
比如我现在画板子,TP4056的散热焊盘下面一定会放9个过孔,不管充电电流设多少。因为过孔不花钱,但散热不好导致的降流问题会浪费很多调试时间。再比如PROG电阻,我现在都用1%精度的0805金属膜,虽然比碳膜贵几分钱,但省去了温度漂移带来的不确定性。
还有一点:如果你做的是要过认证的产品,TP4056可能不是最佳选择,因为它的截止电压精度和温度保护功能相对简单。但对于DIY、毕设、小批量产品来说,它的性价比和易用性很难被替代。
最后分享一个判断TP4056是否正常工作的快速方法:上电后先不接电池,测CHRG引脚应该是高电平(约5V),STDBY也是高电平。接上放完电的电池,CHRG应该立刻变低(约0.3V),STDBY保持高。如果CHRG不变低,要么是电池没接好,要么是芯片坏了。这个方法我用了很多次,比看LED还快,因为LED有时候限流电阻焊错会误导判断。