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.

[参考译文] BQ27426:不进行电量监测

Guru**** 2493565 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1485553/bq27426-not-gauging

器件型号:BQ27426

工具与软件:

嘿、我遇到一个问题、那就是所使用的电量计在软复位后不会更新充电状态。  

以下代码是我现在如何配置电量计的代码:

retval BQ27426::InitModule()
{
    CHECK_RV(i2c_master_.Probe(kI2cAddress, 100_ms, 5_ms));

    CHECK_RV(ControlSubCommandWrite(CNTLData::kUnseal));
    CHECK_RV(ControlSubCommandWrite(CNTLData::kUnseal));
    
    uint16_t battery_capacity_ = 40;
    uint16_t design_energy_ = 148;
    uint16_t terminate_voltage_ = 3000;
    uint16_t taper_rate_ = 500;
    
    static const uint8_t kDesignCapcityOffset = 6;
    static const uint8_t kOpConfigDOffset = 4;
    static const uint8_t kTaperRateOffset = 21;
    static const uint8_t kOpConfigDChemistryMask = 0x08; // Set Chem ID to 1202
    
    static const uint8_t kBatLowEnMask = 0x7D;
    static const uint8_t kGpioPolMask = 0x6C;
    static const uint8_t kOpConfig3Mask = 0xDF;
    

    // Set battery configurations, these are all located after each other in the memory
    etl::array<int16_t, 3> capacity_config({battery_capacity_, design_energy_, terminate_voltage_});
    CHECK_RV(SetConfiguration(
        FlashSubclass::kState, kDesignCapcityOffset,
        etl::span<uint8_t>((uint8_t *)capacity_config.begin(), sizeof(uint16_t) * 3), false));

    CHECK_RV(SetConfiguration(FlashSubclass::kState, kTaperRateOffset,
                              etl::span<uint8_t>((uint8_t *)&taper_rate_, sizeof(uint16_t)),
                              false));

    // Set battery chemistry
    etl::array<uint8_t, 1> chemistry_config({kOpConfigDChemistryMask});
    CHECK_RV(SetConfiguration(FlashSubclass::kRegisters, kOpConfigDOffset, chemistry_config, true));

    // Enable interrupt on capacity and pin output
    etl::array<uint8_t, 4> pin_config({kGpioPolMask, kBatLowEnMask, 0x00, kOpConfig3Mask});
    CHECK_RV(SetConfiguration(FlashSubclass::kRegisters, 0, pin_config, true));

    CHECK_RV(ControlSubCommandWrite(CNTLData::kChemB));

    // Make the sensor operational
    CHECK_RV(ControlSubCommandWrite(CNTLData::kSoftReset));

    // Wait for flag to reset
    // Somehow waiting for flag does not work. flag is always set
    // Just wait for 1 sec here
    vTaskDelay(1000);

    CHECK_RV(ControlSubCommandWrite(CNTLData::kSealed));

    /* force the BAT_DET bit to one */
    CHECK_RV(ControlSubCommandWrite(CNTLData::kBatInsert));

    is_initialized_ = true;
    return retval::kSuccess;
}

读回寄存器的所有值都设置正确。

使用的确切元件: BQ27426YZFR

电量监测计从不更新充电阶段寄存器。 只能在软复位之后执行。  

我不知道现在该怎么做来解决这个问题。 有什么建议吗?  

敬上、迪德  

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

    Diede、您好!

    请允许我花些时间来研究这个问题。

    此致、

    Adrian