This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ27741-G1:电量监测计未正确跟踪电池容量

Guru**** 2563820 points
Other Parts Discussed in Thread: BQ24295, BQ27426, BQ27741-G1, BQSTUDIO, GPCCHEM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1368183/bq27741-g1-gauge-is-not-tracking-battery-capacity-correctly

器件型号:BQ27741-G1
主题中讨论的其他器件: BQSTUDIOGPCCHEM、BQ24295 、BQ27426

工具与软件:

我正在尝试让 bq27741-G1电量计与单节锂离子聚合物电池5200mA 家族工作。  我已将 bq27x00 Linux 驱动程序移植到335x 3.2内核、可以轻松地从 Android 读取监测计。  但是、监测计无法正确跟踪电池容量、并且行为异常。

我们设置充放电周期并在它期间跟踪监测计值。  奇怪的是、在充电周期中、电量监测计认为它会过早地碰到满量超级5200mA、然后 Charge_Now 停止增加、而 Charge_Full 参数开始增加。 我不知道为什么监测计会决定增大 Charge_Full、而不是现在增大 Charge_Now...  更不用说它不是一个10、000 mA 电池。

同样奇怪的是、即使报告的 CHARGE_NOW 仍有足够的 mAh 电量、在放电期间的充电百分比也会从30%降至0%。

https://docs.google.com/spreadsheets/d/1huvOK4QCPwcxbDyibm2bQVjTazWd1aJs2AXCHgr5Gr8/edit?usp=sharing

探测器上的内核驱动程序检查测量仪设计容量是否设置为默认的1000mA 44,如果设置为默认值,则使用以下值对测量仪表进行编程。  如果您遇到明显的错误、或者如果我错过了需要设置的寄存器、请告诉我。

#define CHEM_ID_VALUE 	100 // - default
#define DESIGN_CAP		5200

static struct dm_reg bq277xx_dm_regs[] = {
	{48, 06, 2, 3700},		/* Design Voltage */
	{48, 19, 2, 4860},		/* CC Threshold = 0.9 * Design Cap */
	{48, 23, 2, DESIGN_CAP},/* Design Capacity */
	{48, 25, 2, 19240},		/* Design Energy = Design Cap * 3.6V */
	{48, 44, 1, 1},			/* Design Energy Scale */

	{49,  0, 2, 520},		/* SOC1 Set Threshold */
	{49,  2, 2, 780},		/* SOC1 Clear Threshold*/
	{49,  4, 2, 104},		/* SOC2 Set Threshold */
	{49,  6, 2, 260},		/* SOC2 Clear Threshold */

	{64,  0, 2, 0x0171},	/* Pack Configuration */
	{64,  2, 1, 0xa7},		/* Pack Configuration B */
	{64,  3, 1, 0x98},		/* Pack Configuration C */
	
	{68,  2, 2, 15},		/* Power Sleep Current */

	{80, 0, 1, 0x01},		/* Load Select - Default. Present average discharge current: This is the average discharge current from the beginning of this discharge cycle until present time. */
	{80, 1, 1, 0x01},		/* Load Mode - Default Constanst Power -  */
	{80, 67, 2, 3200},	    /* Terminate Voltage */

	{82, 0, 2, DESIGN_CAP},			/* Qmax */

