工具/软件:
您好:
看起来我之前的线程由于不活动而被锁定。 尽管多次硬件返修尝试和编辑 I2C 配置字节、但仍然无法让此电路为电池充电。 这些串行调试消息由主机微控制器在打开台式电源将 VAC 输入应用于此充电器时生成:
触发充电器中断!
BQ25756E 寄存器地址 0x2B — 写入值 0xE0
状态:CC 快速充电
电源正常= 1
启用充电= 1
EN_HIZ = 0
ADC 转换完成
器件进入了输入电压调节状态
充电状态转换
VBAT = 11110mV
VAC = 12054mV
IBat = 0uA
IAC = 0uA
VFB = 1395mV
这是我未经修改的原始原理图:

到目前为止、我尝试了以下修复:
- 在 DRV_SUP 和每个 BTST 网络之间添加通孔 BAT41 肖特基二极管
- 将我的原理图中的 R13 更改为 0 Ω、以消除对 DRV_SUP 电流的限制
- 将开关电感器从 22uH 更改为 10uH
- 在输入侧检测电阻的下游放置一个 470 μ F 电解电容器、以便更好地平衡电容
- 焊接与 ICHG 和 ILIM_HIZ 电阻器并联的 RC 低通滤波器
- 在我的原理图中意识到 STAT1、STAT2 和 PG 引脚直接接地后、我通过 I2C 写入禁用这些引脚。
- 通过 I2C 写入禁用 ICHG 和 ILIM_HIZ 引脚、并将这些电阻器替换为 0 Ω、以实现完全固件控制
- 由于我现在的电池没有热敏电阻、移除了 R15 并将 R19 替换为 0 欧姆、然后通过 I2C 写入禁用 TS 引脚
目前、我的固件按如下方式配置 IC:
#define VAC_INPUT_MAX_mV 34000 //for VAC_DPM register
#define VAC_INPUT_MIN_mV 4500 //for VAC_DPM register USB charger with some voltage drop
#define IAC_INPUT_MAX_mA 1000 //for IAC_DPM register. 1A input limit seems fine. Technically we could set the limit higher whenever VAC is lower
#define MAX_CHARGE_LIMIT_mV 12600 //4.2V/cell * 3 cells
#define MAX_CHARGE_CURRENT_mA 2000 //pack is 2600mAh, so this is equivalent to 0.77C charge rate
#define CHARGE_TERMINATION_CUURRENT_mA 200// (MAX_CHARGE_CRRENT_mA/10)//In host-controlled applications, the termination current can be programmed using the ITERM register bits;
#define PRECHARGE_CURRENT_mA (MAX_CHARGE_CURRENT_mA/5) //charging current when battery voltage is above VBAT_SHORT but below VBAT_LOWV
#define VFB_REG_VOLTAGE_DESIRED_mV 1544 //set by hardware resistor configuration. Control loop tries to make voltage-divided charger output hit this target.
#define VFB_REG_OFFSET_mV 1504 //VFB when register is set to 0
#define VFB_REG_mV_PER_BIT 2
#define VFB_REG_VAL ((VFB_REG_VOLTAGE_DESIRED_mV - VFB_REG_OFFSET_mV)/VFB_REG_mV_PER_BIT)
#define VBAT_LOWV_LI_ION 0x3 //datasheet recommendation; 0x3 = 71.4% x VFB_REG; charger will only enter CC-fast-charge mode if battery is below 3V/cell; this is default value so we don't have to write
#define VRECHG_REG_VAL 0x3 //datasheet recommendation; 0x3 = 97.6% x VFB_REG; charger will top off battery once it drops below 4.1V/cell; this is default value so we don't have to write anything
#define ICHRG_REG_mA_PER_BIT 50
#define ICHRG_REG_VAL (MAX_CHARGE_CURRENT_mA / ICHRG_REG_mA_PER_BIT)
#define IAC_DPM_REG_mA_PER_BIT 50
#define IAC_DPM_REG_VAL (IAC_INPUT_MAX_mA / IAC_DPM_REG_mA_PER_BIT)
#define VAC_DPM_REG_mV_PER_BIT 20
#define VAC_DPM_REG_VAL (VAC_INPUT_MAX_mV / VAC_DPM_REG_mV_PER_BIT)
#define IPRECHG_REG_mA_PER_BIT 50
#define IPRECHG_REG_VAL (PRECHARGE_CURRENT_mA / IPRECHG_REG_mA_PER_BIT)
#define ITERM_REG_mA_PER_BIT 50
#define ITERM_REG_VAL (CHARGE_TERMINATION_CURRENT_mA / ITERM_REG_mA_PER_BIT)
#define BQ25756_TS_CHAG_BEHAVIOR_CTRL_DEFAULT 0x57 //power-on-reset value of the register
#define REG_TIMER_CTRL_DEFAULT 0x1D //power-on-reset value
#define DISABLE_ADC_DONE_INT (1<<7) //write to REG0x28
#define DISABLE_WDT_INT (1<<3) //write to REG0x28
#define DISABLE_NTC_INT (1<<4) // REG0x29
#define BQ25756_ADC_CTRL_RESETVAL 0x60
#define BQ25756_ADC_CTRL2_RESETVAL 0x0A
#define EN_ADC_BIT (1<<7)
#define PART_ID 0x32
#define CHG_CTRL_RESETVAL 0xC9
#define CHG_EN_BIT 1
#define VFB_ADC_EN_MASK 0xFD
#define REG0x19_RSTVAL 0x20
#define DIS_PFM_MASK 0xDF
...
BQ25756_WriteReg(BQ25756_ADD, BQ25756_CHRG_V_LIM_LSB, (VFB_REG_VAL & 0x1F)); //charge voltage, bits 4:0 of register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_CHRG_I_LIM_LSB, ((ICHRG_REG_VAL << 2) & 0xFC)); //charge current, shifted and masked to fill bits 7:2 of first register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_CHRG_I_LIM_MSB, ((ICHRG_REG_VAL >> 6) & 0x07)); //charge current, shifted and masked to fill bits 2:0 of next register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_INPUT_I_DPM_LIM_LSB, ((IAC_DPM_REG_VAL << 2) & 0xFC)); //input current, shifted and masked to fill bits 7:2 of first register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_INPUT_I_DPM_LIM_MSB, ((IAC_DPM_REG_VAL >> 6) & 0x07)); //input current, shifted and masked to fill bits 2:0 of next register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_INPUT_V_DPM_LIM_LSB, ((VAC_DPM_REG_VAL << 2) & 0xFC)); //input voltage, shifted and masked to fill bits 7:2 of first register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_INPUT_V_DPM_LIM_MSB, ((VAC_DPM_REG_VAL >> 6) & 0x3F)); //input voltage, shifted and masked to fill bits 5:0 of next register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_PRECHRG_I_LIM_LSB, ((IPRECHG_REG_VAL << 2) & 0xFC)); //precharge current, shifted and masked to fill bits 7:2 of first register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_PRECHRG_I_LIM_MSB, ((IPRECHG_REG_VAL >> 6) & 0x03)); //precharge current, shifted and masked to fill bits 1:0 of next register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_TERM_I_LIM_LSB, ((ITERM_REG_VAL << 2) & 0xFC)); //precharge current, shifted and masked to fill bits 7:2 of first register
BQ25756_WriteReg(BQ25756_ADD, BQ25756_TERM_I_LIM_MSB, ((ITERM_REG_VAL >> 6) & 0x03)); //precharge current, shifted and masked to fill bits 1:0 of next register
//until we have a better-characterized battery with a known thermistor, let's disable the TS pin and JEITA charging to make behavior more predictable
BQ25756_WriteReg(BQ25756_ADD, BQ25756_TS_CHAG_BEHAVIOR_CTRL, (BQ25756_TS_CHAG_BEHAVIOR_CTRL_DEFAULT & 0xFC)); //clear bits 1:0 to disable TS pin and JEITA
//disable watchdog timer. We want to only intervene upon interrupt, so there should be extended periods without I2C traffic
BQ25756_WriteReg(BQ25756_ADD, BQ25756_TIMER_CTRL, (REG_TIMER_CTRL_DEFAULT & 0xCF)); //clear bits 4 and 5 to disable watchdog
//we don't want activity on the interrupt pin for any of these events (right now at least)
BQ25756_WriteReg(BQ25756_ADD, BQ25756_CHRG_MSK_1, (DISABLE_ADC_DONE_INT | DISABLE_WDT_INT));
BQ25756_WriteReg(BQ25756_ADD, BQ25756_CHRG_MSK_2, DISABLE_NTC_INT);
//test: disable ICHG, ILIM_HIZ, PG and STAT pins
BQ25756_WriteReg(BQ25756_ADD, BQ25756_PIN_CTRL, 0x30);
//enable the ADC for a single conversion
BQ25756_WriteReg(BQ25756_ADD, BQ25756_ADC_CTRL, (BQ25756_ADC_CTRL_RESETVAL | EN_ADC_BIT));
BQ25756_WriteReg(BQ25756_ADD, BQ25756_ADC_CHANNEL_CTRL, (BQ25756_ADC_CTRL2_RESETVAL & VFB_ADC_EN_MASK));
//disable PFM
BQ25756_WriteReg(BQ25756_ADD, BQ25756_POW_AND_REV_CTRL, (REG0x19_RSTVAL & DIS_PFM_MASK));
//charger should be enabled by default, but just in case:
BQ25756_WriteReg(BQ25756_ADD, BQ25756_CHRG_CTRL, (CHG_CTRL_RESETVAL | CHG_EN_BIT)); //enable charger
初始寄存器写入后、主机微控制器会轮询寄存器以响应中断引脚上的任何活动、并定期监测充电状态。
我在以前的设计中使用了类似的 TI 器件、但无论我尝试什么、这个器件都拒绝工作。 根据上面所见、我是否遗漏了一些内容?