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.

[参考译文] BQ35100:通过 i2c 进行的电流测量仅报告0mA

Guru**** 2536780 points
Other Parts Discussed in Thread: BQ35100

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1114240/bq35100-current-measurement-over-i2c-is-reporting-only-0ma

器件型号:BQ35100

您好!

我编写了自己的小驱动程序、以便 MCU 可以与电池管理器通信。 但是、我可以读取温度和电压只是正常、但电流始终报告0mA。 为什么是这样?

下面是我使用的代码:

读取的两个字节代码:

/*
 * reads two bytes from a register
 */
BAT_STATUS BAT_Read_Two_Bytes(BAT_StateHandle *hbat, uint8_t register_address,
		uint16_t *pBytes) {

	//we use the buffer to send the register we want to read
	//the same buffer will be used later to store the answer
	uint8_t buff[2] = { register_address, 0x00 };

	//send which register we want to read
	if (HAL_I2C_Master_Transmit(&hi2c2, hbat->address_i2c, &buff[0], 1,
	BAT_TIMEOUT_LIMIT) != HAL_OK) {
		return BAT_ERROR;
	}
	//now read it
//	if (HAL_I2C_Master_Receive(&hi2c2, hbat->address_i2c, buff, 2,
//	BAT_TIMEOUT_LIMIT) != HAL_OK) {
	HAL_Delay(BAT_DELAY); //wait  for the device to write the answer
	if (HAL_I2C_Master_Receive(&hi2c2, hbat->address_i2c, buff, 2, BAT_TIMEOUT)
			!= HAL_OK) {
		return BAT_ERROR;
	}
	HAL_Delay(BAT_DELAY);
	//fill in the result
	if (pBytes) {	//return ERROR if not there
		*pBytes = (((uint16_t) buff[1]) << 8) + buff[0];
		APP_LOG(TS_ON, VLEVEL_L, "reading two bytes buffer is [%d, %d]\n", buff[0], buff[1]);
	} else {
		return BAT_ERROR;
	}

	return BAT_OK;
}

以下是读取温度、电压和电流的函数:

/*
 * the current flow in mA
 */
BAT_STATUS BAT_Get_Current(BAT_StateHandle *hbat, uint16_t *current) {
	BAT_STATUS status;
	status =  BAT_Read_Two_Bytes(hbat, 0x0c, current);
	APP_LOG(TS_ON, VLEVEL_L, "reading current %d \r\n", *current);
	return status;
}


/*
 * returns the voltage in mV
 */
BAT_STATUS BAT_Get_Voltage(BAT_StateHandle *hbat, uint16_t *voltage) {
	return BAT_Read_Two_Bytes(hbat, BAT_REG_Voltage, voltage);
}

BAT_STATUS BAT_Get_Temperature(BAT_StateHandle *hbat, float *temperature) {
	*temperature = -273.15f; //default is 0 Kelvin
	uint16_t pBytes;
	//read the register
	BAT_STATUS status = BAT_Read_Two_Bytes(hbat, BAT_REG_Temperature, &pBytes);
	if (status == BAT_OK) {
		//interpret the value in pBytes as temperature
		*temperature = (float) pBytes;
		*temperature = (*temperature - 2731.5f) / 10.0f; //into Celcius
	}
	return status;
}

