☰
USB供电充电电路图及原理介绍:从5V到4.2V的完整链路与设计要点
2026/10/21 18:37:20 网站建设 项目流程

简介:这份PDF资料聚焦USB供电的充电电路图及原理,面向电子工程、硬件设计与嵌入式开发方向的初学者及工程师,帮助读者理解USB总线供电规范、电池充电电路设计思路及常见实现方案。资源共1个文件,为PDF格式,压缩包约684KB,内容以电路图、原理讲解与设计分析为主,便于随时查阅与对照学习。资料从USB电源规范切入,梳理了500mA供电能力、单元负载、枚举机制等基础概念,并给出简单USB/AC适配器充电电路的具体设计,涵盖线性稳压器、充电器IC、负载切换与增强型电路等模块,同时分析了充电电流偏低、负载始终连接电池等局限性及改进思路。目前已有431人学习,适合需要快速掌握USB充电电路原理、为便携设备电源设计打基础的读者参考。

1. USB供电的充电电路图及原理介绍:从一张图看懂5V到4.2V的完整链路

很多人第一次拿到「USB供电的充电电路图及原理介绍」这类资料,翻两页就放下了——图里一堆符号,电阻电容三极管挤在一起,看着像天书。但如果你手上正好有一块从旧充电宝拆下来的板子,或者想给自制的锂电池小设备加个充电口,这张图就是绕不开的东西。它解决的核心问题只有一个:把USB口出来的5V,安全、可控地变成锂电池需要的4.2V恒压,并且在电池电压低的时候先用恒流把电流限住。适合谁看?做小家电、DIY移动电源、嵌入式设备供电的硬件工程师和电子爱好者。搞懂这条链路,你就能自己算限流电阻、选三极管、判断一块充电板为什么发烫。

2. USB充电电路的三种主流拓扑:线性、开关与专用IC方案怎么选

2.1 线性充电拓扑:最简单也最容易发热的方案

线性充电的核心思路,是把USB的5V当成一个固定水源,用一个调整管(通常是PNP三极管或P沟道MOS)串在中间,像水龙头一样把多余的电压「吃掉」。电池电压低时,调整管压降大,电流被电阻或恒流源限定;电池电压升到4.2V时,反馈回路让调整管关小,进入恒压阶段。

这种拓扑的电路图最好认:USB的VBUS进来,先过一个二极管防反接,然后分两路——一路给调整管的发射极,一路通过分压电阻送到比较器或运放做电压检测。调整管的基极由反馈网络控制,集电极接电池正极。图上通常还能看到一个检流电阻,串在充电回路里,用来把电流信号转成电压信号。

为什么老资料里大量用这种方案?因为元件少、成本低、没有电感,EMI干净。但它的致命伤是效率等于电池电压除以5V。电池3.7V时效率约74%,剩下26%全变成热。如果充电电流设到1A,调整管上要耗散1.3W左右,TO-92封装的三极管直接烫到不敢摸。所以线性拓扑常见于100mA到500mA的小电流场景,比如早期蓝牙耳机、小容量锂电池设备。

我一般会这样估算线性方案的功耗:先确定最大充电电流I,再算最坏情况下的压差。USB电压按5.25V上限、电池按3.0V下限,压差就是2.25V,功耗P=2.25×I。如果I=0.5A,P≈1.1W,必须用SOT-223或TO-252封装的管子,并且铜箔面积要铺够。很多新手照着图焊出来发现烫手,就是没算这一步。

2.2 开关充电拓扑:效率上去了,但图变复杂了

开关充电的思路完全不同:它先把5V通过电感储能,再以高频开关的方式把能量「泵」进电池。电路图上会多出电感、续流二极管(或同步整流MOS)、输出电容,以及一个PWM控制器。你会在图上看到SW节点、电感L1、电流检测电阻CS,还有一堆补偿网络。

这种拓扑的效率能做到85%到92%,大电流充电时优势明显。比如2A充电,线性方案要烧掉2.6W以上,开关方案只损失0.3W左右。但代价是:电感选型不对会啸叫,布局不好会辐射噪声,补偿参数没调好会振荡。图上的补偿电阻电容(通常标为Rc、Cc)不是随便填的,它们决定了环路稳定性。

