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.

Optimization cycle in BQ34Z110 ; VOK flag not set

Other Parts Discussed in Thread: BQ34Z110, BQEVSW, BQ34Z100

Hi all,

We are using BQ34Z110 fuel gauge in one of our designs to operate with a 12V 7AH lead acid battery. We have completed the configuration,calibration part & now want to run a optimization cycle.

The problem we are facing is that when we send a IT_enable command, only QEN flag is getting set, but VOK flag is always zero.

Below post suggests 3 conditions for VOK to be set: http://e2e.ti.com/support/power_management/battery_management/f/180/t/159009.aspx

In our case

1) dV/dT<4uV/sec holds good since there is no change in measured voltage.

2) Voltage measured is outside disqualification window

3) Temperature is 31.8C

 

With all these conditions, sending IT_enable command is not setting the VOK flag even though update status register reads 0x04.

Below are the snapshots of DATARAM registers both before & after sending IT_enable command.

Before Sending IT_Enable :

After sending IT_Enable :

One more observation is that, the RUP_DIS flag is always "1" & OCVTAKEN is "0". 

For VOK flag to set is there a need of OCVTAKEN being "1" ? 

Average current is 16mA and we have set quit current to be 40mA. Thus battery should be in relaxation mode.

Is our assumption correct? 

Please suggest.

Thanks,

