Thread 中讨论的其他器件: BQ34Z100
工具与软件:
你好。 我不确定这个问题是否已经包含在内。 我们正在开发中的设计使用 bq34110 ( 具体是 BQ34110PW)。 我们已多次测试此电量监测计、遇到相同的问题。 我知道这适用于电池很少放电的应用、但我们想在所有条件下进行测试。 我们已多次对多个器件执行了完整的放电测试。 我们知道、在测试开始时(电池充满 电和 BQ34110PW 正确报告、电池充满电)。 当电池电量耗尽时、报告的电量似乎被正确计数。 电池的规格为4930mA 301,电量监测计报告~í a 4750mA 在放电过程中已通过电池。 然而、在充电时、我们始终看到 BQ34110PW 在整个充电过程中仅统计~μ C 3550mA。 我们可以确认电池实际上已完全放电。 为什么会这样呢? 我们已经看到、我们可以执行多个充电/放电周期进行校准、但这对于生产线设置是不可接受的。 我们不能让单位报告几个充电/放电周期的奇怪值。 是否有人遇到过此问题? 我是电子工程工程师。 我可以提供我们的原理图(拖动到编辑器中)。 我们遵循了应用手册。 我没有太多代码细节、但如果需要、可以让我们的固件工程师提供这些信息。 请告诉我您能做些什么。
我们没有.gg 文件。 我们正使用以下命令进行编程:
int bq341xx_calibrate (const struct device* dev、const struct bq341xx_calib_data* calib_data){
if (!dev ||!calib_data){
返回-EINVAL;
}
INT RC = 0;
log_inf ("校准电池电量计");
RC = bq341xx_GAUGE_SEALED (dev、false);
如果(RC!= 0){
LOG_ERR ("解封失败");
返回-EBADF;
}
RC = bq341xx_cfg (dev、0x002D、TRUE);
如果(RC!= 0){
log_err ("enter calib err");
返回-EBADF;
}
/*校准模式*/
{
LOG_INF ("update flash OK");
//分压器
(void) bq341xx_change_df_u16 (dev、0x4,010,18981u);
k_msleep (BQ341XX_DELAY * 2);
/*闪存正常*/
RC = bq341xx_change_df_u16 (dev、0x4,157,1000);
如果(RC!= 0){
log_Wrn ("flash-ok fail");
}
k_msleep (BQ341XX_DELAY * 2);
//分压器
RC = bq341xx_change_df_u16 (dev、0x4,010,18981u);
k_msleep (BQ341XX_DELAY * 2);
log_inf ("change pin ctl");
RC = bq341xx_calibration_pin_ctl (dev);
如果(RC!= 0){
Log_Wrn ("pin ctl fail");
}
k_msleep (BQ341XX_DELAY * 2);
RC = bq341xx_change_df_u16 (dev、0x41F9、calib_data->design_voltage);
如果(RC!= 0){
log_Wrn ("design-vol 失败");
}
对于(int i = 0;i < array_size (calib_data->voltage_dod);++i){
k_msleep (BQ341XX_DELAY * 2);
const uint16_t DOD_addr = 0x4263 +(I * 2);
bq341xx_change_df_u16 (dev、DoD_addr、calib_data->voltage_DoD[i]);
k_msleep (BQ341XX_DELAY * 2);
}
/*设计容量*/
RC = bq341xx_change_df_u16 (dev、0x41F5、calib_data->design_capacity);
如果(RC!= 0){
LOG_WRn ("DESIGN-CAP FAIL");
}
RC = bq341xx_change_df_u16 (dev、0x40C0、calib_data->design_capacity);
如果(RC!= 0){
LOG_WRn ("DESIGN-CAP FAIL");
}
bq341xx_change_df_u16 (dev、0x40C5、0);
bq341xx_change_df_u16 (dev、0x4,184,3150);
bq341xx_change_df_u8 (dev、0x4186、2);
bq341xx_change_df_u16 (dev、0x4,187,3400);
bq341xx_change_df_u16 (dev、0x4,189,4300);
bq341xx_change_df_u8 (dev、0x418B、2);
bq341xx_change_df_u16 (dev、0x418C、4200);
//禁用自放电
bq341xx_change_df_u8 (dev、0x4295、0);
/*设计单元格*/
RC = bq341xx_change_df_u8 (dev、0x4155、calib_data->cells_count);
如果(RC!= 0){
Log_Wrn ("design-cells fail");
}
k_msleep (BQ341XX_DELAY);
/*最大电池组电压*/
RC = bq341xx_change_df_u16 (dev、0x4088、(uint16_t)(calib_data->max_voltage /20));
如果(RC!= 0){
Log_Wrn ("design-cells fail");
}
RC = bq341xx_change_df_u16 (dev、0x4123、(uint16_t)(calib_data->max_voltage));
如果(RC!= 0){
Log_Wrn ("design-cells fail");
}
k_msleep (BQ341XX_DELAY);
RC = bq341xx_change_df_u16 (dev、0x408A、(uint16_t)(calib_data->min_voltage / 20));
如果(RC!= 0){
Log_Wrn ("design-cells fail");
}
k_msleep (BQ341XX_DELAY);
RC = bq341xx_change_df_u8 (dev、0x400F、0);
}
k_msleep (BQ341XX_DELAY);
RC = bq341xx_cfg (dev、0x2D、false);
如果(RC!= 0){
log_Wrn ("exit calib err");
}
bq341xx_reset (dev);
返回0;
}
这是我们的寄存器映射:
寄存器 地址值
0x4010 18981u
0x4157 1000
0x4010 18981u (重复)
0x41F9 calib_data->design_voltage
0x4263 +(I * 2) calib_data->voltage_dod[i](循环)
0x41F5 calib_data->design_capacity
0x40C0 calib_data->design_capacity
0x40C5 0
0x4184 3150
0x4186 2.
0x4187 3400
0x4189 4300
0x418B 2.
0x418C 4200
0x4295 0 (禁用自放电)
0x4155 calib_data->cells_count (设计单元格)
0x4088 (uint16_t)(calib_data->max_voltage/20)
0x4123 (uint16_t)(calib_data->max_voltage)
0x408A (uint16_t)(calib_data->min_voltage/20)
0x400F 0