你(们)好。
我正在开发一款使用微控制器通过 I2C 配置的 BQ25890为4.2V 锂电池充电的产品。 我看到的是电池没有完成饱和充电。 相反、BQ25890会报告充电周期已完成、方法是将 CHRG_STAT 设置为2'B11、此时它仍在提供大量电流。
我可以通过 UART 连接到微控制器、也可以打印寄存器读取和写入。 写入报告为十六进制值列表(每个寄存器一个)。 充电时的原始 UART 输出为:
W:0x00 0x66 0x06 0x40 0x5a 0x27 0x10 0x5e
这是通过 I2C 写入的8个字节。 第一个是地址、因此这表示:
- 将 REG00设置为0x66 (EN_HIZ=0;EN_ILIM=1;IINLIM=2A)
- 将 REG01设置为0x06 (BHOT=0、BCOLD=0、VINDPM_OS=600mV)
- 将 REG02设置为0x40 (CONV_START=0、CONV_RATE = 1、BOOST_FREQ=0、ICO_EN=HVDCP_EN=MAXC_EN=FORCE_DPDM=AUTO_DPDM_EN=0)
- 将 REG03设置为0x5a (BAT_LOADEN=0、WD_RST=1、OTG_CONFIG=0、CHG_CONFIG=1、SYS_MIN=3.5V)
- 将 REG04设置为0x27 (EN_PUMPX=0、ICHG=2.496A)
- 将 REG05设置为0x10 (IPRECHG=128mA、ITERM=64mA)
- 将 REG06设置为0x5e (VREG=4.208、BATLOWV=1、VRECHG=0)
该配置告诉充电器在没有巧妙 USB 握手的情况下以高达2.5A 的输入电流充电至4.2V 的电压(因为实际上有一个12V 大电源为整个批次供电)。
除了写入配置数据、固件还读取状态信息(REG0B 至 REG12)并通过 UART 转储。 以下是充电完成前通过 UART 写入的最后一个读数:
R:0x16 0x00 0x52 0x5f 0x60 0x33 0xdc 0x1a
从 REG0B 开始、这意味着:
- REG0B=0x16 (CHRG_STAT=2'B10、PG_STAT=1)
- REG0C=0x00 (未报告故障)
- REG0D=0x52 (FORCE_VINDPM=0、VINDPM=4.4V)
- REG0E=0x5f (THERM_STAT=0、BATT=4.204V)
- REG0F=0x60 (SYSV=4.224V)
- REG10=0x33 (TSPCT=23.715%)
- REG11=0xdc (VBUS_GD=1、VBUSV=11.8V)
- REG12=0x1A (ICHGR=1.3A)
固件旨在写入此"请充电"配置、直到它看到 CHRG_STAT 转到2'B11 (这意味着充电已完成)、此时 LED 变为绿色、向用户报告我们已完成。 固件仍会继续写入 BQ25890 (以避免看门狗跳闸)、但现在会将 CHG_CONFIG=0设置为禁用充电。
遗憾的是、使用此设置后、充电会在充电完成之前停止:我的工作台电源显示我们仍在提供较大的充电电流。 查看通过 UART 报告的寄存器内容(见上文)、我们可以看到、当 ICHRGR=1.3A 时、充电完成、对于终止电流(!)来说、这是相当高的。
我更改了代码、以便在充电完成时、我们不会对芯片执行任何写入操作、并让充电器运行更长时间、而不会通知它禁用充电。 这是生成的 UART 跟踪、大约每秒条目一次。 我已在右侧添加了注释。
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x33 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x33 0xdc 0x1a
R:0x1E 0x00 0x52 0x5f 0x60 0x33 0xDE 0x00 // CHRG_STAT=2'B11:我们已经完成了充电?
R:0x1E 0x00 0x52 0x58 0x64 0x33 0xDE 0x00
R:0x1E 0x00 0x52 0x58 0x64 0x33 0xDE 0x00
R:0x1E 0x00 0x52 0x58 0x5d 0x33 0xDE 0x00
R:0x1E 0x00 0x52 0x58 0x5d 0x34 0xDE 0x00
R:0x1E 0x00 0x52 0x58 0x5b 0x34 0xDE 0x00
R:0x1E 0x00 0x52 0x58 0x5b 0x34 0xDE 0x00
R:0x16 0x00 0x52 0x58 0x5b 0x34 0xDE 0x00
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1b //哦,我们没有! 让我们再充电一些。
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1b
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1b
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1b
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x1E 0x00 0x52 0x5f 0x60 0x33 0xDE 0x00 //现在我们完成了吗?
R:0x1E 0x00 0x52 0x58 0x63 0x33 0xDE 0x00
R:0x16 0x00 0x52 0x58 0x5c 0x33 0xDE 0x00
R:0x1E 0x00 0x52 0x58 0x5c 0x33 0xDE 0x00
R:0x1E 0x00 0x52 0x58 0x5b 0x34 0xDE 0x00
R:0x1E 0x00 0x52 0x58 0x5c 0x34 0xDE 0x00
R:0x16 0x00 0x52 0x58 0x5b 0x34 0xDE 0x00
R:0x16 0x00 0x52 0x58 0x5b 0x34 0xDE 0x00
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1b //明显不……
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1b
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1b
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x35 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x1a
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
R:0x16 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
R:0x1E 0x00 0x52 0x5f 0x60 0x34 0xdc 0x19
您可以看到充电状态开关打开和关闭。 CHRG_STAT 寄存器在每行的第一个十六进制值中可见:当十六进制值为0x16时为2'B10 (这意味着快速充电)、当十六进制值为0x1E 时为2'B11 (这意味着充电完成)。
有人能不能建议为什么会发生这种循环行为? 以及我的固件如何区分"我正在从充电中中断、因为 "和"我们真的完成了。 告诉用户。"?
非常感谢、
鲁珀特