Suresha N S

  • Hello Suresha,

    From what I have gathered from the post you mentioned, http://e2e.ti.com/support/power_management/battery_management/f/180/t/159009.aspx, it would seem that a complete charge discharge cycle is required in order for you to see a change in this bit.

    Since the date of your post, I will assume several complete cycles have been made.

    Thanks,

  • Suresha

    This looks like it could be a ChemID problem. Could you export a senc file and I can check it?

    Tom

  • Tom, 

    Thanks for your response.

    Sorry. I got busy with some other work, so couldn't update the status. 

    Actually we have solved the VOK flag set issue by sending reset command after IT_enable command. Now both VOK & QEN flags are getting set as expected. Update status is also 0x04.

    Our battery is 12V 7Ah, we are discharging with a load of around 1.1A. We are discharging battery until the battery voltage reaches 10.5V & put into relax mode.But after the removal of the load, the voltage is getting rebounded to around 11.8V.  

    But in the meanwhile, VOK is getting cleared & OCVTAKEN is getting set. But the update status remains 0x04. 

    We tried connecting a small load of 50mA as suggested in the below post,  after the voltage is reduced to 10.5V.

    http://e2e.ti.com/support/power_management/battery_management/f/180/t/319938.aspx

    Even with the small load, we are observing the same behavior of update status being 0x04.

    I have attached the .senc file (renamed as .jpg) we are using. Please suggest how to proceed..

    Also, It is taking around 30 hours time for OCVTAKEN flag to set after the battery capacity is 100%. Is this normal ?

    Looking forward to your suggestions.

    Regards,

    Suresha N S

     

  • Suresha,

    I reviewed the senc file and see several concerns.

    1) The OCV table for ChemID 800 is loaded, but the Ra table for ChemID 804 is loaded. Which did you intend to use? Also, have you verified the ChemID match to your cells? If not, you can send log data to me and I can check it with Mathcad.

    2) Why is the Design Capacity set to 1116 mAh? It should be set to the Design Capacity for the pack.

    3) The Pack Cfg A register is set to 1940. We normally set it to 0961. Bit 12 is a RSVD bit and should not be set.


    Do you have the log data available from the optimization cycle that you ran? Please send it to me and I will review it as well. Finally, I attached a modified senc file that makes it easier to complete the optimization cycle.

    Tom

    bq34z110_V0_04_modified.senc
  • Thomas,

    Thanks for the response. Please find the clarifications below : 

    1) ChemID 800 is the closer to our battery since the capacity of the battery 7.2Ah matches with our 7Ah. We have not loaded any ChemID for Ra Table. Will the bQ34z110 device automatically load the values to Ra table depending on the ChemID seleceted ? 

    We have not verified ChemID match. We will take the data log as explained in the document in "sluc138ci" & send it to you.

    2) Our battery pack capacity is 7Ah with 6 series cells. Thus design capacity per cell is 7000/6 = 1166 mAh. Since the register was specified as "Design Cell Capacity", we configured capacity per cell.

    By looking at your senc file we understand that only "Design cell capacity" is pack based & all other parameters are cell based. is our understanding is correct ?

    3) We cross verified Pack configuration register. By mistake, we had written 1940h, we will modify it to 0961h as suggested by you.

    Unfortunately, we have not taken the log of optimization cycle. We will take the log during this cycle.

    Also, we have modified your .senc file for our 12V , 7Ah battery. Can you please check & let us know if any modifications is required with this ?

    Thanks,

    Suresha N S

  • Thomas,

    Please find the attached log for chemical ID detection.

    Can you check whether we can use ChemID 800 for our battery ?

    Looking forward to your response.

    Thanks,

    Suresha N S

  • Suresha,

    The Mathcad program did not find an acceptable match to your data, but ChemID 806 is the best fit. It shows that ChemID 800 would not be a good match to use.

    Tom

  • Tom,

    Thanks for your suggestion.

    The bq evaluation software doesn't have chemical ID 806 in the Chemistry selection window.

    Do I have to install something else to get ChemID 806 in the SW ? Please suggest.

    Regards,

    Suresha N S

  • You can go to the TI website and search for Chemistry Updater. Go to the website and run the Gas Gauge Chemistry Updater Setup file to download the latest ChemIDs to your computer. 

  • Dear Tom 

    I am using the bq34z110 in a project  with battery 12v  7AH  but I don't have the kit to calibrate the voltage using the Evaluation software , is there a way for the configuration and calibration the IC .help me please . i want to read the voltage and current only . 

    thanks and best regards .

  • Ahmed,

    What kit are you referring to? Our Going to Production (SLUA665) document provides guidance to calibrating the voltage without using the bqEVSW.

    Tom

  • Dear Tom 

    Thanks for your reply ,I mean the EV2300 ,I don't have it . Can I calibrate the voltage without it using dataflash block tranfere or not .? 

  • Ahmed,

    You will have to update the Voltage Divider parameter, so you will have to us a dataflash block transfer to calibrate the voltage. Does your controller have the capability to communicate with gauge?

    Tom

  • Hello Ahmed,


    I work with the bq43z110 without EV2300 as well. I use an arduino and spi to send commands like calibrating and writing the flash.

    You find a little program to read and write flash under:

    http://e2e.ti.com/support/power_management/battery_management/f/180/t/372162.aspx


    Also, in the www you find a software for arduino to read soc and voltages....

    regards,

    clemens

  • Thank you Mr. Clemens for sharing the code and software , I have looked and was just checking , is there anything other than the code you were referring to ? as im not sure what do you mean by "in the www" .

    Thanks in advance

    Omar Sultan

  • If you look in this post http://e2e.ti.com/support/power_management/battery_management/f/180/p/213060/1166763.aspx#1166763      you find some code to read voltage, soc etc...

  • Hi Suresha,

    2) Our battery pack capacity is 7Ah with 6 series cells. Thus design capacity per cell is 7000/6 = 1166 mAh. Since the register was specified as "Design Cell Capacity", we configured capacity per cell.

    This Understanding is not orrect.

    6 series cells of 7Ah 2V Cell make one 7Ah 12V battery pack,so cell capacity is 7Ah.

    Thank you,

    Masahiko Watanabe.
  • Dear clemens

    Thanks for your code,I have used it . But when I send the command "send it enable" and read the control status I found no change ,  the vok flag not set . Do you have idea about this .

    Thanks and best regards

    ahmed

  • Hello Ahmed,

    probably you did not send the right subcommand? Can you show me how you perform subcommands?

    regards,
    clemens
  • Dear Mr Clemens

    here is the main file , and the two functions . note that I am using 12v  7A battery so we changed the pack configuration .could you review the file . 

    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #include "I2C.h"
    #include "UART.h"
    unsigned char ICE_read(char);
    void send_sealed_Enable(void);
    void send_IT_Enable(void);
    void read_control_status(void);
    #define BQ34Z110 0xAA
    #define voltageDeviderH 0x36
    #define voltageDeviderL 0xB0

    #define designCapH 0x1C
    #define designCapL 0x20

    #define designEnergyH 0x23
    #define designEnergyL 0x28

    #define packConfiRegH 0x09
    #define packConfiRegL 0x61

    #define ledChgReg 0b01011011

    #define alertConfigRegH 0b11011011
    #define alertConfigRegL 0b01100111

    uint8_t flashbytes[32] = {0};

    int main()
    {

    vidI2CMasterInit();
    UART_Init();
    int lowbyte;
    int highbyte;


    writeConfig();
    _delay_ms(500);

    send_IT_Enable();
    _delay_ms(2000);

    send_sealed_Enable();

    read_control_status();

    while(1)
    {

    _delay_ms(2000);
    //read_control_status();

    start();
    vidI2C_send_slave_add_write(0XAA);
    vidI2CWrite(0x02);
    lowbyte=ICE_read(0xAA);

    Display_pack(lowbyte);

    _delay_ms(10);
    start();
    vidI2C_send_slave_add_write(0XAA);
    vidI2CWrite(0x03);
    highbyte=ICE_read(0xAA);
    Display_pack(highbyte);


    }

    }

    void send_IT_Enable(void)
    {
    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x00);
    Wire_endTransmission();

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x21);
    Wire_endTransmission();

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x01);
    Wire_endTransmission();

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x00);
    Wire_endTransmission();



    }

    void read_control_status(void)
    {

    int lowbyte;
    int highbyte;
    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x00);
    Wire_endTransmission();

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x00);
    Wire_endTransmission();

    lowbyte=IC_read(BQ34Z110);
    Display_pack(lowbyte);

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x01);
    Wire_endTransmission();

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x00);
    Wire_endTransmission();




    highbyte=IC_read(BQ34Z110);
    Display_pack(highbyte);



    }

    void send_sealed_Enable(void)
    {
    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x00);
    Wire_endTransmission();

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x20);
    Wire_endTransmission();

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x01);
    Wire_endTransmission();

    Wire_beginTransmission(BQ34Z110);
    Wire_write(0x00);
    Wire_endTransmission();

    /*Wire.requestFrom(BQ34Z100,1);
    inst_current_lsb = Wire.read();

    Wire.requestFrom(BQ34Z100,1);
    inst_current_msb = Wire.read();
    */

    }

  • Hello Ahmed,

    sorry for the late response... Maybe the problem is how you perform the subcommand.

    Here is my command: (enter subID in "command")

    Wire.beginTransmission(BQ34Z100);
      Wire.write(0x00);
      Wire.write(command);
      Wire.endTransmission();

      Wire.beginTransmission(BQ34Z100);
      Wire.write(0x01);
      Wire.write(0x00);
      Wire.endTransmission();

      Wire.beginTransmission(BQ34Z100);
      Wire.write(0x01);
      Wire.endTransmission();

      Wire.requestFrom(BQ34Z100,1);

      Serial.println(Wire.read(),HEX);
     
      Wire.beginTransmission(BQ34Z100);
      Wire.write(0x00);
      Wire.endTransmission();
     
      Wire.requestFrom(BQ34Z100,1);
      Serial.println(Wire.read(),HEX);

    Greetings,

    Clemens