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.

bq76PL455A-Q1 Squeeze Routine for Open Sense line detection

Other Parts Discussed in Thread: BQ76PL455A-Q1

I am trying to piece together a squeeze routine to verify when a sense line is not connected to the battery stack.  We are using a single bq76PL455A-Q1 on a 6S pack which has been working quite nicely.  My questions are below.

1.) Do I use OV/UV window comp circuits or the AFE to detect the increased voltage on the N+1, N-1 lines when squeezing on sense line N?

My confusion is the from section 7.3.12.8.1 Window Comparator Special Considerations of the data sheet which states ´ “Only the comparators can see the increased voltage not the AFE”  the but the “Safety Manual for bq76PL455A-Q1” states, under Section A.6 “BatBroken”  that “All odd channels should be squeezed and all channels sampled. Then all even channels should be squeezed and all channels sampled.

 Please clarify.

2. ) What is the proper setup for squeezing?   Currently, I have the following commands

                //clear all faults

                nSent = WriteReg(0, STATUS, 0x38, 1, FRMWRT_ALL_NR); // clear fault flags in the system status register

                DELAY_US(1000);

                //set the squeeze reisitor enable bit

                nSent = WriteReg(0, TSTCONFIG, EQ_SQUEEZE_EN, 2, FRMWRT_SGL_R);

                DELAY_US(1000);

                // Verify that the register was written to

                nRead = ReadReg(0, TSTCONFIG, &bTemp, 2, &SciB_status);

                DELAY_US(1000);

                //Set the balance continue bit when a fault occurs.

                nSent = WriteReg(0, CBCONFIG, BAL_CONTINUE, 1, FRMWRT_SGL_R);

                DELAY_US(1000);

                // Verify that the register was written to

                nRead = ReadReg(0, CBCONFIG, &bTemp, 1, &SciB_status);

                DELAY_US(1000);

                // Set up squeeze resistors.

                nSent = WriteReg(0, CBENBL, SQUEEZE_EVEN_CH, 2, FRMWRT_SGL_R);

                DELAY_US(1000);

                //verify squeeze channels were set.

                nRead = ReadReg(0, CBENBL, &bTemp, 2, &SciB_status);

                DELAY_US(2000);             // Requires 2 ms settling time.

 

Am I missing anything? Any help in this matter would be greatly appreciated.

 

Best regards,

