TI BQ25155电池管理芯片:从原理到实战的全面解析
1. 芯片概览与核心价值
在折腾各种便携式设备、物联网节点或者可穿戴产品时,电源管理这块“硬骨头”总是绕不开的。你得考虑怎么给电池安全高效地充电,怎么在有限的板子空间里塞下所有必要的保护电路,还得让主控能随时知道电池还剩多少“血条”。早年这些功能可能得靠一堆分立元件和运放搭出来,不仅占地方,调试起来也头疼。现在好了,像德州仪器(TI)的BQ25155这类高度集成的电池管理芯片(BMC),算是把工程师从这些繁琐工作中解放出来了。它把线性充电器、高精度监测ADC、可配置的LDO,甚至按键唤醒和复位逻辑,全都塞进了一个小小的封装里。
BQ25155的核心,是一个支持最大500mA充电电流的单节锂离子电池线性充电器。别小看“线性”二字,在对于噪声敏感或者空间极其紧凑的应用里,比如某些医疗传感器或者高精度测量设备,线性充电方案相比开关式充电器,产生的电磁干扰(EMI)更小,外围电路也更简单,通常只需要几个电容电阻。更重要的是,它的一切几乎都可以通过那根常见的I2C总线来配置和读取。充电电流、截止电压、预充电流、温度保护阈值……你都能在代码里动态调整。它内部还集成了一个16位的ADC,能让你精确读取输入电压、电池电压、充电电流甚至外部ADCIN引脚上的电压,相当于给系统装上了“眼睛”。再加上输入过压保护、安全定时器、电池过流保护等一系列“保镖”功能,它确实为单节锂电池应用提供了一个相当省心且功能全面的解决方案。无论是想快速做出一个原型,还是在大批量产品中追求极致的可靠性和灵活性,这颗芯片都值得你花时间深入了解。
2. 功能架构深度解析
要玩转一颗芯片,光看参数列表可不够,得先把它肚子里那点“门道”搞清楚。BQ25155的功能框图虽然看起来线条不少,但捋顺了其实逻辑很清晰。我们可以把它想象成一个智能的能源调度中心。
2.1 能源输入与路径管理
整个芯片的能源入口是VIN引脚,通常接5V的USB电源或者适配器。电流从这里进来,首先会经过一对背对背的隔离MOSFET(Q7, Q8)。这对管子作用很大:一是防止PMID系统端的电压倒灌回VIN,比如你拔掉USB但系统还在运行时;二是它们构成了输入电流限制(IINLIM)环路的一部分,防止从适配器“抽”太多电流导致其电压被拉垮。
电流通过隔离管后,来到一个关键的枢纽点——PMID。这个PMID引脚就是整个系统的供电母线,你的主控MCU、传感器、屏幕等所有负载都挂在这上面。BQ25155的“Power Path”管理精髓就在这里:系统负载的供电优先级永远高于给电池充电。只要VIN有电,系统就由VIN供电,同时富余的电流才用于给电池充电。一旦VIN掉电(或者被拔掉),如果电池电压高于欠压锁定阈值(VBATUVLO),那么PMID会无缝切换到由电池供电,你的系统完全感觉不到“断电”,实现了真正的“无间断”供电。这个特性对于用户体验至关重要,想象一下你的智能手表正在同步数据,这时拔掉充电器,如果系统重启了,那得多恼火。
2.2 线性充电器的控制环路“合唱团”
给电池充电可不是简单地灌电流,它由好几个控制环路像合唱团一样协同工作,最终由“声部”最高的那个主导。理解这几个环路,是配置好充电参数的关键:
- 恒流(CC)环路:这是主唱。当电池电压较低时(低于
VBATREG - 50mV),它努力将充电电流维持在你通过I2C设定的ICHARGE值(最大500mA)。 - 恒压(CV)环路:当电池电压接近设定的调节电压
VBATREG(比如4.2V)时,这位“女高音”开始凸显。它会逐渐减小电流,使电池电压稳定在VBATREG,直到电流下降到终止电流ITERM。 - 输入电压动态电源管理(VINDPM)环路:这是个保护性的“和声”。如果你的USB电源质量不好,带载后电压会下降。VINDPM的作用就是防止
VIN电压跌落到设定的VIN_DPM阈值(比如4.5V)以下。一旦触发,它会主动降低从VIN抽取的电流(也就是降低充电电流),来保住VIN的电压,避免系统因输入电压过低而反复重启。这个功能默认是关闭的,需要时可通过I2C开启。 - 动态电源路径管理(DPPM)环路:这是协调系统负载和充电的“指挥”。当系统负载突然变大(比如屏幕点亮、无线模块发射),导致
PMID电压有下降趋势时,DPPM环路会介入,优先保障系统供电,降低甚至切断充电电流,确保PMID电压不会掉到VBAT + 200mV以下。如果负载大到把充电电流降到零后PMID还在跌,电池甚至会进入“补充模式”,反向给系统供电。 - 热调节环路:芯片自己的“健康监测员”。当芯片结温(TJ)超过设定的调节温度
TREG时,它会按比例降低充电电流,防止芯片过热损坏。
实操心得:在实际调试中,经常遇到充电电流达不到设定值的情况。这时候别慌,大概率是其他环路“抢了麦克风”。首先应该通过I2C读取状态寄存器,看看是
VINDPM、DPPM还是THERMAL_REG标志位被置起了。比如,如果你用一根很长的劣质USB线,线损导致VIN端电压只有4.7V,而你的VIN_DPM设成了4.8V,那么VINDPM环路就会一直起作用,限制充电电流。解决办法要么换更好的电源和线缆,要么根据实际情况适当调低VIN_DPM阈值。
2.3 数字大脑:I2C与ADC子系统
如果说模拟电路部分是芯片的“身体”,那I2C接口和配置寄存器就是它的“大脑”。所有可编程功能都通过I2C实现。这里重点提一下ADC和看门狗。
16位ADC是这个芯片的亮点之一。它能测量VIN、PMID、VBAT、TS(温度检测)、ADCIN以及输入电流IIN和充电电流百分比。精度足够让你做很多事,比如精确计算电池剩余容量(SoC),或者通过ADCIN外接一个光敏电阻来感知环境光。
ADC有两种工作模式,理解它们对低功耗设计很重要:
- VIN供电时:ADC像永动机一样,以大约250ms每通道的周期循环测量所有参数,数据随时可读,但不会每次转换都产生中断打扰主机。
- 电池供电时(Active Battery Mode):为了省电,ADC可以配置为手动启动转换,或者以很低的速率(如每10秒一次)自动采样。在低功耗模式(Low Power Mode)下,ADC则完全关闭。
注意事项:I2C看门狗定时器(Watchdog Timer)是个需要留意的功能。它默认是开启的,大约50秒超时。如果超时前主机没有通过I2C访问芯片(任何读写操作都行),芯片会把所有关键的充电参数寄存器(如
ICHARGE,VBATREG等)重置为默认值!这可能会导致充电电流突然改变,甚至停止充电。如果你的系统有长时间休眠的需求,务必在初始化时通过I2C禁用这个看门狗,或者在休眠前确保最后一次I2C操作在50秒内。
3. 核心功能配置与实操指南
数据手册读起来总是很抽象,我们把它落到具体的代码和电路操作上。假设我们现在要为一个3.7V/500mAh的锂聚合物电池设计充电管理,目标充电电流300mA,截止电压4.2V。
3.1 硬件设计要点与外围电路
虽然BQ25155集成度高,但几个关键的外围元件选择直接影响性能和可靠性。
- 输入电容(CIN):必须靠近芯片的
VIN和GND引脚放置。通常一个10µF的陶瓷电容(X5R或X7R材质)就足够了。它的作用是滤除电源线上的高频噪声,并为瞬间的大电流需求提供缓冲。 - 电池端电容(CBAT):同样需要靠近
BAT引脚。典型值也是10µF。它用于稳定电池端的电压,特别是在脉冲负载场景下。 - 系统输出电容(CPMID):连接在
PMID和地之间。这个电容容量可以稍大,如22µF,用于应对系统负载的瞬时变化,保持PMID电压稳定。 - LDO/Load Switch输入电容(CVINLS):如果使用了内部的LDO或负载开关功能,必须在
VINLS引脚就近放置一个至少1µF的陶瓷电容,用于抑制电压跌落和瞬态干扰。 - 温度检测(TS):这是实现JEITA温度保护的关键。你需要一个10kΩ的NTC(负温度系数)热敏电阻,将其与一个10kΩ的精密分压电阻串联在
VDD(约1.8V)和地之间,热敏电阻靠近电池,其分压点连接到芯片的TS引脚。芯片内部会测量TS引脚电压,对应不同的温度区间(冷、凉、正常、暖、热)来调整充电电流和电压。
踩过的坑:陶瓷电容的直流偏压效应。你选了个10µF/10V的0603封装的陶瓷电容,但实际工作在5V时,它的有效容值可能只剩下6-7µF。在空间允许的情况下,尽量选择额定电压更高(如16V或25V)的电容,或者并联两个电容来保证有效容值。这点在
CPMID上尤其重要,系统负载突变时,如果电容实际值不足,可能导致PMID电压瞬间跌落,触发欠压复位。
3.2 I2C通信与寄存器配置实战
我们以常用的微控制器(如STM32)为例,演示如何初始化BQ25155。假设I2C地址为0x6B(默认地址,取决于ADDR引脚电平)。
// 首先,基本的I2C写函数(伪代码) bool BQ25155_WriteRegister(uint8_t reg_addr, uint8_t value) { return I2C_Write(BQ25155_ADDR, reg_addr, &value, 1); } // 1. 初始化步骤:先关闭看门狗! bool BQ25155_Init(void) { // 写入 Charger Control 1 寄存器 (地址 0x01),禁用看门狗,使能充电 // BIT7: WATCHDOG_DIS = 1 (禁用看门狗) // BIT6: CHARGE_DISABLE = 0 (使能充电) // 其他位保持默认(如安全定时器使能等) if (!BQ25155_WriteRegister(0x01, 0x80)) return false; // 写入 0x80 (1000 0000b) // 2. 配置充电参数 // 假设我们需要:充电电流300mA,预充电流50mA,终止电流10mA // 充电电流寄存器 (0x02): ICHARGE = (300mA / 5mA) = 60 = 0x3C if (!BQ25155_WriteRegister(0x02, 0x3C)) return false; // 预充电/终止电流寄存器 (0x03): // 高4位: IPRECHG = (50mA / 5mA) = 10 = 0xA // 低4位: ITERM = (10mA / 5mA) = 2 = 0x2 // 所以写入值 = (0xA << 4) | 0x2 = 0xA2 if (!BQ25155_WriteRegister(0x03, 0xA2)) return false; // 3. 配置电池电压和低压阈值 // 电池电压寄存器 (0x04): VBATREG = 4.2V // 公式: VBATREG = 3.504V + (CODE * 16mV) // CODE = (4200mV - 3504mV) / 16mV ≈ 43.5 -> 取44 (0x2C) if (!BQ25155_WriteRegister(0x04, 0x2C)) return false; // 低压阈值寄存器 (0x05): VLOWV = 3.0V (预充转快充的阈值) // 公式: VLOWV = 2.4V + (CODE * 80mV) // CODE = (3000mV - 2400mV) / 80mV = 7.5 -> 取8 (0x08) if (!BQ25155_WriteRegister(0x05, 0x08)) return false; // 4. 配置PMID输出电压(可选,但推荐设置) // PMID电压应至少比VBATREG高200mV,这里设为4.6V // PMID_VOLTAGE寄存器 (0x0B): 4.6V // 公式: VPMID = 3.8V + (CODE * 100mV) // CODE = (4600mV - 3800mV) / 100mV = 8 (0x08) if (!BQ25155_WriteRegister(0x0B, 0x08)) return false; // 5. 配置LDO输出电压(如果使用) // 假设我们启用LDO,输出3.3V给外围电路 // LDO Control寄存器 (0x0C): // BIT7: EN_LS_LDO = 1 (使能) // BIT6: LS_SWITCH_CONFG = 0 (LDO模式) // BIT5-0: LS_LDO_CODE, 3.3V = (3300mV - 600mV) / 100mV = 27 = 0x1B // 写入值 = (1<<7) | (0<<6) | 0x1B = 0x80 | 0x1B = 0x9B if (!BQ25155_WriteRegister(0x0C, 0x9B)) return false; // 6. 配置JEITA温度保护(强烈建议启用) // NTC Control寄存器 (0x0D): 启用JEITA,设置热/冷区域电流比例 // BIT7: JEITA_EN = 1 // BIT6-5: TS_ICHRG (热区电流比例) = 01 (50%) // BIT4-3: TS_VCHRG (热区电压) = 01 (4.06V) // BIT2-1: TS_ICHRG_COLD (冷区电流比例) = 01 (20%) // BIT0: TS_VCHRG_COLD (冷区电压) = 0 (保持4.2V,或根据BIT4-3) // 写入值 = (1<<7) | (0x1<<5) | (0x1<<3) | (0x1<<1) = 0x80 | 0x20 | 0x08 | 0x02 = 0xAA // 注意:这里是一个示例配置,具体阈值需根据你的NTC型号和需求计算。 if (!BQ25155_WriteRegister(0x0D, 0xAA)) return false; return true; }3.3 状态监控与故障读取
配置好之后,系统运行中需要定期轮询或通过中断来获取芯片状态。/INT引脚可以配置为在多种事件(如充电完成、故障、按键唤醒等)发生时触发低脉冲。
// 读取主要状态寄存器 uint8_t BQ25155_ReadStatus(void) { uint8_t status; I2C_Read(BQ25155_ADDR, 0x00, &status, 1); // 状态寄存器1地址 0x00 return status; } // 解析状态 void Handle_Charge_Status(uint8_t status) { if (status & 0x08) { // BIT3: CHARGE_DONE printf("充电完成!\n"); } if (status & 0x04) { // BIT2: CHARGE_FAULT printf("充电故障!\n"); // 需要进一步读取FAULT寄存器(0x0E, 0x0F, 0x10)来确定具体故障 uint8_t fault1, fault2, fault3; I2C_Read(BQ25155_ADDR, 0x0E, &fault1, 1); I2C_Read(BQ25155_ADDR, 0x0F, &fault2, 1); I2C_Read(BQ25155_ADDR, 0x10, &fault3, 1); if (fault1 & 0x80) printf(" - 输入过压(OVP)\n"); if (fault3 & 0x04) printf(" - 安全定时器超时\n"); // ... 解析其他故障位 } if (status & 0x02) { // BIT1: BAT_PRESENT printf("电池在位。\n"); } if (status & 0x01) { // BIT0: PG_STAT (Power Good) printf("输入电源正常。\n"); } } // 读取电池电压(通过ADC) uint16_t BQ25155_ReadVBAT(void) { uint8_t adc_data[2]; // 1. 设置ADC通道为VBAT (通道代码为0x03) BQ25155_WriteRegister(0x11, 0x03); // ADC_CTRL0寄存器 // 2. 启动单次转换(假设在电池供电手动模式) BQ25155_WriteRegister(0x11, 0x03 | (1<<3)); // 设置ADC_CONV_START位 // 3. 等待转换完成(可以轮询ADC_READY标志,或等待一段时间) delay_ms(10); // 简单延时,实际应用建议用中断或轮询状态位 // 4. 读取ADC结果(16位,分两个寄存器) I2C_Read(BQ25155_ADDR, 0x12, &adc_data[0], 2); // 0x12为ADC_DATA_L uint16_t adc_value = (adc_data[1] << 8) | adc_data[0]; // 5. 转换为电压值 (根据数据手册公式) // VBAT = (ADC_VALUE / 65536) * 6.0V float voltage = (adc_value / 65536.0) * 6.0; return (uint16_t)(voltage * 1000); // 返回毫伏值 }4. 高级功能与保护机制详解
BQ25155的“智能”不仅体现在可编程性上,更体现在一系列周全的保护机制上,这些是产品稳定可靠运行的基石。
4.1 全面的保护功能解析
输入过压保护(OVP):阈值固定为5.5V。一旦
VIN超过此值,芯片会立即关闭输入FET,切断VIN与内部的连接,保护后级电路。同时会触发一个128µs的/INT中断脉冲,并置位状态标志。只有当VIN电压恢复正常后,保护才会解除。这个阈值设计得很巧妙,刚好高于标准USB 5V的容差上限,既能防浪涌,又不影响正常使用。安全定时器与看门狗:这是防止电池因某种异常(如容量计失效、温度传感器故障)而无限期充电的双保险。安全定时器(
tMAXCHG)在充电周期开始时启动,如果超时仍未完成充电,则停止充电并报错。预充阶段的安全定时器是快充阶段的25%。更实用的是2X_TIMER功能,当充电电流因DPPM、VINDPM、热调节或JEITA等原因被限制时,安全定时器的速度会减半,避免因系统负载大导致充电慢而误触发超时故障。热保护与热折返:芯片会实时监控结温
TJ。如果超过关断温度TSHUTDOWN(典型值150°C),整个芯片会关闭。在达到关断温度之前,还有一个热调节温度TREG(可通过I2C设置,如120°C)。一旦TJ超过TREG,充电电流会以0.04 * ICHARGE / °C的斜率线性下降。这意味着在高温环境下,芯片会主动降额工作,而不是粗暴关断,实现了性能与安全的平衡。重要计算:估算芯片的功耗和温升至关重要。总功耗
PDISS是输入到PMID的功耗、LDO/LS的功耗以及电池路径功耗之和。具体计算公式见数据手册。结温TJ = TA + PDISS * θJA,其中TA是环境温度,θJA是芯片到环境的热阻,这很大程度上取决于你的PCB布局。对于WSON-10封装,在典型的2层板上,θJA可能在40-50°C/W左右。如果你设置ICHARGE=500mA,VIN=5V,VBAT=3.7V,那么仅充电部分的功耗就有(5V-3.7V)*0.5A=0.65W。在25°C室温下,温升就可能达到0.65W*45°C/W≈29°C,结温升至54°C。如果环境温度更高或散热更差,就很容易触发热折返。因此,在大电流充电应用中,务必给芯片提供足够的散热铜皮,甚至考虑在芯片底部添加过孔连接到背面铜层散热。电池过流与短路保护(OCP):当电池放电电流超过
IBAT_OCP阈值并持续一定消抖时间(tDGL_OCP)后,电池FET会被关闭,进入“打嗝”(hiccup)模式。即关闭一段时间(tREC_SC,约250ms)后重新尝试开启。如果连续尝试3-7次仍过流,则FET会永久关闭,直到芯片复位或VIN重新接入。这种“打嗝”模式既能有效保护,又给了故障自恢复的机会(比如瞬间的负载冲击)。PMID短路保护:当
PMID电压低于1.6V时,芯片会判断为输出短路。它会立刻断开输入FET约200µs,然后尝试软启动。这能防止在输出短路瞬间产生巨大的应力电流损坏芯片。
4.2 灵活的系统控制:MR引脚与PMID模式
/MR(Manual Reset)引脚是个多功能引脚,极大地简化了系统设计。
- 短按唤醒:在运输或长期存储时,可以进入“Ship Mode”(运输模式),此时芯片功耗极低(典型值<100nA)。通过按住连接
/MR的按键超过tWAKE1时间(可配置,如2秒),即可唤醒系统,PMID和LDO重新上电。 - 短按检测:
tWAKE1和tWAKE2两个可配置的定时器,可以区分不同时长的按键(比如短按1秒、长按3秒),并产生不同的中断给主机,实现开关机、模式切换等功能。 - 长按复位:当按键时间超过
tHW_RESET,可以配置为执行系统硬件复位(先关闭PMID再自动开启)或直接进入Ship Mode。甚至在复位前tRESET_WARN时刻,芯片还会提前发一个中断警告主机,给主机机会去取消这次复位(比如保存数据)。
PMID_MODE寄存器提供了对系统电源的精细控制:
00(默认):自动模式,VIN有电就用VIN,没电就用BAT。01(强制电池供电):即使VIN插着,也强制系统由电池供电。这在你想测试纯电池续航,或者不希望适配器待机功耗影响系统时非常有用。10/11(关闭PMID):直接断开PMID输出,可以将其浮空或拉低。这在需要完全关断系统负载以实现超低功耗时是关键。
4.3 JEITA温度补偿充电
这是延长锂电池寿命的关键功能。通过连接在TS引脚上的NTC热敏电阻,芯片可以感知电池温度,并自动调整充电参数:
| 温度区域 | NTC电阻对应电压范围 (典型) | 充电行为 |
|---|---|---|
| 冷(Too Cold) | VTS<VCOLD(如对应0°C) | 停止充电或 极小电流预充(可配置) |
| 凉(Cool) | VCOLD<VTS<VCOOL(如0-10°C) | 降低充电电流(如设定值的20%),电压保持VBATREG |
| 正常(Normal) | VCOOL<VTS<VWARM(如10-45°C) | 正常电流 (ICHARGE),正常电压 (VBATREG) |
| 暖(Warm) | VWARM<VTS<VHOT(如45-60°C) | 降低充电电流(如设定值的50%),降低充电电压(如4.06V) |
| 热(Too Hot) | VTS>VHOT(如对应60°C) | 停止充电 |
这些阈值(VCOLD,VCOOL,VWARM,VHOT)以及各区域的电流、电压比例,都可以通过I2C寄存器灵活配置。务必根据你使用的具体电池规格书来设置这些值,不同电池的适宜温度范围可能有差异。
5. 实战调试与故障排查实录
理论再完美,调试时也总会遇到各种问题。下面是我在实际项目中遇到的几个典型案例和解决方法。
5.1 常见问题速查表
| 现象 | 可能原因 | 排查步骤与解决方法 |
|---|---|---|
| 充电电流远小于设定值 | 1. VINDPM被触发 2. DPPM被触发 3. 热折返激活 4. JEITA温区限制 5. 输入电源能力不足 | 1. 读取STATUS1寄存器,检查VINDPM_STAT和DPPM_STAT位。2. 测量 VIN引脚实际电压,看是否低于VIN_DPM设定值。可尝试降低VIN_DPM或改善输入电源。3. 测量 PMID电压,若低于VBAT+200mV,说明系统负载过大,触发DPPM。4. 读取 FAULT3寄存器THERMAL_REG_STAT位,并触摸芯片是否发烫。改善散热。5. 读取 NTC_FAULT寄存器,检查TS引脚电压,确认是否因温度进入限流区。6. 用电子负载检查USB电源或适配器的带载能力。 |
| 充电无法完成,电池电压卡在4.1V左右 | 1. PMID调节电压设置过低 2. 电池老化,内阻增大 3. 充电终止电流 ITERM设置过小 | 1. 检查PMID_VOLTAGE寄存器设置。确保VPMID设定值至少比VBATREG高200mV。例如VBATREG=4.2V,则VPMID至少设为4.4V。2. 测量充电末期的 PMID电压和VBAT电压,差值应很小。若PMID已达设定值而VBAT上不去,可能是电池问题或PCB走线电阻过大。3. 适当增大 ITERM值(如从10mA调到20mA)。 |
| 设备从电池供电切换回VIN供电时重启 | 1.PMID端电容过小2. 电池电压过低,接近 VBATUVLO | 1. 增大PMID引脚的对地电容(如从22µF增加到47µF),或在PMID到地之间并联一个100µF的电解电容,以储存更多能量应对切换瞬间。2. 检查电池电压,确保其在正常工作范围内。 VBATUVLO默认约2.8V,可适当调低(但需谨慎)。 |
| I2C通信失败 | 1. 上拉电阻不合适或缺失 2. 电源 VDD(IO电平)未正确供电3. 地址错误 4. 看门狗复位导致配置丢失 | 1. SDA和SCL线必须接上拉电阻(通常4.7kΩ-10kΩ)。 2. 确保 VDD引脚有1.8V-5.5V的电源,且与主控MCU的IO电平匹配。3. 确认 ADDR引脚电平,确定7位I2C地址是0x6B(ADDR接低)还是0x6A(ADDR接高)。4. 如果通信偶尔失败,检查是否因长时间未访问触发了I2C看门狗。初始化时先禁用看门狗。 |
| 按键唤醒(MR)功能不稳定 | 1.MR引脚外部干扰2. 定时器配置时间太短,误触发 3. 内部上拉未启用或太弱 | 1. 在MR引脚到地之间加一个0.1µF的电容,滤除抖动和噪声。2. 适当增加 tWAKE1的时间(如从1秒增加到2秒)。3. MR引脚内部有上拉到BAT,如果BAT电压低或线缆过长导致上拉弱,可以考虑在外部增加一个10kΩ上拉电阻到VDD。 |
| ADC读数不准或跳动大 | 1. 参考电压噪声 2. 在电池供电手动模式下,未等待转换完成就读取 3. 信号源阻抗过高 | 1. 确保VDD(ADC参考源之一)电源干净,必要时增加滤波电容。2. 在手动启动转换后,务必等待 ADC_READY标志置位或等待足够的时间(>1ms)再读取数据。3. 对于 ADCIN引脚,如果测量高阻抗信号源,需考虑增加电压跟随器缓冲。 |
5.2 一个真实的调试案例:莫名其妙的充电中断
曾经在一个智能手环项目上,遇到一个诡异问题:设备放在桌上充电,偶尔会听到轻微的“咔哒”声(继电器声音,实际是电源路径切换),然后充电指示灯熄灭,查看状态发现充电停止了,但VIN一直连着。
排查过程:
- 读状态寄存器:发现
CHARGING_FAULT位被置1。 - 进一步读故障寄存器:
FAULT3寄存器的SAFETY_TMR_FAULT(安全定时器故障)位为1。 - 分析:安全定时器超时,意味着充电时间超过了设定的
tMAXCHG(我设的是8小时)却未完成。 - 测量与观察:电池是500mAh,设定电流300mA,理论上3小时左右就该充满。用电流探头观察充电过程,发现电流经常在200mA-300mA之间波动,且
PMID电压在3.9V-4.0V之间波动,而VBATREG设的是4.2V。 - 恍然大悟:系统主控和蓝牙模块在充电时也在工作,且间歇性有射频发射,导致系统负载波动很大。当负载突增时,触发DPPM,充电电流被大幅削减甚至归零。虽然我启用了
2X_TIMER功能,但在这种频繁、深度进入DPPM的情况下,安全定时器即使减半,也可能在电池实际只充入很少电量时就耗尽了。 - 解决:有两个方案。一是优化软件,在充电阶段降低主控和射频的活动频率,减少峰值负载。二是调整硬件参数,适当增大
PMID端的储能电容(从22µF增加到47µF),并显著增加安全定时器时长(从8小时增加到20小时)。同时,在主机代码中,检测到安全定时器故障后,尝试自动清零故障标志并重新启动充电(需谨慎,确保不是电池本身故障)。
这个案例给我的教训是:在动态负载变化大的系统中,安全定时器的设置必须非常宽松,必须结合2X_TIMER功能,并且要仔细评估DPPM对实际充电时间的影响。不能想当然地按“理想充电电流=电池容量/充电电流”来计算时间。
5.3 PCB布局的黄金法则
对于BQ25155这类模拟-数字混合的电源芯片,PCB布局直接决定性能甚至成败。
- 模拟地(AGND)与功率地(PGND)的星型连接:虽然芯片只有一个GND引脚,但在PCB上,应将输入电容(
CIN)、电池电容(CBAT)、输出电容(CPMID)的接地端,先用较宽的走线连接到一个“静点”,再从这个点用单一路径连接到芯片的GND引脚。避免大电流的功率回路和敏感的模拟/数字回路共用长段的地线。 - 关键电容必须就近放置:
CIN、CBAT、CPMID、CVINLS这几个电容,务必尽可能靠近芯片对应引脚,并使用短而粗的走线(最好在同一个层面)连接。它们的回流路径(到GND)也要尽可能短。 - 热设计:芯片的散热焊盘(Thermal Pad)必须良好地焊接在PCB的铜皮上。在这个焊盘下方,打多个过孔连接到PCB背面甚至内层的接地铜皮,这是最重要的散热途径。如果空间允许,在芯片周围多铺一些铜。
- NTC走线要小心:连接
TS引脚和NTC热敏电阻的走线应远离电源、电感等噪声源,防止干扰导致温度检测错误,误触发JEITA保护。 - I2C走线:虽然速度不高,但SDA/SCL走线也应尽量短,并远离高频或大电流走线,避免通信受干扰。
最后,拿到芯片和完成设计后,强烈建议先用评估板或自己打样的样板,把所有的保护功能都测试一遍:短接一下输出,模拟一下过温,拔插一下输入电源,按一按复位键。亲眼看到保护机制如何动作,心里才会真正有底。BQ25155的数据手册有近50页,细节非常多,但把它核心的电源路径管理、可编程充电、精密监控和全面保护这几个模块吃透,你就能在大多数单节锂电池应用中游刃有余了。
