先说一个我在调试现场反复遇到的场景:一块手持设备的板子焊回来,插上适配器,电池指示灯亮了,但充电电流卡在 800mA 上不去,用手背碰一下 BQ25895 背面的板子,烫得缩手。把示波器探头搭到 SW 引脚上,波形上是明显的振铃,再去看 VBUS,电压已经被拉塌了 400mV。很多人第一反应是芯片买到了假货,或者是软件寄存器没配对,实际上这类问题八成出在外围选型和 PCB 布局上——BQ25895 是一颗集成度很高的单节锂电开关充电管理芯片,支持 5A 大电流充电、I2C 全参数可编程、路径管理和 OTG 升压输出,功能越多,对 Layout 和外围元件的要求就越苛刻。这篇内容我会从它的内部功率级结构讲起,把电感电容的取值算法、寄存器配置顺序、PCB 布局的具体做法和联调阶段的排障链路完整走一遍,面向的是已经能画板子、但第一次用这颗电源管理芯片做产品的硬件工程师,也适合想搞明白开关充电到底比线性充电强在哪的入门读者。
1. 这颗芯片的边界在哪里:5A 只是标称值,不是随便就能拿到
1.1 线性充电与开关充电的损耗账,算一遍就明白为什么要选它
很多人选型的时候看到"5A 充电"就下单了,却没算过这颗芯片在什么条件下才能跑到 5A。先把最基础的一笔账算清楚:假设你用一颗线性充电器给单节锂电充电,输入 5V,电池电压 3.7V,充电电流 2A,那么线性调整管上消耗的功率是 (5 - 3.7) × 2 = 2.6W,这 2.6W 全部变成热,一颗 SOT-23 封装的线性充电器根本扛不住,芯片会直接进入热调节,电流自动往下掉。这就是为什么大电流充电必须走开关方案。
BQ25895 采用的是同步 Buck 拓扑,效率在典型工况下能做到 90% 左右。同样 2A 充电,损耗从 2.6W 降到 0.3W 上下,差了一个数量级。这个差距不是靠"芯片更好"实现的,而是靠拓扑换来的——电感把能量一段一段地搬过去,而不是让调整管硬扛压差。
| 对比项 | 线性充电方案 | BQ25895 开关充电方案 |
|---|---|---|
| 5V 输入、3.7V 电池、2A 充电时的管耗 | 约 2.6W | 约 0.3W |
| 典型效率 | 74% 左右 | 90% 左右 |
| 是否需要电感 | 不需要 | 需要,且是关键的选型项 |
| EMI 表现 | 几乎无开关噪声 | 1.5MHz 开关频率,需要布局配合 |
| 封装散热压力 | 极高 | 中等,但依赖 PCB 散热 |
不过开关方案也不是白拿的。1.5MHz 的开关频率意味着 SW 节点上每秒有 150 万次的高 dv/dt 跳变,这就带来了 EMI、振铃、辐射这些问题,而这些问题的严重程度几乎完全取决于你的 PCB 布局。所以后面我会花很大篇幅讲布局,这不是凑字数,而是这颗芯片能不能用得稳的决定性因素。
1.2 输入电压、输入电流、充电电流、结温,四个约束谁先到顶
写软件的时候我们习惯性地认为"我配置了 5A 就是 5A",但在硬件世界里,实际充电电流永远是四个约束条件里最严格的那个决定的。
第一个约束是输入电压范围。BQ25895 的推荐工作输入范围覆盖 3.9V 到 14V,这个宽范围是为了兼容各种适配器,包括 5V 标准 USB、9V/12V 高压快充适配器。但要注意,输入电压高不等于充电快,因为在充电电流相同的情况下,输入电压越高,Buck 的占空比越小,开关损耗反而会上升。手册里还会给出绝对最大额定值,这个值是破坏性边界,任何时候都不能碰,输入端一定要做好浪涌抑制和过压保护。
第二个约束是输入电流限制。这是最容易被忽略的一项。一个标称 5V/2A 的适配器,实际能持续输出的电流往往只有 1.8A 左右,如果你把芯片的输入限流设成 3A,适配器输出电压会被直接拉塌,芯片检测到 VBUS 掉压后触发输入电流优化,来回震荡,表现出来的现象就是充电电流忽大忽小、适配器发烫。正确的做法是把输入限流设在适配器额定值的 80% 到 90%。
第三个约束才是充电电流。电池能接受多大电流,取决于电池本身的规格和当前的电量状态。绝大多数单节锂电的推荐充电倍率是 0.5C 到 1C,也就是说 3000mAh 的电池,持续充电电流在 1.5A 到 3A 之间比较稳妥。你就算把芯片配到 5A,电池也吃不消。
第四个约束是结温。这一条在夏天或者密闭外壳里最容易先到顶。芯片内部有热调节环路,结温超过阈值后会自动降低充电电流,这个过程是硬件自动完成的,软件读寄存器只能看到电流变小了,看不到"为什么变小"。所以调试的时候如果发现充电电流莫名其妙往下掉,先别怀疑寄存器,先摸一下板子温度。
我一般的做法是在固件里加一个周期性的状态轮询,把充电电流、电池电压、芯片温度(通过内部 ADC 或外接 NTC)一起记录下来,跑一次完整充电曲线,就能直观看出是哪个约束先到顶。这个数据比任何猜测都可靠。
1.3 WQFN 4×4 封装的散热天花板与降额策略
BQ25895 用的是 4mm × 4mm 的 WQFN 封装,底部有一块散热焊盘。这个封装的散热能力高度依赖 PCB,同样的芯片,焊盘下面打过孔和没打过孔,热阻能差一倍以上。
按照 90% 效率估算,5A 充电时输入功率大概是 3.7 × 5 / 0.9 ≈ 20.6W,损耗约 2W。如果整板热阻是 40°C/W,环境温度 25°C,结温就会到 105°C,已经接近很多应用的上限了;如果环境温度是 45°C,结温直接冲到 125°C,芯片就会频繁触发热调节。这就是为什么在真实产品里,5A 充电往往只能维持很短一段时间,之后就必须降额。
实用一点的降额策略是这样的:把充电电流按电池电压分段设置,电池电压低于 3.9V 时用较小的电流(比如 1A),3.9V 到 4.1V 之间用大电流(3A 到 4A),4.1V 以上再降回小电流。这样既保证了充电速度,又避免了在高温区长时间大电流工作。这个分段逻辑在固件里实现起来不复杂,但效果非常明显——我用这个策略把某款产品的表面温度从 52°C 压到了 44°C,用户手感完全不一样。
提示:散热焊盘的过孔不要只在正中间打几个,要沿着焊盘边缘均匀铺一圈,孔径 0.3mm、孔间距 1.0mm 左右,孔壁镀铜要实。这些小孔的总截面积决定了热量能不能顺利传到内层地平面。
2. 功率级内部结构:Buck、路径管理和 OTG 升压怎么共用一套管子
2.1 四管 Buck 的双向工作方式
要理解布局为什么这么讲究,得先知道芯片内部到底有什么。BQ25895 内部集成了四个功率 MOSFET,构成一个完整的同步 Buck 功率级:高边开关、高边续流管、低边开关、低边续流管。充电时,功率从 VBUS 流向电池;当芯片进入 OTG 模式时,这四个管子重新组合成一个 Boost 升压器,功率从电池反向流到 VBUS 引脚,对外输出 5V 给其他设备供电。
这个双向设计的好处是省了一套功率器件,成本低、体积小。代价是同一个 SW 节点既要承受 Buck 的开关应力,又要承受 Boost 的开关应力,布局上留给你的容错空间更小。SW 节点的寄生电感一旦偏大, Buck 模式下表现为振铃和效率下降,Boost 模式下表现为输出电压不稳、带载能力差。
还有一点值得注意:芯片内部并不是理想开关,管子有导通电阻,开关过程有交叠损耗。这就是为什么在同样的输入输出条件下,充电电流越大,效率曲线越往下掉。做热设计的时候,不能拿轻载效率去估算满载发热。
2.2 SYS 优先供电对后级系统意味着什么
BQ25895 支持路径管理,也就是 SYS 引脚的供电优先级高于电池充电。插上适配器后,适配器的能量优先供给系统负载,剩下的才拿去给电池充电;如果适配器功率不够,电池会通过内部通路补充缺口,保证系统不掉电。
这个机制对产品体验的影响非常大。想象一个带屏幕的便携设备,如果充电和开机同时进行,没有路径管理的方案会让电池一边充一边放,电池发热严重、寿命缩短;有路径管理的话,系统直接从适配器取电,电池只负责充电,温度会低很多,而且插拔适配器的瞬间系统电压不会跌落。
这里有个设计细节:SYS 引脚上的电容要足够大,一般建议 20uF 以上,且要靠近引脚放。系统负载突变的时候(比如屏幕背光打开、无线模块发射),SYS 电压会有一个瞬时跌落,如果电容不够,跌到系统最低工作电压以下就会复位。我在一个项目上就吃过这个亏,整机在做射频发射测试时偶发重启,查了很久才发现是 SYS 电容只放了 10uF,而且离芯片有 8mm 远。
2.3 PMID 这个引脚为什么总是被画错
PMID 是这颗芯片上最容易被误解的引脚。它不是输出,也不是简单的输入滤波点,而是内部高边开关和低边开关之间的一个中间节点,本质上和 SW 是同一类东西,只是位置在 Buck 的输入侧。
因为它是功率回路的中间节点,所以需要就近放足够的陶瓷电容来吸收开关电流的纹波。如果 PMID 电容放远了或者容量不够,输入侧的电流纹波会大幅增加,表现出来的现象是:输入限流环路不稳定、适配器发出啸叫、充电电流震荡。
常见的错误画法是:把 PMID 电容和 VBUS 电容合并放在一起,觉得"反正都是输入侧"。这是不对的,PMID 和 VBUS 之间隔着内部开关管,两个节点的电流波形完全不同,必须各自有独立的旁路电容,而且都要贴着引脚放。我的习惯是在 PMID 上放两颗 10uF 的 0805 陶瓷电容,VBUS 上再放一颗 10uF 加一颗 0.1uF,实际用下来纹波和稳定性都比较理想。
2.4 ICO 输入电流优化器解决了什么实际问题
市面上大量适配器都存在一个问题:标称 5V/2A,但你真拉到 2A 的时候,输出电压可能已经掉到 4.6V 了。如果芯片的输入限流设得比适配器实际能力高,就会反复触发"拉载—掉压—减载—升压"的震荡。
BQ25895 内部集成了一个输入电流优化器,能自动探测适配器的最大的输出能力,把输入限流动态调整到刚刚好的位置,既能榨干适配器的功率,又不会把它压垮。这个功能在固件里是可以使能的,实际用下来对兼容杂牌适配器很有帮助。
但它不是万能的。如果适配器的输出线太长、线径太细,线路阻抗大,优化器探测出来的能力会偏低,充电速度就上不去。所以做产品的时候,我给客户的建议是:要么标配短而粗的线缆,要么在固件里把输入限流手动设成一个保守值,牺牲一点充电速度换稳定性。这两种策略没有绝对的对错,看你的产品定位。
3. 外围选型:电感、电容、限流电阻的取值要自己算一遍
3.1 电感的纹波电流计算与饱和电流余量
电感是这颗芯片外围最关键的元件,选错了直接导致效率低、发热大、甚至烧管子。选型主要看三个参数:电感量、饱和电流、直流电阻。
电感量决定了纹波电流的大小。同步 Buck 的纹波电流计算公式是:
ΔI = Vout × (Vin - Vout) / (Vin × L × fsw) 其中: ΔI = 电感纹波电流峰峰值 (A) Vout = 输出电压,即电池电压 (V) Vin = 输入电压 (V) L = 电感量 (H) fsw = 开关频率,BQ25895 典型 1.5MHz (Hz)代入一组典型值:Vin = 5V,Vout = 3.7V,L = 1.5uH,fsw = 1.5MHz:
ΔI = 3.7 × (5 - 3.7) / (5 × 1.5e-6 × 1.5e6) = 4.81 / 11.25 ≈ 0.427A这个纹波很小,说明 1.5uH 在这个工况下是合理的。接下来算峰值电流:如果充电电流是 4A,那么电感峰值电流 = 4 + 0.427/2 ≈ 4.21A。所以电感的饱和电流至少要选到 6A 以上,留 40% 以上的余量。为什么留这么多?因为充电瞬间会有软启动过程、负载突变会有瞬态过冲、电池电压接近 0V 时占空比会很大,实际峰值可能超过稳态计算值。
直流电阻越低越好,一般选 20mΩ 以内。DCR 每增加 10mΩ,4A 充电时的额外损耗就是 0.16W,看起来不多,但在密闭外壳里累积起来很可观。屏蔽式电感优先,绕线裸露的会在 SW 节点附近形成天线效应,辐射测试容易超标。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 电感量 | 1.0uH - 2.2uH | 1.5uH 是最常用的折中值 |
| 饱和电流 | ≥ 6A(4A 充电场景) | 按峰值电流留 40% 余量 |
| 直流电阻 DCR | < 20mΩ | 影响满载效率 |
| 类型 | 屏蔽式贴片功率电感 | 降低辐射 |
| 位置 | 紧邻 SW 引脚 | 走线尽量短粗 |
3.2 陶瓷电容的直流偏压降额,纸上写着 10uF 实际只剩 3uF
这是我见过最多的翻车点。选型表上写着 10uF/16V 的 0603 陶瓷电容,看起来余量很大,实际上在高直流偏压下,它的有效容量可能只剩 30% 到 40%。
陶瓷电容的介质材料决定了这个特性。X5R、X7R 这类高介电常数的材料,容量密度高但直流偏压特性差;C0G 稳定性好但容量做不大。所以在电源滤波这种场合,我们不得不用 X5R 或 X7R,但必须查厂商提供的偏压曲线,而不是只看标称值。
我的经验做法是:标称容量按实际需要的 2 到 3 倍来选,同时用两颗并联替代一颗。比如需要 22uF 有效容量,我会选两颗 22uF 的 0805 并联,而不是一颗 47uF 的 1206。并联不仅提高了有效容量,还降低了 ESR 和 ESL,对高频纹波抑制更有利。
具体到 BQ25895 这几个位置:
| 位置 | 标称容量建议 | 封装 | 关键要求 |
|---|---|---|---|
| VBUS 输入 | 10uF + 0.1uF | 0805 + 0402 | 抗浪涌,靠近引脚 |
| PMID | 2 × 10uF | 0805 | 吸收开关纹波,必须就近 |
| SYS 输出 | 2 × 22uF | 0805 | 保证负载突变时电压跌落可控 |
| BAT | 10uF | 0805 | 靠近电池引脚 |
| REGN | 4.7uF | 0603 | 内部 LDO 输出,稳压用 |
| BTST | 0.047uF - 0.1uF | 0402 | 自举电容,必须贴近 SW 和 BTST |
| SYS 到 BAT 之间 | 可选 0.1uF | 0402 | 抑制高频耦合 |
注意:BTST 电容虽然小,但位置极其关键。它和 SW、BTST 两个引脚之间的回路面积必须尽可能小,走线长度控制在 2mm 以内。这个回路面积大了,高边驱动会失效,表现是高占空比下充电电流突然掉到零。
3.3 ILIM 电阻与 I2C 限流寄存器谁说了算
BQ25895 提供了两条设置输入限流的路径:硬件 ILIM 引脚上的电阻,和 I2C 的限流寄存器。
硬件 ILIM 的作用是提供一个安全上限。即使固件还没来得及初始化、或者 I2C 通信出故障,硬件上的限流电阻也会把输入电流限制在一个安全值,防止把适配器拉死或者把输入线路烧掉。这个设计思路很实在——软件会跑飞,硬件不会。
I2C 的限流寄存器则是在硬件上限之内做精细调节。寄存器可以按 50mA 的步进设置,范围从 100mA 到 3250mA 左右(具体范围以手册为准)。实际调试时,我一般先用 ILIM 电阻设一个"绝对不炸"的上限,比如 2A,然后在固件里根据适配器识别结果把寄存器值调到合适的档位。
ILIM 电阻的计算遵循手册给出的公式。假设要设定 2A 的硬件限流,按照典型的比例系数代入,算出来大概是几十 kΩ 量级。这里我不写死具体数字,因为不同批次的芯片、不同的采样方式可能略有差异,建议直接用手册里的公式算,算完再实测验证。
实测验证的方法很简单:用一个可调电子负载代替电池(注意要模拟电池电压),逐步加大负载电流,观察 VBUS 电压开始明显下跌的那个点,就是实际生效的限流值。如果这个值和设计值偏差超过 15%,就要检查电阻精度和 Layout 上的采样干扰。
4. 寄存器配置:一条从冷启动到稳定恒流充电的写入序列
4.1 上电默认值里藏着哪几个坑
芯片上电后寄存器是有一组默认值的,这组默认值能让芯片"跑起来",但绝不适合直接量产。我踩过的坑主要有这么几个:
看门狗定时器默认开启。芯片内部有一个看门狗,如果固件在一定时间内没有写特定寄存器,芯片会认为主机挂了,把充电参数复位成默认值。这个机制本意是好的,但如果你的固件初始化流程比较长,或者主控有低功耗休眠,很容易误触发,表现出来就是"充电几秒钟后电流突然变小"。要么在初始化时关掉看门狗,要么在固件里做周期性的喂狗。
充电电压默认值不一定匹配你的电池。不同厂家的电芯,满充电压可能是 4.2V、4.35V、4.4V,默认值通常按 4.2V 附近设置。如果你的电池是 4.35V 的,用默认值充不满;反过来,如果你的电池是 4.2V 的,把电压设成 4.35V,那就是在给电池过充,寿命和安全性都会出问题。这一项必须在固件里明确写死。
充电电流默认值偏保守。默认值通常在一两千毫安,如果你的产品设计目标是快充,必须显式改。
OTG 模式默认关闭,且 OTG 输出电流限制需要单独配置。如果需要对外供电,除了使能 OTG,还要设置好输出电流上限,否则带容性负载启动时容易触发保护。
4.2 可复用的初始化流程与代码骨架
我把初始化流程整理成了一条固定的顺序,这套顺序在几个项目上用下来比较稳:先确认通信、再关看门狗、然后是输入限流、充电参数、最后使能充电。顺序不能乱,尤其是"最后使能充电"这一条——先把所有参数写对了再开充电,可以避免上电瞬间用错误参数充电。
/* BQ25895 初始化骨架 * 说明:寄存器地址与位定义请以对应版本的数据手册为准, * 以下代码只展示流程结构与常见配置项。 */ #define BQ25895_I2C_ADDR 0x6B /* 7 位地址,以手册为准 */ /* 寄存器地址(示例) */ #define REG00_INPUT_SRC 0x00 /* 输入源控制:HIZ、ILIM、IINLIM */ #define REG01_PWR_PATH 0x01 /* 充电使能、OTG、看门狗 */ #define REG03_SYS_VOLT 0x03 /* 系统电压调节 */ #define REG04_CHG_CURRENT 0x04 /* 充电电流设置 */ #define REG05_PRE_TERM 0x05 /* 预充电流、终止电流 */ #define REG06_CHG_VOLTAGE 0x06 /* 充电电压设置 */ #define REG07_TERM_TIMER 0x07 /* 终止使能、安全定时器 */ #define REG0C_FAULT 0x0C /* 故障状态 */ #define REG14_DEV_REV 0x14 /* 器件版本 */ typedef enum { BQ_OK = 0, BQ_ERR_I2C, BQ_ERR_VERIFY, } bq_status_t; static bq_status_t bq_write_reg(uint8_t reg, uint8_t val) { /* 具体 I2C 读写实现依平台而定 */ if (i2c_write(BQ25895_I2C_ADDR, reg, &val, 1) != 0) { return BQ_ERR_I2C; } return BQ_OK; } static bq_status_t bq_update_bits(uint8_t reg, uint8_t mask, uint8_t val) { uint8_t tmp = 0; if (i2c_read(BQ25895_I2C_ADDR, reg, &tmp, 1) != 0) { return BQ_ERR_I2C; } tmp = (tmp & ~mask) | (val & mask); return bq_write_reg(reg, tmp); } bq_status_t bq25895_init(void) { uint8_t rev = 0; /* 1. 通信自检:读器件版本寄存器 */ if (i2c_read(BQ25895_I2C_ADDR, REG14_DEV_REV, &rev, 1) != 0) { return BQ_ERR_I2C; } /* 2. 关闭看门狗,关闭 OTG,暂不使能充电 */ bq_update_bits(REG01_PWR_PATH, 0xCF, 0x00); /* 3. 配置输入限流(寄存器值需按 50mA 步进换算) */ bq_update_bits(REG00_INPUT_SRC, 0x3F, BQ_IINLIM_CODE); /* 4. 配置充电电压(按 16mV 步进换算,务必匹配电芯满充电压) */ bq_update_bits(REG06_CHG_VOLTAGE, 0xFC, BQ_VREG_CODE); /* 5. 配置充电电流(按 64mA 步进换算) */ bq_update_bits(REG04_CHG_CURRENT, 0x7F, BQ_ICHG_CODE); /* 6. 配置预充电流与终止电流 */ bq_update_bits(REG05_PRE_TERM, 0xFF, BQ_PRE_TERM_CODE); /* 7. 使能终止检测,设置安全定时器 */ bq_update_bits(REG07_TERM_TIMER, 0xFF, BQ_TERM_TIMER_CODE); /* 8. 全部参数配置完成后,再使能充电 */ bq_update_bits(REG01_PWR_PATH, 0x10, 0x10); return BQ_OK; }这段代码里有几个地方值得单独说明。第 2 步里我先清掉了一批控制位,包括看门狗和 OTG,这是为了让芯片进入一个确定的状态,避免上一次运行残留的配置影响本次初始化。第 3 到第 7 步全是参数配置,每一步都读-改-写,保证不会误伤同一寄存器里的其他位。第 8 步才使能充电,这个顺序很重要。
还有一点:bq_update_bits里的读-改-写操作,在有多主设备或者中断里也会写寄存器的场景下会有竞争风险。如果你的系统里有中断服务程序需要动态调整充电参数,要么加互斥锁,要么干脆把动态调整统一放到主循环里做。
4.3 JEITA 温区与充电电压的配合
JEITA 是一套锂电池温度分区充电规范,思路很简单:温度低的时候不能用大电流充(锂离子在低温下嵌入负极的速度慢,大电流会导致析锂,这是安全隐患),温度高的时候要降低充电电压(防止高温高压同时作用加速老化)。
BQ25895 内部支持温区管理,可以通过外接 NTC 热敏电阻采集电池温度,也可以由主控通过 I2C 把温度值写进去。温区的阈值和每个温区内的电流、电压参数都是可配置的。
实际项目里我的配置习惯是:
| 温区 | 电池温度范围 | 充电电流 | 充电电压 |
|---|---|---|---|
| 低温保护 | < 0°C | 禁止充电 | — |
| 低温降流 | 0°C - 10°C | 0.2C 以下 | 满充电压 |
| 常温 | 10°C - 45°C | 正常大电流 | 满充电压 |
| 高温降压 | 45°C - 60°C | 降流 | 降低 50mV - 100mV |
| 高温保护 | > 60°C | 禁止充电 | — |
这套参数不是拍脑袋定的,而是结合电芯厂商的规格书和实际温升测试调出来的。不同的电芯差异很大,有的电芯允许 45°C 高温满压充,有的到 40°C 就要求降压。千万不要直接抄别人的参数表,一定要拿你自己的电芯做温箱测试。
还有一点容易被忽略:NTC 的贴放位置。NTC 必须贴在电池本体上或者紧贴电池的连接器附近,如果贴在 PCB 上离电池很远,测到的是板子温度而不是电池温度,温区管理就形同虚设。我见过一个设计把 NTC 放在芯片旁边,结果芯片自己发热,把 NTC 烤到 50°C,系统一直以为电池过热,充电电流永远上不去。
4.4 回读校验与故障寄存器的读法
写完寄存器一定要回读。这不是不信任 I2C 总线,而是实际工程里 I2C 通信受干扰、从设备忙、上电时序不对导致写失败的情况太常见了。回读校验的成本很低,几行代码的事,但能省掉大量现场排查时间。
故障寄存器的读法有个技巧:故障位大多是锁存型的,读一次就清零。这意味着如果你在调试的时候用调试器随手读了一下故障寄存器,故障信息就消失了,后面再想查就查不到。所以固件里应该有一个"故障快照"机制——检测到中断或者周期性轮询到异常时,第一时间把故障寄存器和关键状态寄存器一起读出来存到非易失存储里,供事后分析。
我一般会记录这么几项:VBUS 状态、充电状态机当前状态、故障寄存器原始值、输入限流实际生效值、芯片温度 ADC 值、电池电压 ADC 值。有了这几个数据,绝大多数现场问题都能远程定位。
5. 布局落地:环路面积、地分割和热焊盘的具体做法
5.1 大电流路径的物理顺序
布局这件事,说到底就是一句话:让大电流走最短、最宽、回路面积最小的路径。BQ25895 的功率回路可以拆成两段来看。
第一段是输入回路:VBUS → 输入电容 → PMID 电容 → 内部高边开关 → SW → 电感 → SYS 输出电容 → 回到 PGND。这段回路的电流是脉冲状的,di/dt 很高,环路面积直接决定了辐射发射和振铃幅度。
第二段是电池回路:SYS → 内部开关 → BAT → 电池电容 → 回到 PGND。这段电流相对平缓,但幅值大,主要影响直流压降和发热。
正确的元件排列顺序应该是:连接器 → VBUS 电容 → 芯片 VBUS 引脚 → 芯片 PMID 引脚 → PMID 电容 → 电感 → SYS 电容 → 电池连接器。整个路径上不要有分叉,不要让大电流从芯片底下穿过去再绕回来。
我见过最典型的一个错误布局是:输入电容放在板子边缘靠近连接器的位置,芯片在中间,两者之间隔了 15mm 的细走线。结果就是输入电容形同虚设,高频纹波电流只能从更远的电源平面绕,SW 波形上振铃峰峰值超过 3V,效率掉了 6 个百分点。
5.2 输入电容和 BTST 电容的位置关系
在所有电容里,优先级最高的是 BTST 电容,其次是 PMID 电容,然后是 VBUS 和 SYS 电容。
BTST 电容连接的是 BTST 引脚和 SW 引脚,它是高边驱动器的自举电容。这两个引脚之间的回路必须极小,走线长度控制在 2mm 以内,中间不要打孔换层。如果这个回路面积大了,寄生电感会在开关瞬间产生很高的电压尖峰,轻则效率下降,重则击穿高边驱动电路。
PMID 电容的位置同样关键,它要贴着 PMID 引脚放,另一端的接地要就近打到 PGND,不要绕到远处的系统地。VBUS 电容稍微宽松一点,但也不能超过 5mm。
SYS 电容的摆放要注意一点:如果 SYS 后面接的是负载开关或者 DC-DC,SYS 电容应该放在两者之间靠近负载的一侧,而不是紧贴芯片。因为 SYS 电容的主要作用是应对负载突变,离负载越近效果越好。
5.3 SW 铜皮面积的取舍
SW 节点的铜皮面积是一个需要权衡的地方。面积太小,导通电阻大、发热多;面积太大,它就是一个高效的辐射天线,EMI 测试容易挂。
我的经验值是:SW 铜皮面积控制在能够承载 4A 到 5A 电流的前提下尽量小,一般宽度和电感焊盘相当即可,长度刚好连接芯片 SW 引脚和电感。绝对不要在 SW 节点上铺大面积铜皮,也不要在 SW 下面铺地平面——这会形成一个大寄生电容,增加开关损耗。
如果 EMI 测试过不了,可以在 SW 节点上串一个小阻值的缓冲电阻加电容到地,做成 RC 吸收网络。但这会损失一点效率,属于最后手段,优先还是靠缩小环路面积来解决。
5.4 热焊盘过孔阵列与地平面
BQ25895 底部的散热焊盘是主要的散热通道。这块焊盘必须完整地焊在 PCB 焊盘上,焊盘下面打过孔阵列连到内层地平面。
过孔的具体做法:
| 参数 | 建议值 | 说明 |
|---|---|---|
| 过孔孔径 | 0.3mm | 太小的孔电镀不良,散热效果差 |
| 过孔数量 | 9 到 16 个 | 按焊盘尺寸均匀分布 |
| 孔间距 | 1.0mm 左右 | 避免焊接时锡膏流失过多 |
| 处理方式 | 孔壁镀铜,可做塞孔 | 防止焊接时锡从孔里漏走 |
| 连接层 | 至少连接到一层完整地平面 | 内层地平面要完整,不能有割裂 |
有一点要特别注意:过孔如果做成通孔且不塞孔,回流焊的时候散热焊盘上的锡膏会顺着孔流走,导致虚焊。这个虚焊在出厂测试时可能测不出来,到了客户端经受过热循环之后才暴露,表现为充电电流上不去、芯片异常发热。所以量产板上,散热焊盘的过孔要么做塞孔,要么做背面阻焊覆盖。
5.5 电流检测与 I2C 信号的走线隔离
BQ25895 有一路电流相关的信号需要关注:输入电流的检测是通过内部电路完成的,但外部 ILIM 电阻的走线要尽量短,避免被 SW 节点的噪声耦合。
I2C 的 SCL 和 SDA 属于低速信号,但它们对噪声很敏感,尤其是在 SW 节点附近走线的时候。我的做法是:I2C 走线远离 SW 和电感至少 3mm,如果实在避不开,中间加一根地线做隔离。上拉电阻放在主控一侧,不要放在芯片一侧,这样可以避免上拉电阻的走线成为天线。
还有一条经验:I2C 的走线不要和电池的充放电大电流路径平行走太长距离。平行走线会形成容性耦合,大电流突变时会在 I2C 线上感应出毛刺,导致通信误码。如果必须平行,中间一定要有地线隔开。
6. 联调排障:从波形倒推问题的完整链路
6.1 充电电流上不去的三层排查
这是最高频的问题。我的排查顺序是固定的三层,从外到内。
第一层:看输入。用示波器同时测 VBUS 电压和输入电流(可以用电流探头,或者串一个采样电阻)。如果 VBUS 电压在充电时明显下跌,说明输入限流设高了或者适配器能力不足。如果 VBUS 上有大幅度的低频波动,说明输入电流优化器在震荡。这一层排完,能解决六成以上的问题。
第二层:看温度。读芯片的结温或者用热像仪看板子。如果温度已经超过 60°C,那就是热调节在工作,充电电流被自动限制了。这时候要检查散热焊盘的过孔、SYS 和 BAT 的电容是否足够、电感的 DCR 是不是偏大。
第三层:看配置。回读所有相关寄存器,确认充电电流、输入限流、充电电压都写进去了,而且没有被看门狗复位。同时读一下充电状态机,看看是不是停在预充阶段或者终止阶段。
我在一个项目上遇到过最诡异的一次:充电电流稳定在 500mA,无论怎么改寄存器都不变。三层都查了,输入正常、温度不高、寄存器值正确。最后发现是电池连接器的接触电阻太大,芯片检测到的电池电压偏高,误判为接近满充,进入了恒压阶段。换了一个连接器就好了。这个案例说明,排查的时候不能只看芯片周围,整条链路都要看。
6.2 SW 振铃与效率偏低
SW 节点振铃是布局问题的直接体现。正常的 SW 波形应该是干净的方波,上升沿和下降沿有一点过冲和振铃是正常的,但振铃峰峰值不应该超过输入电压的 20%,而且应该在两三个周期内衰减完。
如果振铃很大且衰减很慢,说明回路里的寄生电感和寄生电容形成了欠阻尼振荡。处理方向有三个:
- 缩小功率回路面积,特别是输入电容到 PMID、到 PGND 的回路;
- 检查电感的选型,饱和电流不足的电感在大电流下电感量会骤降,导致纹波电流暴增;
- 检查 SW 节点是否有多余的铜皮或者测试点,这些都会增加寄生电容。
效率偏低的原因则要分情况看。轻载效率低,通常是开关损耗占比大,属于正常现象;满载效率低,优先查电感的 DCR 和开关管的导通损耗,前者靠换料,后者只能靠降额或者改善散热。
6.3 I2C 无应答
I2C 完全没应答,先确认三件事:地址对不对、上拉电阻有没有、芯片有没有供电。
地址这一项看起来简单,实际上很容易出错。7 位地址和 8 位地址的表示方式不同,很多代码库里用的是 8 位地址(左移一位后的值),如果你按 7 位地址传进去,实际发出去的地址就错了。建议在代码里统一用一种表示方式,写清楚注释。
上拉电阻的阻值也要注意。2.2kΩ 到 10kΩ 是常见范围,具体看总线电容和速率。上拉太弱,上升沿变缓,高速率下会误码;上拉太强,低电平灌电流大,可能超过从设备的驱动能力。
还有一种情况是芯片处于 HIZ 模式(高阻态),这时候部分内部电路是关闭的,I2C 可能不响应。检查一下是不是有引脚配置导致芯片进入了休眠。
6.4 OTG 起不来或者带不动负载
OTG 模式起不来,先看使能位写了没有,再看电池电压够不够。很多芯片在电池电压低于某个阈值时会禁止 OTG 输出,防止电池过放。这个阈值一般是可配置的,如果你的产品需要在低电量时也能对外供电,要显式改这个配置。
带不动负载的表现是:空载时输出电压正常,一接负载电压就掉下去,甚至直接关闭输出。原因通常是 OTG 的输出电流限制设得太小,或者电池内阻太大、电池电压在大电流下被拉塌。
这里有个细节:OTG 升压是从电池取电的,如果电池本身电量低、内阻大,就算芯片能力足够,输出也撑不住。测试的时候要用一个内阻小的稳压源代替电池,先把芯片本身的能力验证清楚,再去看电池的影响。
另外,OTG 输出端的电容也很关键。容性负载启动时会有很大的浪涌电流,如果输出电容太小,启动瞬间电压跌落会触发欠压保护。建议在 OTG 输出端放 22uF 以上的电容,并且用软启动的方式逐步加载。
最后分享几个我在实际项目里总结出来的小习惯。第一,画原理图的时候就把关键节点的测试点留好,VBUS、PMID、SW、SYS、BAT 各留一个,0402 的焊盘就行,调试的时候能省下大量找点的时间。第二,第一次打样一定要做一块"裸板",也就是只焊芯片和必要的外围,不带其他负载电路,先把充电功能单独验证通过,再上整机。第三,把充电曲线完整记录下来存成数据文件,不同批次、不同电芯、不同温度下都跑一遍,这些数据在后期做失效分析的时候价值极高。这颗芯片本身不算难用,难的是把它的边界条件摸清楚,而摸清楚边界条件的唯一办法,就是老老实实做测试、记数据。