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.

[参考译文] BQ76952:BQ76952芯片和 Arduino:温度测量不起作用

Guru**** 2448780 points
Other Parts Discussed in Thread: BQ76952

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1257063/bq76952-bq76952-chip-and-arduino-temperature-measurements-not-functioning

器件型号:BQ76952

您好!

我将 BQ76952芯片与 Arduino 相结合用于电池监控。 BQ 芯片与 Arduino 之间的通信通过 I2C 得以促进。 我将利用 DFETOFF、DCHG、DDSG、TS1和 TS3引脚在180k 温度模型中进行温度测量。 遗憾的是、测量无法正常工作、我只在定义的寄存器上读取到0值。 如果有任何帮助,我将不胜感激。 电池电压和电流测量效果良好。 我将使用的配置设置代码如下所示。

谢谢!

#include "bq769x2.h"    // Library header for TI BQ76952
#include <CAN.h>
#define BMS_ALERT_PIN 7     // attached to interrupt INT0
#define BMS_BOOT_PIN 8      // connected to TS1 input
#define BMS_I2C_ADDRESS 0x08 //
#define SET_CFGUPDATE 0x0090
#define EXIT_CFGUPDATE 0x0092
#define RESET_BQ 0x0012
#define RESET_COULOMBS 0x0082


bq769x2 BMS(bq76952, BMS_I2C_ADDRESS);    // BMS object

BMS.CommandSubcommands(RESET_BQ);

BMS.CommandSubcommands(SET_CFGUPDATE);



//****Battery Configuration****
BMS.SetRegister(0x9304,0x81FF,2);
delay(10);


//****Temperature Measurement****

//Pin Config

//DFETOFF
BMS.SetRegister(0x92FB,0x5B,1); //0b01011011 for 180k pull-up
delay(10);

//DCHG
BMS.SetRegister(0x9301,0x5B,1); //0b01011011 for 180k pull-up
delay(10);

//DDSG
BMS.SetRegister(0x9302,0x5B,1); //0b01011011 for 180k pull-up
delay(10);

//TS1
BMS.SetRegister(0x92FD,0x5B,1); //0b01011011 for 180k pull-up
delay(10);

//TS3
BMS.SetRegister(0x92FF,0x5B,1); //0b01011011 for 180k pull-up
delay(10);

//180k Temp Model Coefficient Config

//Coeff a1
BMS.SetRegister(0x9200,0x8000,2);
delay(10);

//Coeff a2
BMS.SetRegister(0x9202,0xFFFF,2);
delay(10);

//Coeff a3
BMS.SetRegister(0x9204,0xFFFF,2);
delay(10);

//Coeff a4
BMS.SetRegister(0x9206,0x7FFF,2);
delay(10);

//Coeff a5
BMS.SetRegister(0x9208,0x3FFF,2);
delay(10);

//Coeff b1
BMS.SetRegister(0x920A,0xEA5A,2); 
delay(10);

//Coeff b2
BMS.SetRegister(0x920C,0x2670,2); 
delay(10);

//Coeff b3
BMS.SetRegister(0x920E,0xE5B3,2);
delay(10);

//Coeff b4
BMS.SetRegister(0x9210,0x1281,2);
delay(10);

//Adc0
BMS.SetRegister(0x9214,0x435E,2);       // Defaul 17246 (0x435E)
delay(10);

Serial.println("Initializing BQ76952...30%...");

//Offset Calibration  


//Default 0x00. Range 0x80 to 0x7F  (8-bit signed integer --> from -128 [0.1degreeC] to 127 [0.1degreeC])

//DFETOFF
BMS.SetRegister(0x91CC,0x00,1); 
delay(10);

//DCHG
BMS.SetRegister(0x91D2,0x00,1); 
delay(10);

//DDSG
BMS.SetRegister(0x91D3,0x00,1); 
delay(10);

//TS1
BMS.SetRegister(0x91CE,0x00,1); 
delay(10);

//TS3
BMS.SetRegister(0x91D0,0x00,1);
delay(10);


//****Current Measurement Calibration****

//CC Gain 
BMS.SetRegister(0x91A8,0x40EF41F2,4); //Default 0x40EF41F2. Range from 0x3C23D70A to 0x447A0000 (32-bit single precision floating point) 
delay(10);