对于想自己搭开关充电电路的开发者,我的建议是:先别急着画分立方案。分立开关充电的调试门槛很高,没有示波器和电子负载很难定位问题。更稳妥的做法是用专用充电IC,把开关管和控制器集成在里面,你只需要按数据手册选外围电感和电容。这样电路图会简化成「IC+电感+几个阻容」的结构,既保留了开关方案的高效率,又避开了环路补偿的坑。

2.3 专用充电IC方案:把图读成「引脚定义+外围参数」

市面上常见的锂电池充电IC,比如TP4056这类,把恒流恒压控制、温度保护、充电状态指示全集成在一个SOP-8封装里。电路图变得非常规整:VBUS进VCC,BAT接电池,PROG脚接一个电阻设定充电电流,CHRG和STDBY接LED指示状态。

读这类图的关键是抓住三个参数:充电电流由PROG电阻决定,公式通常是I=1200/R(不同型号系数不同,以手册为准);恒压值出厂固定4.2V,精度靠内部基准保证;热调节功能会在芯片温度超过约120度时自动降低电流。这意味着你即使把PROG电阻设得很小,芯片也不会无限升温,但充电时间会变长。

我一般会这样选型:先看电池容量,按0.5C到1C确定充电电流。比如1000mAh电池,充电电流设500mA到1A。然后算PROG电阻,再核对IC的最大耗散功率。如果输入5V、电池3.7V、电流1A,IC内部耗散约1.3W,SOP-8封装的热阻约100度每瓦,温升会到130度,必须靠PCB铜箔散热或者降低电流。很多成品板把充电电流设在500mA以下,就是为了不加散热片也能稳定工作。

3. 从原理图到实物:恒流恒压两个阶段的参数计算与元件选型

3.1 恒流阶段:检流电阻和调整管怎么定

恒流阶段的本质是:不管电池电压怎么变,充电电流保持不变。实现方式通常是在回路里串一个小电阻,用运放或三极管检测它两端的电压,再反馈控制调整管。

假设你要做500mA恒流,检流电阻选0.1欧姆,那么满流时它两端电压是50mV。这个电压送到比较器,和基准电压比较。基准可以用TL431产生2.5V,再分压得到50mV。分压电阻的精度直接影响恒流精度,所以要用1%的金属膜电阻。

调整管的选择要看功耗。线性方案里,调整管在恒流阶段承受的压差是5V减去电池电压再减去检流电阻压降。电池3.0V时,压差约1.95V,电流0.5A,功耗接近1W。选管子时,额定功耗要留一倍余量,也就是选2W以上的。同时注意hFE不能太低,否则基极驱动电流会很大,拉低USB口的电压。

下面是一个恒流控制部分的参数计算代码,用来快速迭代不同电流下的元件值:

# 恒流充电参数计算 # 输入:目标充电电流、检流电阻、USB电压范围、电池电压范围 def calc_cc_params(i_target, r_sense, v_usb_max=5.25, v_usb_min=4.75, v_bat_min=3.0, v_bat_max=4.2): # 检流电阻上的满量程压降 v_sense = i_target * r_sense # 调整管最坏功耗:USB最高、电池最低 v_drop_max = v_usb_max - v_bat_min - v_sense p_diss_max = v_drop_max * i_target # 调整管最小功耗:USB最低、电池接近恒压点 v_drop_min = v_usb_min - v_bat_max - v_sense p_diss_min = max(0, v_drop_min * i_target) return { "检流压降(mV)": round(v_sense * 1000, 1), "调整管最大功耗(W)": round(p_diss_max, 3), "调整管最小功耗(W)": round(p_diss_min, 3), "建议管子额定功耗(W)": round(p_diss_max * 2, 2) } # 示例:500mA充电,0.1欧姆检流电阻 result = calc_cc_params(0.5, 0.1) for k, v in result.items(): print(f"{k}: {v}")

这段代码帮你快速判断调整管的热压力。参数说明:i_target是目标恒流值,r_sense是检流电阻,v_usb_max和v_usb_min是USB口可能出现的电压范围,v_bat_min和v_bat_max是电池从空到满的电压范围。输出里的「建议管子额定功耗」是最大功耗的两倍,这是工程上常用的降额准则。如果你算出来建议额定功耗超过1W,就要考虑换开关方案或者加散热片。

3.2 恒压阶段:4.2V基准怎么产生和校准