	{83, 0, 2, CHEM_ID_VALUE},	/* Chem ID */
};

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     Jonathan、您好!

    您能否从电量计的寄存器名称的角度解释日志文件的每一列代表什么? 我不熟悉您使用的命名惯例(例如 Charge_Now 和 Capacity_Level)。

    此外、有关 SOC 从30%下降到0%的问题、请阅读本文档。  https://www.ti.com/lit/an/sluaa45/sluaa45.pdf

    此致、

    Nick Richards

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    命名约定来自内核的电池电量监测计子系统。

    Voltage_Now -伏
    current_now - AI
    容量- SOC
    Capacity_level -根据标志 FC、SOC1和 SOCF 进行设置
    Charge_Now - NAC
    Charge_Full - FCC
    CHARGE_DESIGN_FULL - DCAP
    Health (运行状况)-根据标志 SOCF、过热设置

    此外、关于 SOC 从30%下降到0%的问题、请通读本文档。  https://www.ti.com/lit/an/sluaa45/sluaa45.pdf

    从文档中:

    >但一旦电压达到 EDV、电量监测计就会强制报告 SOC=0%、从而使 EDV 上报告的 SOC 下降40%。

    请注意、我们将在室温下运行测试、当 SOC 降至0%时、电压大约为3.6V、因此仍有很多距离到达3.2V EDV。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Jonathan、

    您是否能够共享所有数据存储器的 gg 文件或配置文件。 我需要对其进行回顾、以了解根本原因是什么。

    此致、

    Nick Richards

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Nick。

    我在内核驱动程序中找到了此调试代码。 当我弄清楚如何调用它,你能确认这是否会转储你需要的所有信息吗?

    static void dump_rom_gauge_dm(struct bq27x00_device_info *di)
    {
    	// int i;
    	u8 buf[32];
    
    //	dev_err(di->dev, "%s()\n", __func__);
    
    	if (di->chip != BQ277XX) // Only tested on the BQ27741
    		return;
    
    	if (is_it_sealed(di))	
    	{
    		if (!unseal(di, BQ277XX_UNSEAL_KEY)) 
    			dev_dbg(di->dev, "%s: couldn't unsea!\n", __FUNCTION__);
    //		dev_err(di->dev, "%s: Unable to dump flash configuration data\n", __func__);
    		return;
    	}
    
    	/* Now lets dump the battery data  */
    
    	dev_err(di->dev, "%s:Sub Class 2 -\n", __func__);
    	read_dm_block(di, 2, 0, buf);
    	print_buf(di, __func__, buf);		
    
    	dev_err(di->dev, "%s:Sub Class 34 -\n", __func__);
    	read_dm_block(di, 34, 0, buf);
    	print_buf(di, __func__, buf);		
    
    	dev_err(di->dev, "%s:Sub Class 36 -\n", __func__);
    	read_dm_block(di, 36, 0, buf);
    	print_buf(di, __func__, buf);		
    
    	dev_err(di->dev, "%s:Sub Class 48 -\n", __func__);	// This one needs a second buffer
    	read_dm_block(di, 48, 0, buf);
    	print_buf(di, __func__, buf);		
    
    	dev_err(di->dev, "%s:Sub Class 49 -\n", __func__);
    	read_dm_block(di, 49, 0, buf);
    	print_buf(di, __func__, buf);		
    
    	dev_err(di->dev, "%s:Sub Class 56 -\n", __func__);
    	read_dm_block(di, 56, 0, buf);
    	print_buf(di, __func__, buf);		
    
    	dev_err(di->dev, "%s:Sub Class 57 -\n", __func__);
    	read_dm_block(di, 57, 0, buf);
    	print_buf(di, __func__, buf);		
    
    	dev_err(di->dev, "%s:Sub Class 58 -\n", __func__);
    	read_dm_block(di, 58, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 59 -\n", __func__);
    	read_dm_block(di, 59, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 60 -\n", __func__);
    	read_dm_block(di, 60, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 64 -\n", __func__);
    	read_dm_block(di, 64, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 68 -\n", __func__);
    	read_dm_block(di, 68, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 80 -\n", __func__);	// This requires 4 buffers
    	read_dm_block(di, 80, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 81 -\n", __func__);
    	read_dm_block(di, 81, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 82 -\n", __func__);
    	read_dm_block(di, 82, 0, buf);
    	print_buf(di, __func__, buf);
    
    	dev_err(di->dev, "%s:Sub Class 83 -\n", __func__);
    	read_dm_block(di, 83, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 88 -\n", __func__);
    	read_dm_block(di, 88, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 89 -\n", __func__);
    	read_dm_block(di, 89, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 104 -\n", __func__);
    	read_dm_block(di, 104, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 107 -\n", __func__);
    	read_dm_block(di, 107, 0, buf);
    	print_buf(di, __func__, buf);	
    
    	dev_err(di->dev, "%s:Sub Class 112 -\n", __func__);
    	read_dm_block(di, 112, 0, buf);
    	print_buf(di, __func__, buf);
    
    	seal(di);
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Jonathan、

    我不太熟悉该脚本中使用的命令。 不过、根据函数名称、它应该会输出我需要的相关信息。

    此致、

    Nick Richards

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它所倾倒的不同子类对您有什么意义吗?  这似乎是跳过一些,所以我不确定这是否重要。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我可以将子类编号与 BQStudio 上的子类 ID 相关联。

    此致、

    Nick Richards

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../dump.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、请允许我花点时间来查看寄存器。 我希望明天能回到您的身边。

    此致、

    Nick Richards

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

       我是代表 Jon 写的。 我们注意到电量计的当前读数似乎相差2倍、因此我们运行了本 文档 A.8部分中概述的当前校准程序。 我们在结果中更新了以下值:

    CC Gain: 0x7f746cf0 # Corresponds to 0.477386935

    CC Delta: 0x940b0c89 # Corresponds to 569544.572864322

    CC Offset: 1408

    Board Offset: -48

    这些更新的值虽然不完美,但却极大地改善了当前读数(现在似乎在10 -20 mA 以内)。 不过、充电周期似乎仍然关闭。 本 文档 展示了几个充电周期的结果。 您是否有一些建议有待改进?

    谢谢!

       Joshua Bourgeot

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、这里是处于当前状态的测量仪表的 ROM 转储、如果这样做有用的话。

    e2e.ti.com/.../gauge_5F00_rom_5F00_dump.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但是、充电周期似乎仍然关闭。

    澄清一下、这里我是指报告的容量如何在充满电之前达到100% 2-3小时、报告的容量不会以低于20%的直线放电、并且充满电似乎有奇怪的波动、尽管我认为它应该相对恒定。 这些问题我们可以解决还是符合我们的预期。

    谢谢!

       Joshua Bourgeot

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Joshua:

    我通读了你过去的帖子,似乎这里有几个问题。 首先、我可以验证一些内容、以便更好地了解我们在调试过程中所处的位置。

    1请验证器件是否已正确校准、这一点非常重要、因为我们通过未校准器件收集的任何数据都将是无用的。 请验证仪表是否看到预期的电流、电压和温度。   (+) BQ34Z100-G1:校准过程命令-电源管理论坛-电源管理- TI E2E 支持论坛

    2使用的是哪个 ChemID? 如何选择此 ChemID? 理想情况下、应使用 GPCCHEM 工具选择 ChemID、DOD%误差为3%或更低、 GPCCHEM 应用软件和框架| TI.com

    3学习周期是否已完成? 什么是更新状态?

    此致、

    Evan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Evan:

    Joshua 和我正在查看温度校准、它看起来像是硬件团队将热敏电阻连接到电池充电器 IC (bq24295)、而不是电池电量计。  测量仪表会使这一情况变得一团糟、我们可以解决这个问题吗?

    请注意 bq27741用户指南、在第2.6节中指出热敏电阻应位于 VCC 和 TS 之间、但在第6章的参考原理图中、它连接在 REG25和 TS 之间。  我假设参考原理图是正确的?

    请注意、我们的电池组将其热敏电阻连接到电池单元、因此不确定如何连接它。

    原理图如下所示:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    热敏电阻需要位于电池组上、电量计需要准确的温度读数才能计算 SOC。 TS 引脚用于电量计热敏电阻。

    Reg25输出2.5V、因此只要在热敏电阻上施加电压、它就可以正常工作。  

    我找不到将热敏电阻连接到 GND 的位置、您能指出这一点吗。

    谢谢!

    Evan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找不到将热敏电阻连接到 GND 的地方、您能指出这一点吗?

    嗯、我没有写入 GND。  我写了 VCC 和 TS。

    热敏电阻需要位于电池组上、电量计需要准确的温度读数来计算 SOC。 TS 引脚用于电量计热敏电阻。[/QUOT]

    嗯、这有多不准确?  如果我们处于室温以下还是高于室温、这会带来更大的问题吗?

    但是、我们可以对该板进行调制、我不确定如何将电池组的 TH 引脚连接到电量计的 TS 引脚。 因为 TH 连接到 PACK-而不是 reg25。

    这是电池组的原理图。  我不确定是否可以分享整个数据表。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我的错误、请将热敏电阻连接到 Reg25、如 EVM 中所示。

    电池组的温度对于 Impedanct Track 算法非常重要。 随着电池包的温度由于环境温度以及电池包充电、放电和放松时的温度而变化、这将改变电池的 OCV 曲线、需要加以考虑。

    我建议使用电池组和电量监测计外部的热敏电阻、并将热敏电阻放在电池组上。 我们的一些较新电量监测计(例如 BQ27426)可以在电池组上使用此类热敏电阻、但对于该较旧的器件、您需要将热敏电阻连接到 Reg25和 TS 引脚。

    此致、

    Evan