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.

[参考译文] BQ27427:电量监测计向后计数、也向后标记

Guru**** 2386620 points
Other Parts Discussed in Thread: BQSTUDIO, BQ27427
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1409677/bq27427-gauge-counts-backwards-flags-backwards-too

器件型号:BQ27427
Thread 中讨论的其他器件:BQSTUDIO

工具与软件:

电量监测计会反向。 我使用的是 TI 的27427 EVM。 电池连接正确、充电器电源连接正确。

"向后":当 I discharge (某些虚拟负载)时、CHG 标志变为高电平、并且电流为正。 当 I CHARGE 时、DSG 变为高电平、电流为负。

TRM 没有提到"CC Gain"。 反正我把它读出来了。 无论我在哪个字节顺序中解释它、该值都是无用的。 CCCAL 块的内容是 0x000x000x0B、0xd40x7f、 0xb40x65、0x4e、...}

发生什么事了? 如何解决此问题?

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

    您好!  

    CC 增益参数的符号可能不正确、请参阅 此 E2E 主题 、了解如何更改 CC 增益参数的符号。

    此致、  

    Robert。  

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

    我不使用 bqstudio。 我在 TRM 和我设法找到的任何其他文档的基础上工作。

    这是一个实际的问题。

    芯片出厂时就具备了这一不良价值。 清除标志以将其变为正是修复程序。 该文档并未在任何地方提及这一点、甚至未记录"CC Gain"寄存器或其格式。

    同时、我找到了更多有关这方面的线程。 我也找到了更多的信息比你已经链接。

    这不是 IEEE 754浮点。 它是一个"Xemics"浮点。 无论是什么。 找到了一个已有21年历史的应用说明、其中包含了用于编码和解码这些内容的*Visual Basic*代码。 到目前为止没有实际规格。

    TI 需要做得更好。

    在星期一,我将发表一篇文章,其中一些插图和 C 代码的可怜的灵魂,将运行在我之后的这个问题。

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

    好的。 我调查了一下。

    "CC Gain"参数位于  CC Cal 类别( 十进制105、0x69)中、偏移量4 (即0x40+4)处、四个字节长。 该值的第二个字节(0x40+5)的高电平位为符号位。 在发出复位命令(0x0041/0x41 0x00)后、其读数为 SET、表示为负值。 该位需要是正的、因此该位需要清除。

    按照应用示例中的过程进行操作、并对其稍作更改。 DataBlockClass (0x3E)需要0x69而不是0x52 (以及他们在其他地方提到的:你需要在 DataBlock()写入后睡眠5ms )。 清除(0x40+5)处的 HIGH 位、 重新计算校验和(或速查并读取它、翻转其 HIGH 位)、然后写入校验和。

    下面是我遇到的值的字节值和 Python 表达式

    CC 增益:Xemics:7F B4 65 4E ->- 2**(-1-24)* 0xB4654E =-0.3523354  

    这是我写的:

    CC 增益:Xemics:7F 34 65 4E ->+ 2**(-1-24)* 0xB4654E =+0.3523354

    现在、电流测量的符号是正确的、监测计的 SOC 随着电荷的增加而增加。

    信息性:浮点值是"Xemics 浮点"格式。 它包含四个字节。 在适用时解释为大端字节序。 AFAICS 不能代表 Inf/NaN、也不能代表值 。 一些 C 代码:

    uint8_t xemics[4]; // read four bytes into this
    
    int exponent = (int)xemics[0] - 128;
    
    int sign = (xemics[1] & 0x80) ? -1 : +1;
    
    uint32_t mantissa = ((xemics[1] & 0x7F) << 16 | xemics[2] << 8 | xemics[3]) | 0x800000;
    // 23 bits of actual bits, plus the implied 1-bit at position 23, making 24 bits
    // 0x800000 is the implied 1-bit of the mantissa, so it looks like 1bbb...bbb
    
    float value = sign * ldexp(mantissa, exponent - 24);
    // -24 so the mantissa is valued like 0.1bbb... (0.5 <= value < 1.0)
    // and then the exponent is applied

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

    因为我在这个论坛上看到了 Python 中发布的一些转换代码、这里是我自己的解释、它完全有效、并检查不兼容的值。

    import math
    import struct
    import numpy as np
    
    def build_xemics(sign, exponent, mantissa):
        assert sign in (0, 1), sign
        assert -128 <= exponent < 128, exponent
        assert mantissa & 0x800000, "where is the leading one?"
        mantissa &= ~0x800000 # clear the leading 1 (implicit)
        assert 0 <= mantissa, "mantissa is negative"
        assert mantissa < 2**23, "mantissa has some bits on integer side"
    
        return bytes([
            exponent + 128,
            ((mantissa >> 16) & 0x7F) | (sign << 7),
            ((mantissa >>  8) & 0xFF),
            ((mantissa >>  0) & 0xFF),
        ])
    
    def xemics_from_fp32(value):
        if np.isinf(value):
            if value > 0:
                return build_xemics(0, 127, 0xFFFFFF)
            else:
                return build_xemics(1, 127, 0xFFFFFF)
        elif np.isnan(value):
            raise ValueError("NaN not supported")
    
        sign = np.signbit(value) # (value < 0) except 0 can have a sign, so this also copies that
        if sign: value = -value
        (mantissa, exponent) = np.frexp(value)
    
        mantissa = np.ldexp(mantissa, 24)
        mantissa = round(mantissa)
    
        if value == 0: # xemics can't express 0.
            exponent, mantissa = -128, 0x800000 # that's closest to 0
    
        # IEEE figures 2^exp * 1.mmm, exp being -126 to +127 (bias 127, special values for -127 and 128)
        # Xemics figures 2^exp * 0.1mmm, exp being -128 to +127 (bias 128, no specials)
        # so IEEE floats can express larger numbers than xemics
        # (2^127 * 1.mmm = 2^128 * 0.1mmm)
        # in that case we can only clip
        if exponent >= 128:
            exponent, mantissa = 127, 0xFFFFFF
    
        assert mantissa & 0x800000 != 0, "by construction, there should have been a leading 1"
        assert mantissa <= 0xFFFFFF, "rounding up was a mistake?"
    
        return build_xemics(sign, exponent, mantissa)
    
    def fp32_from_xemics(value_xemics):
        assert isinstance(value_xemics, (bytes, bytearray))
        assert len(value_xemics) == 4
        exponent = value_xemics[0]
        mantissa = (value_xemics[1] << 16) | (value_xemics[2] << 8) | (value_xemics[3] << 0)
        sign = bool(mantissa & 0x800000) # 0 = positive, 1 = negative
        mantissa |= 0x800000 # implied 1.xxx
        result = np.ldexp(mantissa, exponent - 128 - 24)
        if sign: result = -result
        # result = result.astype(np.float32)
        return result
        
    if __name__ == '__main__':
        value_float = np.float32(np.pi) # any reasonable value
        assert fp32_from_xemics(xemics_from_fp32(value_float)) == value_float
    
        value_xemics = bytes.fromhex("82 49 0f db") # that happens to be pi
        assert xemics_from_fp32(fp32_from_xemics(value_xemics)) == value_xemics

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

    BQ27427是另一个谜题:如果你想写化学 ID、设计能力等东西,不要在写后马上读回。 您需要先选择软复位。 只有在软复位之后、您才会读回刚刚写入的内容。 如果您在软复位之前回读、它将是旧值。 这就像读取有效值。