Matt

  • Hi Matthew,

    I have the following sequence of commands for BatBroken: 

    // BatBroken
    nSent = WriteReg(nGrp_ID, 81, 0x38, 1, FRMWRT_ALL_NR); // Clear fault flags in the system status register
    // Sample all cell channels
    nSent = WriteReg(nGrp_ID, 2, (0x00 | (nTopID & 0x0F)), 1, FRMWRT_GRP_R);
    nSent = WaitRespFrame(bFrame, 82, 0); // 38 bytes data (x2) + packet header (x2) + CRC (x2), 0ms timeout

    nSent = WriteReg(nGrp_ID, 30, 0x10, 1, FRMWRT_GRP_R); // Set EQ_SQUEEZE_EN = 1
    nSent = WriteReg(nGrp_ID, 20, 0xAAAA, 2, FRMWRT_GRP_R); // Enable even squeeze resistors
    delayms(1000); // Delay long enough to see a significant change on the cell inputs
    // Sample all cell channels
    nSent = WriteReg(nGrp_ID, 2, (0x00 | (nTopID & 0x0F)), 1, FRMWRT_GRP_R);
    nSent = WaitRespFrame(bFrame, 82, 0); // 38 bytes data (x2) + packet header (x2) + CRC (x2), 0ms timeout

    // Look for UV fault on any even channel - an OV fault may be generated on odd channels

    nSent = WriteReg(nGrp_ID, 20, 0xAAAA, 2, FRMWRT_GRP_R); // Enable even squeeze resistors
    delayms(1000); // Delay long enough to see a significant change on the cell inputs
    // Sample all cell channels
    nSent = WriteReg(nGrp_ID, 2, (0x00 | (nTopID & 0x0F)), 1, FRMWRT_GRP_R);
    nSent = WaitRespFrame(bFrame, 82, 0); // 38 bytes data (x2) + packet header (x2) + CRC (x2), 0ms timeout

    // Look for UV fault on any odd channel - an OV fault may be generated on even channels

    nSent = WriteReg(nGrp_ID, 20, 0x0000, 2, FRMWRT_GRP_R); // Disable all squeeze resistors
    nSent = WriteReg(nGrp_ID, 30, 0x00, 1, FRMWRT_GRP_R); // Set EQ_SQUEEZE_EN = 0

    You have some additional register value checks and delays, but I think it looks good.

    To detect the fault, the host would look for a UV fault on the channels where squeeze is enabled.

    Section 7.3.12.8.1 is simply stating that the AFE alone doesn't detect a UV fault without a sample request. A comparator would detect it immediately.

    Regards,

    Stephen

  • Hi Stephen, 

    Thank you for your prompt reply.  

    I have implemented your suggested code and I have not seen any substantial movement on any of the sense lines.  Is there anything else that I am not considering when trying to get the squeeze resistors to work.

    Attached is a snap shot of the cell voltages without squeeze resistors, with the even squeezed resistors enabled, and finally with the odd squeeze resistors enabled. SampleNox[2] does not have its sense line connected.  As you can see, there is no change indicated when running the test. 

    We have also added a 1 second delay and  decreased the input filter to a lower series resistance <100 Ohm. Any help would be greatly appreciated. 

    Many thanks in advance, 

    Matt

  • Hi Matt,

    Have you tried taking measurements with and without an open sense wire? There shouldn't be a significant change with and without the squeeze resistors enabled with a connected sense wire.

    Here is the same code, with more added detail. I am able to see ~2.7mV of difference between an open sense wire and connected sense wire.

    // BatBroken
    nSent = WriteReg(nGrp_ID, 81, 0x38, 1, FRMWRT_GRP_NR); // Clear fault flags in the system status register

    nRead = ReadReg(1, 3, &lTemp, 4, 0); // Backup CHANNELS register
    if(nRead != 4)
    TestFailure();
    // Sample all cell channels
    nSent = WriteReg(nGrp_ID, 2, 0x01FFFF0000, 5, FRMWRT_GRP_R); // Change CHANNELS value inline
    nSent = WaitRespFrame(bFrame, 35, 0); // 32 bytes data (x8) + packet header (x8) + CRC (x8), 0ms timeout

    nSent = WriteReg(nGrp_ID, 30, 0x10, 1, FRMWRT_GRP_R); // Set EQ_SQUEEZE_EN = 1
    nSent = WriteReg(nGrp_ID, 20, 0xAAAA, 2, FRMWRT_GRP_R); // Enable even squeeze resistors
    delayms(200); // Delay long enough to see a significant change on the cell inputs
    // Sample all cell channels
    nSent = WriteReg(nGrp_ID, 2, (0x00 | (1 & 0x0F)), 1, FRMWRT_GRP_R);
    nSent = WaitRespFrame(bFrame2, 35, 0); // 32 bytes data (x8) + packet header (x8) + CRC (x8), 0ms timeout

    // Look for UV fault on any even channel - an OV fault may be generated on odd channels
    cellSample = (bFrame2[1]<<8|bFrame2[2]) * 0.000076295 - (bFrame[1]<<8|bFrame[2]) * 0.000076295;
    if(cellSample > 0.01)
    TestFailure();

    nSent = WriteReg(nGrp_ID, 20, 0xAAAA, 2, FRMWRT_GRP_R); // Enable even squeeze resistors
    delayms(200); // Delay long enough to see a significant change on the cell inputs
    // Sample all cell channels
    nSent = WriteReg(nGrp_ID, 2, (0x00 | (1 & 0x0F)), 1, FRMWRT_GRP_R);
    nSent = WaitRespFrame(bFrame2, 35, 0); // 38 bytes data (x2) + packet header (x2) + CRC (x2), 0ms timeout

    // Look for UV fault on any odd channel - an OV fault may be generated on even channels
    cellSample = (bFrame2[1]<<8|bFrame2[2]) * 0.000076295 - (bFrame[1]<<8|bFrame[2]) * 0.000076295;
    if(cellSample > 0.01)
    TestFailure();

    nSent = WriteReg(1, 13, 0x0C, 1, FRMWRT_SGL_NR); // Restore NCHAN[NUM_CHAN] value
    nSent = WriteReg(1, 3, lTemp, 4, FRMWRT_GRP_NR); // Restore CHANNELS value
    nSent = WriteReg(nGrp_ID, 20, 0x0000, 2, FRMWRT_GRP_R); // Disable all squeeze resistors
    nSent = WriteReg(nGrp_ID, 30, 0x00, 1, FRMWRT_GRP_R); // Set EQ_SQUEEZE_EN = 0

    Regards,
    Stephen
  • Thank you, Stephen. I ran the test with the sense line connected and disconnected. I think the problem was looking for a change that was closer to the 72mV as stated on pag 43 of the datasheet. I will run it again looking for a smaller deviation.
  • Update:

    We were never able to see the voltage drop numbers posted in the data sheet for the squeeze circuit to detect an open wire condition.  However, we added the passive balancing FET/resistor hardware  and enabled this hardware one sense line at a time and therefore was able to detect a voltage drop.  The delta between this voltage drop when the sense line is attached and unattached is large enough for our system to determine that a cell sense line has been broken.

  • Hi Matt,

    Thank you for the update...it is much appreciated.

    Is there anything else I can help you with, or is this thread able to be marked as closed?

  • We are identifying broken sense connections as identified above, so this thread can be closed.
  • Matt,


    Understood. Do you have a logic analyzer handy to catch the UART traffic going to and from the 455? Alternatively, I would say step through the code and watch the variables update as you send them and read back read back. I just want to double check that the values are actually being written to cover that base.

    Are you currently trying to use your code, or the code that Stephen provided as a foundation?

    Can you confirm what size capacitor you are using for your RC filter on the sense line? Is it tied to ground, or set up as a differential filter between sense lines?