恒压阶段的目标是:电池电压到达4.2V时,充电电流逐渐减小,最终维持在一个很小的值。实现方式是把电池电压分压后和基准比较,误差放大器的输出控制调整管。

基准电压的精度决定了最终电池能充到多满。如果用TL431,它的初始精度是0.5%到2%,对应4.2V上的误差是21mV到84mV。对于大多数应用够用了,但如果做精密设备,就要选更高精度的基准源,或者用带修调功能的充电IC。

分压电阻的计算很简单:假设基准是2.5V,电池目标4.2V,那么上电阻R1和下电阻R2的比值是(4.2-2.5)/2.5=0.68。选R2=10k,R1就是6.8k。但要注意电阻的温漂,普通碳膜电阻温漂几百ppm,在温度变化大的环境里会让恒压点漂移。我一般用25ppm/度的金属膜电阻,成本高一点但省心。

实际调试时,恒压点往往需要微调。因为分压电阻有误差、基准有误差、运放有失调。我的做法是:先把R1换成固定电阻加一个多圈电位器串联,调到实际输出4.20V后,测出电位器阻值,再用固定电阻替换。这样批量生产时一致性也好。

3.3 充电状态指示与温度保护:容易被忽略的两个外围

状态指示看起来简单,但图上的接法有讲究。常见的是双色LED或者两个单色LED,一个表示正在充电,一个表示充满。充电IC的CHRG脚通常是开漏输出,充电时拉低,LED亮;充满后高阻,LED灭。限流电阻按LED电流算,比如3.3V驱动、LED压降2V、目标5mA,电阻就是(3.3-2)/0.005=260欧姆,取270欧姆标准值。

温度保护分两种:一种是IC内部的热调节,芯片结温超过阈值就自动降流;另一种是外部NTC电阻,贴在电池上,检测电池温度。锂电池在0度以下充电会析锂,有安全风险,所以正规方案会用NTC在低温时切断充电。电路图上NTC通常和分压电阻串联,接到IC的TEMP脚。选NTC时要看B值和阻值,常见10k B=3435。如果你做的设备使用环境温度变化大,这个电阻不能省。

4. 避坑与排查:充电板发烫、充不满、指示灯乱跳的5个真实原因

4.1 调整管发烫到烫手

现象:充电时三极管或IC表面温度超过80度,手摸上去坚持不了两秒。 原因:线性方案功耗等于压差乘电流,USB 5V、电池3.7V、电流1A时功耗1.3W,SOT-23封装热阻约250度每瓦,温升会到300度以上,实际会触发过热保护或烧毁。 解决:先算功耗,再选封装。超过0.5W就要用SOT-223或TO-252,并且PCB上留至少1平方厘米的铜箔散热。如果空间不允许,降低充电电流到300mA以下,或者换开关方案。

4.2 电池只能充到4.0V就转灯

现象:充电指示灯显示充满,但万用表量电池只有4.0V到4.1V。 原因:恒压分压电阻误差大,或者基准源精度不够。碳膜电阻温漂大,夏天和冬天恒压点能差几十毫伏。另外,如果检流电阻在恒压阶段仍有较大压降,IC检测到的电压会偏低。 解决:换1%精度、25ppm温漂的金属膜电阻做分压。检查检流电阻是否在反馈环路之外——有些图把检流电阻放在电池负极和地之间,这样IC的电压检测就不包含它的压降,恒压点更准。

4.3 充电指示灯闪烁或乱跳

现象:LED不是稳定亮或灭,而是快速闪烁,或者充电中途突然变灯。 原因:常见是电源纹波太大。USB口如果来自开关电源,纹波可能超过100mV,干扰了IC的比较器。另一个原因是电池内阻大,充电时电压被抬高,IC误判为充满,电流一降电压又掉下来,反复振荡。 解决:在VBUS和地之间并一个10uF到100uF的电解电容,再并一个0.1uF陶瓷电容。如果是电池老化内阻大,换电池。还可以在BAT脚并一个1uF电容,滤掉检测噪声。

4.4 USB口电压被拉低到4.5V以下

现象:插上充电板后,USB口电压从5V掉到4.5V甚至更低,充电电流也上不去。 原因:USB线太细太长,线阻大。或者充电板输入端没有足够的大电容,瞬态电流把电压拉垮。还有可能是调整管基极驱动电流太大,拉低了前级电压。 解决:换短而粗的USB线,线阻控制在0.2欧姆以内。输入端加220uF以上的电解电容。如果是三极管方案,增大基极电阻或改用MOS管,降低驱动电流。

