📺 B站 嵌入式孙老师:博主个人介绍
📘 博主书籍-京东购买链接:Yocto项目实战教程
📘 加博主微信,进技术交流群:jerrydev
最近在调试电池充电和系统供电时,我对 BQ25703A 做了一次比较完整的梳理。
一开始我也有几个疑问:
- Charge IC 上电后,软件还需要配置吗?
IIN_HOST默认为什么是 3.3A?IIN_HOST和ILIM_HIZ会不会冲突?- 输入过流、过压为什么可能导致系统重启?
- 数据手册写的是
0xD6,为什么 Linux 使用0x6B?

后来我发现,理解这类充电 IC,不能只盯着某一个寄存器。更重要的是先看懂适配器、电池和系统之间的功率关系。
1. 先看懂 BQ25703A 在系统中的作用

BQ25703A 不只是给电池充电。
它还要管理三部分之间的功率:
适配器输入
↓
BQ25703A
├──→ 系统负载 VSYS
└──→ 电池充电
适配器拔掉或者输入功率不足时,电池还可以反过来给系统供电:
电池 → BQ25703A → VSYS
Q1~Q4 和电感组成四开关 Buck-Boost 电路,因此它既能降压,也能升压。
例如:
20V输入 → 12.6V电池:主要是降压
9V输入 → 12V系统:需要升压
这也是 BQ25703A 适合多档 USB PD 输入的原因。
输入功率不足时会发生什么
BQ25703A 会优先保证系统供电。
当系统负载增加时,一般按照下面的顺序处理:
- 降低电池充电电流;
- 必要时停止充电;
- 输入仍然不足时,由电池给系统补能;
- 如果输入和电池都无法满足负载,VSYS 下降;
- VSYS 低于下游电源门限,系统重启。
所以,Charge IC 触发限流并不等于芯片重启。
很多时候真正导致重启的是:
输入功率不足 → 电池无法补能 → VSYS跌落 → 系统欠压重启
2. 我认为最需要分清的几个配置
IIN_HOST:软件输入电流限制
IIN_HOST 表示主机允许 Charge IC 从适配器端取得的最大输入电流。
它限制的是输入电流,不是电池充电电流。
BQ25703A 官方给出的默认值是:
IIN_HOST默认值 = 3.3A
这个值以 RAC=10mΩ 为基准。
需要注意,3.3A 只是寄存器默认值,不是芯片内部已经运行了一套完整的充电固件。
软件仍然需要根据实际情况配置:
- 适配器最大电流;
- 电池充电电流;
- 电池最高电压;
- 最低系统电压;
- USB PD 协商结果。
而且适配器移除后,IIN_HOST 会恢复到默认 3.3A。因此,如果产品要求限制在 3.0A,软件需要在适当时机重新写入。
IIN_HOST 的计算
IIN_HOST 使用 50mA 步进,并带有 50mA 偏移:
IIN_HOST = (Code + 1) × 50mA
反过来:
Code = IIN_HOST / 50mA - 1
例如设置 3A:
Code = 3000 / 50 - 1
= 59
= 0x3B
对应字段值为:
0x3B00
几个常用值如下:
| 输入电流 | Code | 字段值 |
|---|---|---|
| 0.5A | 9 | 0x0900 |
| 1.5A | 29 | 0x1D00 |
| 3.0A | 59 | 0x3B00 |
| 3.3A | 65 | 0x4100 |
这里还有一个细节:
Code = 0,不是0A,而是50mA
ILIM_HIZ:硬件限制或外部调节
ILIM_HIZ 和 IIN_HOST 并不冲突。
我更愿意这样理解:
IIN_HOST:软件设置的输入电流上限
ILIM_HIZ:硬件或外部模拟环路设置的限制
两者同时启用时,实际输入电流由更严格的条件决定:
IIN实际 ≈ min(
IIN_HOST,
ILIM_HIZ限制,
适配器能力,
其他DPM限制
)
一种比较合理的配置是:
IIN_HOST = 3.0A
ILIM_HIZ硬件限制略高
这样正常情况下由软件控制;软件没有初始化或者配置异常时,还有硬件限制兜底。
ILIM_HIZ 与输入电流之间的关系为:
VILIM_HIZ = 1V + 40 × IDPM × RAC
因此:
IDPM = (VILIM_HIZ - 1V) / (40 × RAC)
如果 RAC=10mΩ:
IDPM = (VILIM_HIZ - 1V) / 0.4
这里不能只看原理图旁边标注了多少安培,还应该结合实际分压、检测电阻误差和测试结果重新核对。
输入电流和充电电流不是一回事
这是我调试时觉得最容易混淆的地方。
输入端的功率除了给电池充电,还要供系统运行:
P输入 ≈ P系统 + P充电 + P损耗
例如适配器是 20V/3A:
最大输入功率约为60W
如果系统已经消耗 40W,留给电池充电的功率就只剩约 20W,还没有计算转换损耗。
因此,系统负载增加时看到充电电流下降,通常是正常现象。
3. 硬件和软件配置上的几个经验
两个检测电阻不要混淆
BQ25703A 有两组主要的电流检测:
| 检测位置 | 引脚 | 作用 |
|---|---|---|
输入侧 RAC | ACP/ACN | 输入电流检测和输入限流 |
电池侧 RSR | SRP/SRN | 电池充放电电流检测 |
手册中的电流换算通常以 10mΩ 为基准。
如果实际检测电阻改变:
I实际 ≈ I寄存器标称 × 10mΩ / R实际
例如换成 20mΩ,相同寄存器配置对应的实际电流约减半。
检测电阻的采样线还应该使用 Kelvin 连接,从电阻焊盘内侧单独引出,并远离电感和 SW 开关节点。否则软件设置为 3A,实际限流点可能存在明显偏差。
充电电压必须按电池规格设置
最高充电电压的基本计算是:
最高充电电压 = 串数 × 单节满充电压
例如普通 3S 锂电池:
3 × 4.20V = 12.60V
但不是所有电芯都是 4.20V,也可能是 4.10V 或 4.35V,因此最终必须以电池规格书为准。
充电电流也不能只看芯片支持多大,而应该取以下条件中的最小值:
电芯允许电流
BMS允许电流
适配器剩余功率
连接器和PCB能力
MOSFET、电感及检测电阻能力
整机散热能力
我的保守起始配置
假设使用:
RAC = 10mΩ
RSR = 10mΩ
3S普通锂电池
20V/3A适配器
我会先从下面的值开始:
| 参数 | 建议起始值 |
|---|---|
IIN_HOST | 3.0A |
| 充电电流 | 1.5~2.0A |
| 最高充电电压 | 12.60V |
| 最低系统电压 | 约9.0V |
| OTG | 默认关闭 |
先使用较小的充电电流,确认输入电压、VSYS、充电方向、开关波形和温升都正常,再逐步提高。
如果使用 USB PD,IIN_HOST 最好跟随协商结果动态调整:
IIN_HOST = min(
适配器协商电流 × 降额系数,
板级安全上限
)
降额系数可以先从 0.85~0.95 开始,再根据线缆压降、瞬态和温升测试调整。
I²C 地址为什么使用 0x6B
数据手册中的 0xD6 是包含读写位的 8 位写地址:
0xD6 >> 1 = 0x6B
所以:
7位设备地址:0x6B
写地址字节:0xD6
读地址字节:0xD7
Linux 设备树中应该写:
charger@6b {
reg = <0x6b>;
};
最后总结
调试 BQ25703A 后,我认为最核心的是下面几点:
- BQ25703A 不只是充电器,也是系统功率路径管理器;
IIN_HOST默认是 3.3A,但产品仍然需要软件配置;IIN_HOST管软件输入上限,ILIM_HIZ可以作为硬件兜底;- 输入电流不等于电池充电电流,分析问题时应该先看功率;
- 触发输入限流通常不会直接重启,真正需要关注的是 VSYS 是否跌落;
- 输入侧
RAC和电池侧RSR作用不同,不能混淆; - 最终电流上限不是由某一个寄存器决定,而是由适配器、电池、功率器件、PCB 和散热中最弱的一环决定。
简单来说:
IIN_HOST决定允许从适配器取多少电流,充电电流寄存器决定给电池充多少电流,ILIM_HIZ提供外部限制或硬件兜底。BQ25703A 负责在系统和电池之间分配功率,但真正的安全边界,需要硬件与软件共同确定。
982

被折叠的 条评论
为什么被折叠?