温度和电压工作正常。电流仅返回0。为什么? 他们的表现似乎大致相同。

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

    我在 当前函数中做了一个拼写错误。这是我要使用的函数:

    /*
     * the current flow in mA
     */
    BAT_STATUS BAT_Get_Current(BAT_StateHandle *hbat, uint16_t *current) {
    	BAT_STATUS status;
    	status =  BAT_Read_Two_Bytes(hbat, BAT_REG_Current, current);
    	APP_LOG(TS_ON, VLEVEL_L, "reading current %d \r\n", *current);
    	return status;
    }

    但是、我使用逻辑分析仪进行了检查、测量仪表返回两个字节、分别为0x00和0x00。这意味着它实际上报告的电流为0mA。 我的测试设置为10mA、我已使用万用表验证了该电流。 以下是逻辑分析仪输出的一部分:

    write to 0x55 ack data: 0x00 
    read to 0x55 ack data: 0x80 0x40
    
    write to 0x55 ack data: 0x08 
    read to 0x55 ack data: 0x9D 0x0D
    
    write to 0x55 ack data: 0x0C 
    read to 0x55 ack data: 0x00 0x00
    
    write to 0x55 ack data: 0x28 
    read to 0x55 ack data: 0xAF 0x0B

    我在 ACC 非密封模式下运行。 测量仪表启动停止没有改变我尝试过的任何东西。

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

    您好!

    这看起来很奇怪。 您能否确认感应电阻器位于电流路径中、并可能尝试更大的测试电流? 我现在唯一可以检查的另一件事是使用您的逻辑分析仪的0x0C、以查看是否正确发送了该值。  

    我们无法调试代码本身、但我们可以帮助处理该行为。 如果您可以确认电压是在检测电阻器上、并且命令已正确发送、我们可以排除许多可能性。

    谢谢、

    Alex M.

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

    我重试了使用100欧姆电阻器。 我确实在电阻器的末端测量了相同的电池电压。 使用万用表测得的 mA 为34mA bq35100报告的电流为0mA。 电阻器的连接方式如[www.ti.com/.../sluubh7.pdf 第5页]所示。 有3个引脚:Bat+ Bat-和 Pack-。 该电阻器连接在 BAT+和 PACK-之间。

    15:12:26.764 -> 421s479:读取两个字节的缓冲区是[0x80、0x40]
    15:12:26.764 -> 421s479:sec 模式未密封


    15:12:26.998 -> 421s698:读取两个字节的缓冲区是[0x29、0xD]
    15:12:26.998 -> 421s698:电压:3369mV


    15:12:27.139 -> 421s817:读取两个字节的缓冲区为[0x0、0x0]
    15:12:27.139 -> 421s817:读取电流0
    15:12:27.139 -> 421s817:电流:0


    15:12:27.233 -> 421s936:读取两个字节的缓冲区是[0xA6、0xB]
    15:12:27.233 -> 421s936:温度:25°C

    逻辑分析仪的输出已连接到第一个帖子。它正在发送0x0c、但报告返回0x00。

    编辑:

    在移动代码一个位后、我注意到一些奇怪的东西:

    我只能在我启动并停止测量仪表后测量电流。这是打算吗?

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

    您好!

    很抱歉、我没有注意到这些来自逻辑分析仪。 无论如何、我认为出现在 gauge 停止之后的数据可能会解释问题。 我认为您轮询器件的速度可能太快。 发出 Gauge STOP 命令后、监测计将完成它正在执行的任何任务。 我建议在发送监测计启动信号和发送命令读取值之间增加1秒或更长时间的延迟。 尝试一下、让我知道它是否有用。

    谢谢、

    Alex M.

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

    1s 没有发生任何变化、因为我在 gauge 开始后已经有1秒的延迟:

    	/////////////////// GAUGE START ///////////////////
    		status = BAT_Gauge_Start(&hbat1);
    		if (status != BAT_OK) {
    			APP_LOG(TS_ON, VLEVEL_L, "[BAT] error start gauge\r\n");
    		}
    		HAL_Delay(1000); //let it measure for 1 sec

    但是、我可以在监测计停止后测量电流。 这可能是目的吗?

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

    您好!

    我在 EVM 上进行了测试以验证行为;以下是 ACC 模式下的预期结果:

    • 在发送 Gauge 开始时启用测量
    • 当监测 计处于 Gauge 停止/Gdone 中时、不进行电流/温度/电压测量。 但是、它将继续报告寄存器中的最后一个值。 由于电压/温度变化不会很快、因此即使没有变化、它仍在测量这些电压/温度。

    因此、您应该能够读取监测计_START 中的电流。 请确保您的监测计处于 ACC 模式、并尝试轮询电流、以增加/增加更多延迟、因为您应该能够看到它。 当您单击 Gauge 停止时、它将继续报告它看到的最后一个电流值、这就是为什么我认为可能会出现延迟的原因。  

    为了确认是否出现这种情况、您可以尝试在发出 gauge 停止命令后移除负载、并查看监测计是否更新其读数以反映这种情况、或者它是否继续报告负载电流。

    但我在发送 gauge 开始后能够读取电路板上的电流、因此请使用设置仔细检查所有内容。 如果仍然不起作用、您能否共享您用于感应电阻器的值?

    谢谢、

    Alex M.