Hello,
1) I am using BQ76952 for a battery management system and I have a PCHG and PDSG MOSFET's in the design. I have attached the picture below of the MOSFET section as a reference. I am facing an issue while turning off the PCHG and/or PDSG FET's. I have also attached the code snippet of what I am trying to do. In the discharging state, I am trying to turn ON the PDSG FET first and after few milliseconds, I turn-ON the CHG, DSG FET's and after few milliseconds, I am trying to turn-OFF the PDSG FET as its useless to keep it ON once the CHG, and DSG FET's are ON. But when I send the command to turn-OFF the PDSG, the DSG FET's is also tunning OFF. See my code snippet below.
2) Second issue I am facing is that, i connected the same BMS to a 16S battery pack (max charge voltage is 67V) and connected a charger to charge the battery and everything was working fine until the battery reached around 57V and all of a sudden the Voltage at LOAD + increased to the max charger voltage (85V), but the voltage at the PACK+ remains unaltered at 57V. The charger shuts of thinking over voltage on the battery. But the Battery voltage (PACK+) is still at 57V, its at the LOAD+ that's raising up for some reason.
I disconnected the charger and re-plugged in and the issue still persists and as soon as charger starts to push some current, the voltage at LOAD+ quickly jumps to 85V and remains there until i unplug the charger, but the PACK+ which is the battery voltage remains at 57V, and AFE doesn't detect any faults as all cells are with in limits. Im confused on why this is happening.
By the way, the discharging works quite well and no issues. Its only the charging that started acting like i explained above. Any ideas ??
void AFE_EnableDisCharging(void) { fsp_err_t err; uint8_t FET_Contol = 0x00; uint8_t messagePayLoad[4]; uint8_t checksumDataByte[3]; FET_Contol = ((uint8_t) ~(AFE_PDSG_OFF_MASK)); //PDSG ON FET_Contol = FET_Contol & 0x0F; messagePayLoad[0] = CMD_DIR_SUBCMD_LOW; messagePayLoad[1] = 0x97; messagePayLoad[2] = 0x00; messagePayLoad[3] = (FET_Contol); err = I2C_WriteReg (messagePayLoad, sizeof(messagePayLoad)); R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_MILLISECONDS); checksumDataByte[0] = CMD_DIR_RESP_CHKSUM; checksumDataByte[1] = Checksum (messagePayLoad, 4); checksumDataByte[2] = 0x05; err = I2C_WriteReg (checksumDataByte, sizeof(checksumDataByte)); R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_MILLISECONDS); R_BSP_SoftwareDelay (10, BSP_DELAY_UNITS_MILLISECONDS); FET_Contol &= ((uint8_t) ~(AFE_DSG_OFF_MASK | AFE_CHG_OFF_MASK)); //CHG, DSG ON FET_Contol = FET_Contol & 0x0F; messagePayLoad[0] = CMD_DIR_SUBCMD_LOW; messagePayLoad[1] = 0x97; messagePayLoad[2] = 0x00; messagePayLoad[3] = FET_Contol; err = I2C_WriteReg (messagePayLoad, sizeof(messagePayLoad)); R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_MILLISECONDS); checksumDataByte[0] = CMD_DIR_RESP_CHKSUM; checksumDataByte[1] = Checksum (messagePayLoad, 4); checksumDataByte[2] = 0x05; err = I2C_WriteReg (checksumDataByte, sizeof(checksumDataByte)); R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_MILLISECONDS); R_BSP_SoftwareDelay (10, BSP_DELAY_UNITS_MILLISECONDS); FET_Contol |= ((uint8_t) (AFE_PDSG_OFF_MASK)); //PDSG OFF FET_Contol = FET_Contol & 0x0F; messagePayLoad[0] = CMD_DIR_SUBCMD_LOW; messagePayLoad[1] = 0x97; messagePayLoad[2] = 0x00; messagePayLoad[3] = FET_Contol; err = I2C_WriteReg (messagePayLoad, sizeof(messagePayLoad)); R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_MILLISECONDS); checksumDataByte[0] = CMD_DIR_RESP_CHKSUM; checksumDataByte[1] = Checksum (messagePayLoad, 4); checksumDataByte[2] = 0x05; err = I2C_WriteReg (checksumDataByte, sizeof(checksumDataByte)); R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_MILLISECONDS); }