//Capacity Gain
BMS.SetRegister(0x91AC,0x4A081C6A,4); //Default 0x4A081C6A. Range from 0x453A69EC to 0x4DC7F0A5 (32-bit single precision floating point) 
delay(10);

//Board Offset
BMS.SetRegister(0x91C8,0x0000,2);
delay(10);
//

//****Protection**** 


//all protections disabled!

//Min Blow Fuse Voltage
BMS.SetRegister(0x9231,0x7FFF,2);
delay(10);


//Enabled Protections A
BMS.SetRegister(0x9261,0x00,1);
delay(10);

//Enabled Protections B
BMS.SetRegister(0x9262,0x00,1);
delay(10);

//Enabled Protections C
BMS.SetRegister(0x9263,0x00,1);
delay(10);

//CHG FET Protections A
BMS.SetRegister(0x9265,0x00,1);
delay(10);

//CHG FET Protections B
BMS.SetRegister(0x9266,0x00,1);
delay(10);

//CHG FET Protections C
BMS.SetRegister(0x9267,0x00,1); 
delay(10);

//DSG FET Protections A
BMS.SetRegister(0x9269,0x00,1);
delay(10);

//DSG FET Protections B
BMS.SetRegister(0x926A,0x00,1); 
delay(10);

//DSG FET Protections C
BMS.SetRegister(0x926B,0x00,1);
delay(10);

//****DA Configuration****
//User defined units to report stack voltage and battery current are configured as CentiVolt and CentiAmp respectively to prevent 16-bit CAN signal overflow. (refer to message BATT in BMS_Teststand.dbc)

BMS.SetRegister(0x9303,0x06,1);
delay(10);

// Power Config: Disable Sleep
BMS.SetRegister(0x9234,0x2882,2);     // Default 0x2982
delay(10);