4.5 充满后电池电压缓慢下降

现象:转灯后拔下电池,过几小时量电压从4.2V掉到4.1V以下。 原因:充电IC的恒压精度不够,或者电池自放电大。另一个容易被忽略的原因是IC在充满后没有完全切断,而是进入涓流模式,但涓流电压设置偏低。 解决:先确认电池本身的自放电率,正常锂电池每月自放电2%到3%。如果一天就掉0.1V,电池有问题。如果电池正常,检查IC的恒压精度,必要时换更高精度的型号。有些IC可以通过外部电阻微调恒压值,查手册确认。

5. 进阶技巧:用示波器抓充电曲线,把「玄学」变成可测参数

充电电路调试最怕「玄学」——灯亮了、电池充进去了,但不知道余量还有多少,换一批元件就翻车。我的习惯是:不管多简单的充电板,第一次打样回来都要用示波器抓一次完整充电曲线。具体做法是:在检流电阻两端接差分探头(或者用两个单端探头做数学运算),同时用另一个通道监测电池电压。设置触发方式为「上升沿触发」,触发电压设在检流电阻压降的10%左右,然后插上USB,让示波器单次采集整个充电过程。

你会看到一条典型的曲线:开始阶段电流恒定,电压缓慢上升;接近4.2V时电流开始下降,电压趋于平缓;最后电流降到设定值的十分之一左右,IC转灯。这条曲线能告诉你三件事:恒流值准不准、恒压点偏不偏、转灯电流合不合理。

如果恒流阶段电流有台阶或振荡,说明环路不稳定,需要调整补偿电容。如果恒压阶段电压还在缓慢爬升,说明分压电阻温漂大或者基准在漂。如果转灯电流太大,比如设定500mA但200mA就转灯,电池只能充到八成满。

下面是一个用Python处理示波器CSV数据的例子,把采集到的电压电流画成曲线并自动提取关键参数:

import csv import matplotlib.pyplot as plt # 读取示波器导出的CSV,假设两列:时间(s)、检流电压(V) # 检流电阻0.1欧姆,电流 = 检流电压 / 0.1 def parse_scope_csv(filepath, r_sense=0.1): times, currents, voltages = [], [], [] with open(filepath, 'r') as f: reader = csv.reader(f) next(reader) # 跳过表头 for row in reader: t = float(row[0]) v_sense = float(row[1]) v_bat = float(row[2]) # 第三列是电池电压 times.append(t) currents.append(v_sense / r_sense) voltages.append(v_bat) return times, currents, voltages # 提取恒流值和恒压值 def extract_params(times, currents, voltages): # 恒流值取前1/3时间段的平均电流 n = len(times) cc_current = sum(currents[:n//3]) / (n//3) # 恒压值取最后10%时间段的平均电压 cv_voltage = sum(voltages[-n//10:]) / (n//10) # 转灯电流取最后5%的平均电流 end_current = sum(currents[-n//20:]) / (n//20) return cc_current, cv_voltage, end_current # 使用示例(需替换为实际文件路径) # times, currents, voltages = parse_scope_csv('charge_curve.csv') # cc, cv, end_i = extract_params(times, currents, voltages) # print(f"恒流值: {cc*1000:.1f} mA") # print(f"恒压值: {cv:.3f} V") # print(f"转灯电流: {end_i*1000:.1f} mA")

这段代码的关键在于:用前三分之一时间段的平均电流代表恒流值,用最后百分之十时间段的平均电压代表恒压值,用最后百分之五的平均电流代表转灯电流。参数r_sense要和你板子上的检流电阻一致。如果你没有差分探头,可以用两个单端探头分别测检流电阻两端,然后在示波器里做减法,或者导出数据后用代码相减。

我自己的血泪经验是:不要相信「焊好就能用」。哪怕是最简单的TP4056方案,PROG电阻的精度、输入电容的容量、电池线的长度,都会影响实际充电曲线。有一次我为了省空间把输入电容从10uF降到1uF,结果充电时USB口电压纹波大到让IC反复重启,电池充了一晚上还是3.8V。后来老老实实换回10uF,问题消失。所以,充电电路图只是起点,真正值钱的是你愿意花时间测曲线、调参数、留余量。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询