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.

[参考译文] BQ25622:如何在不连接电池的情况下从电池充电器获得稳定的功率输出

Guru**** 2535750 points
Other Parts Discussed in Thread: BQ25622

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1394546/bq25622-how-to-get-a-stable-power-output-from-the-battery-charger-without-connecting-battery

器件型号:BQ25622

工具与软件:

我们在 系统中将 BQ25622用于电池充电应用。 它从5V 降压转换器接收输入电压 VBUS (5V0_MAIN)。 我们的系统(AM62、Wi-Fi、GSM、GPS 等)由"VMAIN_SYS"供电。 我们有要求、在系统中的哪些部分应在有电池或无电池时工作、以便默认情况下电池充电器将处于充电器启用模式。 您能否建议在未插入电池时如何在"VMAIN_SYS"处获得稳定功率。 由于我们在加载 Wi-Fi 映像时面临系统重新启动问题、因此 SIM 卡插入(系统中不存在电池时)。

  

CE、I2C、INT、STAT 引脚连接到 AM62处理器

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

    您好!

    每当未连接电池时、请禁用寄存器中的充电。

    此致、

    Mike Emanuel

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

    Michael、您是否指的是寄存器(EN_CHG)。 如果需要、请让我们知道除了"EN_CHG"之外、还需要禁用哪些寄存器以在无电池的情况下实现稳定电源

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

    您好!

    是、通过设置 CHG_EN = 0设置充电禁用。

    此致、

    Mike Emanuel

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

    尊敬的  Mike Emanuel:

    在这里,我想带来2个场景.

    案例1:仅连接外部电源时、GSM 和 WIFI 模块会重新启动系统。

    案例2:仅连接电池时、GSM 和 Wifi 工作正常(不重新启动系统)

    案例3:连接电池和外部电源时、系统也不会重新启动

    谢谢!

    纳雷什

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

    纳雷什、您好!  

    案例1:连接电池后、GSM 和 WIFI 模块会重新启动系统。

    您能否帮助提供案例1的一些其他详细信息?  

    -在这种情况下,是只连接电池还是同时连接 VBUS 输入和电池?  

    -在情况1中、BQ25622的寄存器配置是什么?  

    此致、

    Garrett

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

    你(们)好

    =>如果只有外部电源(12V)提供给系统(未连接电池)、则 GSM 和 Wifi 会重新启动系统。 但如果我们从设备树文件中禁用电池节点、则不会发生重启、但电池无法按预期进行检测)。

    =>仅连接电池(无外部电源)时、系统不会重新启动  

    =>当外部电源和电池连接接通时,在这种情况下,系统也不会重新启动  

    所以,我们正在得到的问题,当只连接外部电源.

    我可以知道我应该检查哪一个寄存器吗? 请建议。

    当电池和外部电源均已连接时、检查了寄存器 I 以下的情况。

    寄存器16 - 0xa0

    寄存器17 - 0x4f

    寄存器18 - 0x4

    寄存器19 - 0xc4

    寄存器1e - 0x0c

    谢谢!

    纳雷什

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

    纳雷什、您好!  

    感谢您的答复和进一步的澄清。  

    当只有外部电源(12v )馈入系统时(电池未连接), GSM 和 Wifi 会重新启动系统。 但是、如果我们从设备树文件中禁用电池节点、则不会发生重启事件[/QUOT]

    请帮助确认我的理解是否正确。 如果您根据本主题前面的 TI 建议禁用充电、您可以看到重新启动系统没有问题? 如果是这样、则 BQ25622似乎能够按预期正常工作、我不需要您进一步检查任何寄存器。

    当未连接电池时、必须禁用充电以确保 SYS 输出得到适当调节。  

    然后重启不会发生、但电池未按预期检测到

    BQ25622没有内置功能来自动检测电池是否存在。 如果您有兴趣、我可以帮助您提供一个算法示例、说明如何使用主机 MCU 和 bQ25622寄存器执行电池检测。  

    此致、

    Garrett  

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

    大家好、Garrett:

    美好的一天!! 希望您做得好!

    感谢你的答复、我是阿马纳特先生、代表我的队友纳雷什先生回答这一问题。

    Garrett、如果您可以为我们提供一个算法示例、说明如何使用主机 MCU 和 BQ25622寄存器执行电池检测、并根据电池检测 、我们还需要将 CE 引脚设置为高电平/低电平(I、E:充电功能已启用/已禁用)、会大有裨益。

    同时、我们还遇到另一个问题、例如、当我们尝试通过硬件将 CE 引脚上拉至高电平时、我们无法检测 i2c 总线中的电池充电器 IC (BQ25622)、因此我们无法读取电池的运行状况来为电池充电。 但我希望您的电池检测算法也能解决这个问题。 请多多指教。

    谢谢你。

    此致
    Amarnath G.

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

    尊敬的 Amarnath:  

    感谢您的答复。 请查看我的以下评论。  

    下图是您可以使用主机 MCU 和 BQ25622实现的电池检测算法示例。 我想指出几个问题。  

    • 您可以通过 I2C 随意将/CE 引脚拉至高电平/低电平或写入"EN_CHG"位来禁用/启用充电。 您不需要同时执行这两个操作、因此您可以选择 对您的系统更方便的操作。  
    • 第2部分步骤1中的寄存器配置旨在缓解启用充电且无电池时 SYS 输出的不稳定情况。 电池检测算法完成后、步骤1中修改的各种设置应设置回正常运行所需的值。

    如果您对电池检测算法示例有任何后续问题、敬请告知。

    [报价 userid="591486" url="~/support/power-management-group/power-management/f/power-management-forum/1394546/bq25622-how-to-get-a-stable-power-output-from-the-battery-charger-without-connecting-battery/5403329 #5403329"]虽然我们还有另一个问题、例如当我们尝试通过硬件将 CE 引脚上拉至高电平时、我们无法检测到 i2c 总线中的电池充电器 IC (BQ25622)、因此无法读取电池的健康状况来为电池充电。

    将/CE 引脚拉高以禁用充电不会对 I2C 通信产生任何影响。 我已经验证 BQ25622仍然可以通过 I2C 与 MCU 主机通信、且/CE 拉至高电平。 基于此、在您所描述的情况中、BQ25622 IC 外部会阻止 I2C 通信。  

    此致、

    Garrett

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

    大家好、 Garrett:

    感谢您提供相关信息。

    我们实施了电池算法第1部分,其中我们注意到 下面提到的例子中的"Vbat_ADC 值来自寄存器0x30 ".

    我们使用电池(3.7伏、1000mA) 和外部电源(12伏)测试了以下用例。

    案例1: 仅使用外部电源:

    我们持续获取 VBAT_ADC 读数和其他寄存器值、我们观察到 VBAT ADC 值在重启时发生变化、如果再次读取、该值保持不变。   请找到我们获取 VBAT_ADC 读数的关联日志。

    e2e.ti.com/.../only_5F00_power_5F00_supply.txt

    案例2:带电池+外部电源  

    我们连续读取" Vbat_Adc "读数,但我们观察到,即使重新启动,该值也是恒定的。 请找到我们获取 VBAT_ADC 读数的关联日志

    e2e.ti.com/.../battery_5F00_plus_5F00_power_5F00_supply.txt

    案例3:仅使用电池

    我们采用 " Vbat_adc "连续读数, 但我们观察到,即使我们重新启动,这个值是恒定的。 请找到 我们获取 VBAT_ADC 读数的关联日志

    e2e.ti.com/.../only_5F00_battery.txt

    请查找电池算法 part1代码   

    static int bq2562x_detect_work(struct bq2562x_device *bq) {
            int ret;
            //static int count = 0;
            int vbat_a_lsb, vbat_a_msb;
            u16 vbat_adc_value;
            int en_chg_value, ibat_dis_value;
            const u8 undervoltage_threshold = 0x20;
            const u8 no_battery_threshold = 0x10;
            int dis_term;
    
            //*******************************
            //***** ALGORITHM PART 1 ********
            //*******************************
    
            //step 1
            // 0x16 register 5th bit to clear
             en_chg_value = i2c_smbus_read_byte_data(bq->client, BQ2562X_EN_CHG_REG);
             en_chg_value |= (1 << 5);
             i2c_smbus_write_byte_data(bq->client, BQ2562X_EN_CHG_REG, en_chg_value);
    
            en_chg_value = i2c_smbus_read_byte_data(bq->client, BQ2562X_EN_CHG_REG);
    
            pr_info("monika: part1 : before clearing 5th bit of EN_CHG register value: 0x%02x\n", en_chg_value);
            en_chg_value &= ~(1 << 5);
            ret = i2c_smbus_write_byte_data(bq->client, BQ2562X_EN_CHG_REG, en_chg_value);
            en_chg_value = i2c_smbus_read_byte_data(bq->client, BQ2562X_EN_CHG_REG);
            pr_info("monika: part1 : After clearing 5th bit EN_CHG register value: 0x%02x\n", en_chg_value);
    
            //step 2
            //0x16 register 6th bit clear
            ibat_dis_value  = i2c_smbus_read_byte_data(bq->client, BQ2562X_FORCE_IBATDIS_REG);
            pr_info("monika: part1 : reading BQ2562X_FORCE_IBATDIS_REG register value: 0x%02x\n", ibat_dis_value);
            ret = i2c_smbus_write_byte_data(bq->client, BQ2562X_FORCE_IBATDIS_REG, ibat_dis_value | (6 << 0x1) );
    
            ibat_dis_value  = i2c_smbus_read_byte_data(bq->client, BQ2562X_FORCE_IBATDIS_REG);
            pr_info("monika: part1 : setting 6th bit of BQ2562X_FORCE_IBATDIS_REG register value: 0x%02x\n", ibat_dis_value);
    
            //step 3
            usleep_range(5000, 5100);
            
             //step 4
            // 0x16 register set
            ibat_dis_value = i2c_smbus_read_byte_data(bq->client, BQ2562X_FORCE_IBATDIS_REG);
            ibat_dis_value &= ~(1 << 6);
            i2c_smbus_write_byte_data(bq->client, BQ2562X_FORCE_IBATDIS_REG, ibat_dis_value );
            ibat_dis_value = i2c_smbus_read_byte_data(bq->client, BQ2562X_FORCE_IBATDIS_REG);
            pr_info("monika: part1 :after clearing 6th bit of BQ2562X_FORCE_IBATDIS_REG value: 0x%02x\n", ibat_dis_value);
    
            //step 5
            //0x26 register , enable 6th and 7th bit
            vbat_adc_value = i2c_smbus_read_byte_data(bq->client, BQ2562X_ADC_REG);
            pr_info("monika: part1 : before enabling 6th and 7th bit of BQ2562X_ADC_REG register value: 0x%02x\n", vbat_adc_value);
            // Set ADC to one-shot mode-> ADC_RATE and enable ADC_EN
            ret = i2c_smbus_write_byte_data(bq->client, BQ2562X_ADC_REG, vbat_adc_value | ((1 << 6) | (1 << 7))); // ADC_RATE=1, ADC_EN=1
            vbat_adc_value = i2c_smbus_read_byte_data(bq->client, BQ2562X_ADC_REG);
            pr_info("monika: part1 : after setting 6th and 7th bit of BQ2562X_ADC_REG register value: 0x%02x\n", vbat_adc_value);
    
            //step 6
            //0x30 register
            vbat_a_lsb =  i2c_smbus_read_byte_data(bq->client, BQ2562X_ADC_VBAT_LSB );
            vbat_a_msb =  i2c_smbus_read_byte_data(bq->client, BQ2562X_ADC_VBAT_MSB );
            vbat_adc_value = ((vbat_a_msb << 8) | vbat_a_lsb) >> BQ2562X_ADC_VBAT_MOVE_STEP;
            vbat_adc_value = vbat_adc_value * BQ2562X_ADC_VBAT_STEP_uV;
            pr_info("monika: vbat_adc_value value: %ld\n", vbat_adc_value);
    
            //FIX it below code
            //
            //
            //
            // Check if VBAT ADC value indicates a valid battery
    }
    

    "那是什么 电池欠压阈值   以及可能的预期结果 VBAT_ADC 值的范围

    请提供您的意见/建议。

    谢谢!

    纳雷什

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

    纳雷什、您好!  

    请查看我的以下评论。  

    如果您仅连接了电池、预计 VBAT_ADC 将相对恒定。 电池放电时、它的功耗会随着时间的推移而降低。 对于仅使用外部电源的情况、如果禁用了充电、则 VBAT_ADC 应该保持恒定。  

    您是否已确认从 REG0x30读取的 VBAT_ADC 值与测试中的预期电池电压相匹配? 预期范围是从特定电池的完全放电电压到锂离子电池的完全充电电压、通常为4.2V。

    电池欠压阈值是您的电池/系统所独有的、因此在幻灯片中没有对其进行定义。 BQ25622具有下降阈值为2.2V 的内置电池欠压保护、但客户通常会使用外部电池保护器、从而在较高电压下将电池与充电器 IC 断开。  

    此致、

    Garrett

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

    纳雷什、您好!  

    您共享的结果表明算法运行正常。 下面还有一些其他建议。  

    1) 1)对于只连接电池的情况3、您不需要运行算法。 只需在连接输入适配器后运行算法。 如果您希望简化实现、则可以在 BQ25622器件指示 VBUS_STAT 寄存器中没有适配器时跳过电池检测算法(REG0x1E[2:0]= 000b)。  

    2) 2)我还建议在电池电量耗尽的情况下进行测试、以便您可以验证该算法是否有效来正确检测电池电量耗尽的情况。

    此致、

    Garrett  

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

    嗨 Garret

    感谢您的答复。

    我会检查提供的评论,并回到你这个.

    谢谢、Naresh

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

    嗨 Garret

    我们在电池无电+外部电源连接在一起的情况下验证了电池充电器测试、如下所示。

    电源+无电电池(38000 u 伏电池电压):

    我们已经测试了电池电量耗尽(38000 uVolts 电池电压 )+外部电源,然后电池算法 初始 Vbat_ADC 值 在第1部分显示为0伏,然后根据条件(如果 VBAT_ADC < 1V ),它进入第2部分,然后给出结果为"没有有效电池连接,保持充电禁用"  

    请查看随附的日志  

    e2e.ti.com/.../dead_5F00_battery_5F00_plus_5F00_supply_5F00_logs.txt

    查询:  

    1. 作为无电电池有 电池电压38000 uV 和 Vbat_Adc 显示在第1部分电池算法0伏,然后根据情况 ,它进入第2部分显示38000u 伏,它满足 BATTERY_ADC < 1V 条件,然后给出结果为=>"没有有效的电池连接,保持充电禁用"。 我的查询在这里电池已连接、甚至为什么结果显示"没有连接有效的电池"? 或者我们是否需要测试无电电池的电压是否大于1V 且小于2.2V?
    2. 在上一个线程 case2和 case3中,在电池算法中,它进入第1部分,它读取 VBAT_ADC 值为0伏,并在第2部分 VBAT_ADC 提供非零电压,但在重新启动后,它不会播种0伏。 我的问题是为什么它在第一次读取时显示0伏?
    3. 当我设置和清除此位 (0x16[6])时,即使我在两种情况下都看到相同的寄存器值。

               [2.014575] Monika:第1部分:设置 BQ2562X_FORCE_IBATDIS_REG 寄存器值的第6位:0x88
               [ 2.038485] Monika:第1部分:在清除 BQ2562X_FORCE_IBATDIS_REG 值的第6位后:0x88

    请帮我解决我的问题?

    注意:直到这里,无论我们执行了所有测试案例,没有插入 SIM 并相应地提供结果。

    ====================================================================================================

    但现在,我们通过在 SIM 插槽中插入 SIM 验证了以下3种情况,并相应地提供了结果

    1. 仅使用电池=>系统不会重新启动
    2. 使用电池+电源=>系统不会重新启动
    3. 只有电源=>系统正在重新启动,请找到附加的日志  e2e.ti.com/.../with_5F00_only_5F00_power_5F00_supply_5F00_rebooting_5F00_issue.txt

    如果我错了、请纠正我、并提供您宝贵的意见。

    谢谢、Naresh

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

    纳雷什、您好!  

    请查看我的以下评论。  

    首先、对于您对插入 SIM 卡的测试结果的最后一部分、我们是否可以将其移至新主题、以便我们可以保留2个问题的详细信息? 根据共有的3个用例、这似乎是一个功耗问题、需要进一步调试、但与电池检测算法的实现无关。  

    发布新主题时、您可以帮助提供显示 VBAT、VSYS、VBUS (在电源已连接的情况下)的波形、并在可能的情况下提供系统电流消耗的波形。 谢谢你。  

    以下是我关于在您的系统中实现电池检测算法的评论。  

    我的查询在这里电池已连接、即使为什么结果显示"未连接有效电池"? 或者我们是否需要测试无电电池的电压是否大于1V 且小于2.2V?[/QUOT]

    这和我之前讲过的关于电池的实际欠压阈值的要点有关。 通常情况下、锂离子电池被视为在大约2.5V 左右无电/深度放电、并且不会进一步放电。 一般预期是、当在 BAT 引脚上测得的电压小于1V 时、表示未连接电池或电池保护 IC 开路(意味着电池与 BQ25622的 BAT 引脚断开连接)。

     您需要根据特定电池的预期最小电压为算法设置条件(1V 和2.2V)。 您的系统中允许的最小电池电压是多少? 期望是在算法 VBAT 的第2部分中保护电路闭合>=最小允许的电池电压。  

    在之前的线程 case2和 case3中,在电池算法中,它去了第1部分,它读出 VBAT_ADC 值为0伏,在第2部分 VBAT_ADC 提供非零电压,但在重新启动后,它不会撒出0伏。 我的问题是为什么第一次读取时显示0伏?

    您的 VBAT_ADC 报告= 0表示您正在过早地从寄存器中读取数据。 请确保启用 ADC 和读取 ADC 之间有足够的延时时间。 ADC_DONE_STAT 位(REG0x1D[6])可用于指示 ADC 转换何时完成。 或者、ADC_EN 之后~50ms 的等待时间应该足以让 ADC 以一定的余量完成。  

    当我设置并清除此位 (0x16[6])时、即使我在两种情况下都看到与0x88相同的寄存器值。

    这不是预期行为、我无法在实验室中重复测试。 这似乎是由您的软件实施造成的。 您是否能够在仅修改此寄存器并查看其行为是否符合您需要的情况下运行测试? 值0x88表示可以从默认值充电、但充电器 IC 中的任何设置都不会阻止设置 FORCE_IBATDIS 位。  

    此致、

    Garrett

    [/quote]