BMS.CommandSubcommands(EXIT_CFGUPDATE);

}

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

    尊敬的 Alexis:

    您能否共享您的 SetRegister 和 ReadRegister 功能以及涉及热敏电阻和温度感测引脚的原理图?

    观察您对 DFETOFF、TS1、TS3等寄存器的配置、所选的值看起来是正确的。 但是、我对您是如何得出系数值感到好奇。 如果您使用180K 设置、则应能够使用系数中预配置的值、而不必对其进行编程。

    此致!

    A·内德尔费尔德

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

    尊敬的 Asher:

    感谢您的答复。 我有一个200K 的 NTC 热敏电阻。 我看到了用于获取热敏电阻模型系数的新文档和工具。 我使用 TI 电量监测参数计算器(GPC)工具计算了新值、并更新了代码中的热敏电阻值。 我仍然 有同样的问题。 TI 计算得出的系数为:

    搜索完成、bestmaxerr = 35.60000000000002
    BESTA [A1 A2 A3 A4 A5]= [- 32768 - 32768 - 27530 - 16617 -   15]
    BestB [B1 B2 B3 B4]= [6951 10627 5837 4114]
    ADC0 = 17246

    其实还有一个问题、就是 BQ-Chip 在空闲期间会进入睡眠状态(2个小时后没有进行任何更新)、并且无法再次将其唤醒。 我必须通过将设置重新刷新到 BQ-Chip 来重新启动 Arduino。 Im 尝试通过电源配置禁用睡眠模式:


    bms。 SetRegister (0x9234、0x2882);    //默认值0x2982
    延迟(10);

    如果您可以检查我的实际代码并向我提供一些建议、我将不胜感激:

    e2e.ti.com/.../1460.sketch_5F00_canHost.zip

    提前感谢

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

    我的系统中有 Semitec 204AP-2热敏电阻。 我还尝试使用默认模型(不手动定义系数)。 遗憾的是、结果没有变化。 我看到 CAN 总线上始终有 FFD8作为所有热敏电阻的温度值。
    ----------------

    尊敬的 Asher:

    感谢您的答复。 我有一个200K 的 NTC 热敏电阻。 我看到了用于获取热敏电阻模型系数的新文档和工具。 我使用 TI 电量监测参数计算器(GPC)工具计算了新值、并更新了代码中的热敏电阻值。 我仍然 有同样的问题。 TI 计算得出的系数为:

    搜索完成、bestmaxerr = 35.60000000000002
    BESTA [A1 A2 A3 A4 A5]= [- 32768 - 32768 - 27530 - 16617 -   15]
    BestB [B1 B2 B3 B4]= [6951 10627 5837 4114]
    ADC0 = 17246

    其实还有一个问题、就是 BQ-Chip 在空闲期间会进入睡眠状态(2个小时后没有进行任何更新)、并且无法再次将其唤醒。 我必须通过将设置重新刷新到 BQ-Chip 来重新启动 Arduino。 Im 尝试通过电源配置禁用睡眠模式:


    bms。 SetRegister (0x9234、0x2882);    //默认值0x2982
    延迟(10);

    如果您可以检查我的实际代码并向我提供一些建议、我将不胜感激:

    提前感谢

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

    尊敬的 Alexis:

    您是否确定器件已进入睡眠模式而不是关断模式? 当器件处于睡眠状态时、应该可以与该器件通信、但需要通过将 TS2驱动为低电平来退出 SHUTDOWN 模式来唤醒该器件。 您遇到的情况更像是器件处于关断状态。 您能否检查将 TS2短接至 GND 是否足以退出它?

    我们不会在 E2E 上执行全部代码审核。 但是、如果您有某些希望我查看的函数、我很乐意这样做。 TI 为 STM32和 TM4C 微控制器提供的代码是一项可能值得关注的资源。 虽然与 Arduino 不同、但他们应了解应如何对器件进行编程。 可以 在此处找到代码。 您还能否分享原理图? 它始终有可能是硬件错误。

    此致!
    A·内德尔费尔德

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

    您好 Asher:

    感谢您的答复。 我昨天禁用了睡眠模式、系统仍在工作。 问题似乎得到了解决。 因为看到整个代码不能检查、所以和大家分享温度测量的相关函数、如果能检查会很高兴。  

    引脚配置:

    //Pin Config
    
    //DFETOFF
    BMS.SetRegister(0x92FB,0x5B,1); // 0b01011011 -- 0x5B for 180k pull-up / 0b00001011 -- 0x0B for 18k pull-up
    delay(10);
    
    //DCHG
    BMS.SetRegister(0x9301,0x5B,1); // 0b01011011 -- 0x5B for 180k pull-up / 0b00001011 -- 0x0B for 18k pull-up
    delay(10);
    
    //DDSG
    BMS.SetRegister(0x9302,0x5B,1); // 0b01011011 -- 0x5B for 180k pull-up / 0b00001011 -- 0x0B for 18k pull-up
    delay(10);
    
    //TS1
    BMS.SetRegister(0x92FD,0x5B,1); // 0b01011011 -- 0x5B for 180k pull-up / 0b00001011 -- 0x0B for 18k pull-up
    delay(10);
    
    //TS3
    BMS.SetRegister(0x92FF,0x5B,1); // 0b01011011 -- 0x5B for 180k pull-up / 0b00001011 -- 0x0B for 18k pull-up
    delay(10);
    


    180k 模型系数:

    //180k Temp Model Coefficient Config
    
    //Coeff a1
    BMS.SetRegister(0x9200,0x8000,2); // -32768
    delay(10);
    
    //Coeff a2
    BMS.SetRegister(0x9202,0x8000,2);  // -32768
    delay(10);
    
    //Coeff a3
    BMS.SetRegister(0x9204,0x9476,2); // -27530
    delay(10);
    
    //Coeff a4
    BMS.SetRegister(0x9206,0xBF17,2); // -16617 
    delay(10);
    
    //Coeff a5
    BMS.SetRegister(0x9208,0xFFF1,2); // -15
    delay(10);
    
    //Coeff b1
    BMS.SetRegister(0x920A,0x1B27,2); // 6951
    delay(10);
    
    //Coeff b2
    BMS.SetRegister(0x920C,0x2983,2); // 10627
    delay(10);
    
    //Coeff b3
    BMS.SetRegister(0x920E,0x16CD,2); // 5837
    delay(10);
    
    //Coeff b4
    BMS.SetRegister(0x9210,0x1012,2); //  4114
    delay(10);
    
    //Adc0
    BMS.SetRegister(0x9214,0x435E,2);  // 17246 
    delay(10);

    //Offset Calibration  
    
    
    //Default 0x00. Range 0x80 to 0x7F  (8-bit signed integer --> from -128 [0.1degreeC] to 127 [0.1degreeC])
    
    //DFETOFF
    BMS.SetRegister(0x91CC,0x00,1); 
    delay(10);
    
    //DCHG
    BMS.SetRegister(0x91D2,0x00,1); 
    delay(10);
    
    //DDSG
    BMS.SetRegister(0x91D3,0x00,1); 
    delay(10);
    
    //TS1
    BMS.SetRegister(0x91CE,0x00,1); 
    delay(10);
    
    //TS3
    BMS.SetRegister(0x91D0,0x00,1);
    delay(10);



    如何读取温度值:



    void bq769x2::updateTemperatures(int tempOffset_DFETOFF,int tempOffset_DCHG,int tempOffset_DDSG,int tempOffset_TS1,int tempOffset_TS3)
    {
    
    int adcVal = 0;
      
        adcVal = (readRegister(0x6D) << 8) | readRegister(0x6C);  // Dfetoff
        //temperature = adcVal + tempOffset_DFETOFF;  // 0.1*Kelvin
        temperature = adcVal;  // 0.1*Kelvin
        adcVal = (readRegister(0x79) << 8) | readRegister(0x78);  // Dchg   
        //temperatureA = adcVal + tempOffset_DCHG;  // 0.1*Kelvin
        temperatureA = adcVal;  // 0.1*Kelvin
        adcVal = (readRegister(0x7B) << 8) | readRegister(0x7A);  // Ddsg
        // temperatureB = adcVal + tempOffset_DDSG;  // 0.1*Kelvin
        temperatureB = adcVal;  // 0.1*Kelvin
        adcVal = (readRegister(0x71) << 8) | readRegister(0x70);  // TS1
        //temperatureC = adcVal + tempOffset_TS1;  // 0.1*Kelvin
        temperatureC = adcVal;  // 0.1*Kelvin
        adcVal = (readRegister(0x75) << 8) | readRegister(0x74);  // TS3
        //temperatureD = adcVal + tempOffset_TS3;  // 0.1*Kelvin	
        temperatureD = adcVal;  // 0.1*Kelvin  
      }
    
    

    谢谢!

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

    现在它的关闭:)我想现在它关闭了。 我是否也可以禁用关断模式?

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

    以及用于读取寄存器的代码:

    int bq769x2::readRegister(byte address)
    {  
      Wire.beginTransmission(I2CAddress);
      Wire.write(address);
      Wire.endTransmission();
      Wire.requestFrom(I2CAddress, 1);
      return Wire.read();
    }

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

    尊敬的 Alexis:

    如果将 TS2拉至 GND、器件将永远无法关断。 您还可以配置寄存器、以便某些故障不会触发关断、如 Power:Shutdown:Shutdown Cell Voltage。 您是否知道导致器件进入 SHUTDOWN 模式的原因。

    一种可能有助于稳定意外关断的方法是在 RST_SHUT 引脚上添加一个电容器下拉电阻器。 正如您目前所做的那样、当按钮未按下时、引脚处于悬空状态。

    另一项需要检查的是、查看您在请求数据时看到的 I2C 信号。 下面显示了读取内部温度的典型波形。 如果您可以使用逻辑分析仪、那么在发送命令时查看是否看到类似的波形将很有帮助。 此外、您是否在器件上禁用了 CRC? 我看到您有一个 I2C 写入函数、但我不确定是否考虑了它。

    此致!
    A·内德尔费尔德

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

    尊敬的 Asher:

    谢谢你。 我将尝试禁用关断功能。 您对温度测量有什么建议吗? 遗憾的是、我在定义的寄存器上读取的值仍然为0。

    谢谢!
    棱镜  

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

    尊敬的 Alexis:

    您是否能够共享为读取电池电压而发送的 I2C 消息的逻辑分析仪捕捉? 这将有助于我确定问题在您的代码中发生的位置。 此外、您能否确认您已在器件上禁用 CRC? 我不确定 Arduino Read ()函数将如何响应 CRC 的额外字节。

    您是否能够禁用关断功能?

    此致!
    A·内德尔费尔德