Part Number: BQ27220
hello

这个是BQ27220的设计原理图;
硬件:850ma,3.7v三元锂电池,设备无线充,实测满电最高4.15v,最低放电电压3.0v。
目前出现的问题、电量充放电循环后、电量显示百分之100的时候充电电压4.17左右、停止充电实际电压4.0v左右,实际上不是百分之百电量、但显示的百分之百 ;
另一种情况、循环后、电池完全放空、上电显示百分之40多。实际3.8v就显示电量百分之百,这种情况的设备不多、但是存在。
寄存器配置尝试过的情况:
1、只配置设计和满电容量,
2、增加配置测量寄存器,禁止休眠寄存器,以及百分之3和7阈值寄存器,
3、也尝试过增加,修改最高和最低电压寄存器。
效果都和上面描述的一样、电量显示不准。
请问是什么情况?
/**
* @brief BQ27220初始化函数
* @return 初始化是否成功
*/
bool BQ27220_Init(void)
{
uint8_t tx_buf[3];
uint8_t rx_buf_[2] = {0};
uint16_t voltage = 0;
// 初始化I2C总线
if(!qx_driver_i2c_common_is_init())
{
qx_driver_i2c_common_init();
}
// 读取电压判断是否已初始化(保留原有逻辑,也可替换为设备ID判断)
qx_driver_i2c_common_reg_read(BQ27220_ADDRESS, 0x3C, rx_buf_, 2);
nrf_delay_ms(10);
voltage = rx_buf_[1];
voltage = (voltage << 8) | rx_buf_[0];
// 如果电压为850,认为已初始化完成
if(voltage == 850)
{
return true;
}
// 进入配置模式
tx_buf[0] = 0X00;
tx_buf[1] = 0x14;
tx_buf[2] = 0x04;
qx_driver_i2c_common_reg_write(BQ27220_ADDRESS, tx_buf, 3);
nrf_delay_ms(50);
tx_buf[1] = 0x72;
tx_buf[2] = 0x36;
qx_driver_i2c_common_reg_write(BQ27220_ADDRESS, tx_buf, 3);
nrf_delay_ms(50);
tx_buf[1] = 0xFF;
tx_buf[2] = 0xFF;
qx_driver_i2c_common_reg_write(BQ27220_ADDRESS, tx_buf, 3);
nrf_delay_ms(50);
tx_buf[1] = 0xFF;
tx_buf[2] = 0xFF;
qx_driver_i2c_common_reg_write(BQ27220_ADDRESS, tx_buf, 3);
nrf_delay_ms(50);
tx_buf[1] = 0x90;
tx_buf[2] = 0x00;
qx_driver_i2c_common_reg_write(BQ27220_ADDRESS, tx_buf, 3);
nrf_delay_ms(50);
// 配置各个寄存器(使用16位参数格式)
BQ27220_WriteConfigWithChecksum(0x929B, 0x0021); // 测量配置寄存器
BQ27220_WriteConfigWithChecksum(0x929D, 0x0352); // 满电容量寄存器(850mAh)
BQ27220_WriteConfigWithChecksum(0x929F, 0x0352); // 设计产能寄存器(850mAh)
BQ27220_WriteConfigWithChecksum(0x9206, 0x0084); // 禁止休眠寄存器
BQ27220_WriteConfigWithChecksum(0x9271, 0x0F0E); // 平滑处理寄存器
// 3%电量对应2950mV,7%电量对应3050mV(匹配3000mV放电截止)
BQ27220_WriteConfigWithChecksum(0x92B7, BQ27220_ConvertVoltageToData(2950)); // 3%低电量阈值
BQ27220_WriteConfigWithChecksum(0x92BA, BQ27220_ConvertVoltageToData(3050)); // 7%低电量阈值
// // CEDV Profile 1 电压配置(匹配实际电池:4150mV满电、3000mV截止)
// BQ27220_WriteConfigWithChecksum(0x92BD, BQ27220_ConvertVoltageToData(4150)); // 0% DOD - 满电4150mV
// BQ27220_WriteConfigWithChecksum(0x92BF, BQ27220_ConvertVoltageToData(4043)); // 10% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92C1, BQ27220_ConvertVoltageToData(3925)); // 20% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92C3, BQ27220_ConvertVoltageToData(3821)); // 30% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92C5, BQ27220_ConvertVoltageToData(3725)); // 40% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92C7, BQ27220_ConvertVoltageToData(3656)); // 50% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92C9, BQ27220_ConvertVoltageToData(3619)); // 60% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92CB, BQ27220_ConvertVoltageToData(3582)); // 70% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92CD, BQ27220_ConvertVoltageToData(3515)); // 80% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92CF, BQ27220_ConvertVoltageToData(3439)); // 90% DOD - 保持原值
// BQ27220_WriteConfigWithChecksum(0x92D1, BQ27220_ConvertVoltageToData(3000)); // 100% DOD - 放电截止3000mV
// 退出配置模式
tx_buf[0] = 0x00;
tx_buf[1] = 0x91;
tx_buf[2] = 0x00;
qx_driver_i2c_common_reg_write(BQ27220_ADDRESS, tx_buf, 3);
nrf_delay_ms(50);
tx_buf[0] = 0x00;
tx_buf[1] = 0x30;
tx_buf[2] = 0x00;
qx_driver_i2c_common_reg_write(BQ27220_ADDRESS, tx_buf, 3);
nrf_delay_ms(50);
return true;
}