/** ****************************************************************************** * @file dflash_cal.c * @author AMG Energy Solution Team * @version V1.0.0 * @date 07-Feb-2022 * @brief This file provides all the codes of calibration parameter functions. ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2022 AMG

****************************************************************************** */ /** @addtogroup mBMS2 * @{ */ /* Includes ------------------------------------------------------------------*/ #include "includes.h" #include "dflash_cal.h" #include "console.h" #include "asutil.h" #include "device_param.h" #include "vi.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define SHUNT_FULL_1MOHM_DEFAULT 81782 #define SHUNT_LMT_1MOHM_DEFAULT 81782 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ #ifdef CONSOLE_DEBUG uint8_t SetCal_Param(uint8_t *text, uint8_t aDevice); uint8_t SetCal_Param1(uint8_t *text, uint8_t aDevice); #endif /* CONSOLE_DEBUG */ /* Private functions ---------------------------------------------------------*/ int32_t CalibrationVoltage(uint16_t voltage, uint8_t item) { int32_t sum = 0; float a, b, result; switch (item) { case DSG_CURR_ID: sum = GetRealCurrentAdc(item) + device_calib_data.cal.current.DC_Offset; break; case CHG_CURR_ID: sum = GetRealCurrentAdc(item) + device_calib_data.cal.current.CC1_Offset; break; } a = (float)voltage / 100; b = (float)sum / 10000; result = a / b; return (int32_t)(result * 1000); } int32_t CalibrationCurrentA(uint16_t current, uint8_t item) { int32_t sum; float a, b, result; switch (item) { case DSG_CURR_ID: sum = GetRealCurrentSum() - device_calib_data.cal.current.DC_Offset; break; case CHG_CURR_ID: sum = GetRealCurrentSum() - device_calib_data.cal.current.CC1_Offset; break; } if (sum < 0) sum *= -1; a = (float)current / 100; b = (float)(sum) / 10000; result = a / b; return (int32_t)(result * 1000); } void CalibrationBatVolt(uint32_t rVoltage) { uint32_t a, b, result; a = device_value.BatSumVoltage; b = rVoltage; result = b * 10000 / a; if ((result > 9800) && (result < 10500)) { device_calib_data.cal.voltage.BatV_Gain = result; Save_CalibData(); } } #ifdef CONSOLE_DEBUG /* Command processing in SETTING STATE */ int8_t Process_DataCalSet(uint8_t *text, uint16_t size) { uint16_t i, ret; /* Invalid command if space is in first position */ if (size > 1) {if (text[1] != ' ') return(0);} text[size] = 0x00; ret = 1; switch (text[0]) { case 'o': /* Switch to operating mode */ screenmode = OP_MODE; ViewScreen(); break; case 's': /* Switch to setting status */ screenmode = SET_MODE; ViewScreen(); break; case 'd': /* Switch to diagnostic mode */ screenmode = DIAG_MODE; ViewScreen(); break; case '1': // OCV Alarm Parameter Setting case '2': // OCV Shutdown Parameter Setting case '3': // OCV Alarm Parameter Setting case '4': // OCV Shutdown Parameter Setting case '5': // OCV Shutdown Parameter Setting case '6': // OCV Shutdown Parameter Setting i = SetCal_Param(&text[2],text[0]); if (i == 0) UserMessage("COMMAND COMPLETE"); else if (i == 1) UserMessage("COMMAND FORMAT ERROR"); /* setting format error */ else UserMessage("COMMAND LIMIT ERROR"); /* setting limit error */ break; case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'K' : // Charge Current Calibration i = SetCal_Param1(&text[2], text[0]); if (i == 0) UserMessage("COMMAND COMPLETE"); else if (i == 1) UserMessage("COMMAND FORMAT ERROR"); /* setting format error */ else UserMessage("COMMAND LIMIT ERROR"); /* setting limit error */ break; case 'I': Cal_InitData(); Save_CalibData(); break; default : ret = 1; break; } return(ret); } uint8_t SetCal_Param(uint8_t *text, uint8_t aDevice) { uint16_t size, i, j; int16_t aParam[4]; int32_t bParam[4]; uint8_t temp[10]; uint8_t ret; uint8_t cmd; ret = 0; size = 0; while (text[size] != 0x00) size++; /* Measure total string length */ switch (aDevice) { case '1': // Cal_Voltage_Subclass i = 0; if (size < 2 ) return(1); j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); i = i + j + 1; temp[j] = 0x00; cmd = temp[0]; j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); i = i + j + 1; temp[j] = 0x00; aParam[0] = StrToInt(temp, j); /* Value */ switch (cmd) { case '1': device_calib_data.cal.voltage.Cell_Scale_0 = aParam[0]; break; case '2': device_calib_data.cal.voltage.Cell_Scale_1 = aParam[0]; break; case '3': device_calib_data.cal.voltage.BatV_Gain = aParam[0]; break; case '4': device_calib_data.cal.voltage.BatV_Offset = aParam[0]; break; default : return (1); } Save_CalibData(); break; case '2': // Cal_Discharge_Current_Subclass i = 0; if (size < 2 ) return(1); j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); i = i + j + 1; temp[j] = 0x00; cmd = temp[0]; j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); i = i + j + 1; temp[j] = 0x00; bParam[0] = StrToInt32(temp, j); /* Value */ switch (cmd) { case '1': device_calib_data.cal.current.DC_Gain = bParam[0]; break; case '2': device_calib_data.cal.current.DC_Offset = bParam[0]; break; default: return(1); } Save_CalibData(); break; case '3': // Cal_Charge_Current_Subclass i = 0; if (size < 2 ) return(1); j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); i = i + j + 1; temp[j] = 0x00; cmd = temp[0]; j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); i = i + j + 1; temp[j] = 0x00; bParam[0] = StrToInt32(temp, j); /* Value */ switch (cmd) { case '1': device_calib_data.cal.current.CC1_Gain = bParam[0]; break; case '2': device_calib_data.cal.current.CC1_Offset = bParam[0]; break; case '3': device_calib_data.cal.current.CCx_Gain = bParam[0]; break; case '4': device_calib_data.cal.current.CCx_Offset = bParam[0]; break; default: return(1); } Save_CalibData(); break; case '6': // Current Offset (Subclass 20) i = 0; if (size < 2 ) return(1); j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); i = i + j + 1; temp[j] = 0x00; cmd = temp[0]; j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); i = i + j + 1; temp[j] = 0x00; aParam[0] = StrToInt(temp, j); /* Value */ switch (cmd) { case '1': device_calib_data.cal.current_offset.Int_Power = aParam[0]; break; case '2': device_calib_data.cal.current_offset.LifePowerCons = aParam[0]; break; default: return(1); } Save_CalibData(); break; default: ret = 1; break; } return(ret); /* Setting value OK */ } uint8_t SetCal_Param1(uint8_t *text, uint8_t aDevice) { uint8_t temp[20]; float fParam[2]; uint16_t i, j, size; uint8_t ret; ret = 0; size = 0; while (text[size] != 0x00) size++; /* Measure total string length */ switch (aDevice) { case '8' : // Discharge Current Calibration i = 0; if (size < 2 ) return(1); j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); temp[j] = 0x00; i = i + j + 1; fParam[0] = atof((char *)temp); /* IP a */ device_calib_data.cal.current.DC_Gain = CalibrationVoltage((uint16_t)(fParam[0] * 100), DSG_CURR_ID); Save_CalibData(); break; case '9' : // Charge Current Calibration i = 0; if (size < 2 ) return(1); j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); temp[j] = 0x00; i = i + j + 1; fParam[0] = atof((char *)temp); /* IP a */ device_calib_data.cal.current.CC1_Gain = CalibrationVoltage((uint16_t)(fParam[0] * 100), CHG_CURR_ID); Save_CalibData(); break; case 'K' : // Charge Current Calibration device_calib_data.cal.current.DC_Offset = -GetRealCurrentAdc(DSG_CURR_ID); device_calib_data.cal.current.CC1_Offset = -GetRealCurrentAdc(CHG_CURR_ID); device_calib_data.cal.current.CCx_Offset = -GetRealCurrentAdc(CHG_CURR_ID); Save_CalibData(); break; case 'B' : // Discharge Current Calibration i = 0; if (size < 2 ) return(1); j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); temp[j] = 0x00; i = i + j + 1; fParam[0] = atof((char *)temp); /* IP a */ device_calib_data.cal.current.DC_Gain = CalibrationCurrentA((uint16_t)(fParam[0] * 100), DSG_CURR_ID); Save_CalibData(); break; case 'C' : // Charge Current Calibration i = 0; if (size < 2 ) return(1); j = FIND_CHAR((uint8_t *)&text[i], temp, size - i, ' '); temp[j] = 0x00; i = i + j + 1; fParam[0] = atof((char *)temp); /* IP a */ device_calib_data.cal.current.CC1_Gain = CalibrationCurrentA((uint16_t)(fParam[0] * 100), CHG_CURR_ID); Save_CalibData(); break; default: ret = 1; break; } return(ret); /* Setting value OK */ } void CalDisplayVoltage(uint8_t p) { uint8_t text[20]; // Cell_Scale_0 (Offset 0) if (p || (dis_device_calib_data.cal.voltage.Cell_Scale_0 != device_calib_data.cal.voltage.Cell_Scale_0)) { sprintf((char *)text, "%5d", device_calib_data.cal.voltage.Cell_Scale_0); GreenOutXY(19, 3, text); dis_device_calib_data.cal.voltage.Cell_Scale_0 = device_calib_data.cal.voltage.Cell_Scale_0; } // Cell_Scale_1 (Offset 2) if (p || (dis_device_calib_data.cal.voltage.Cell_Scale_1 != device_calib_data.cal.voltage.Cell_Scale_1)) { sprintf((char *)text, "%5d", device_calib_data.cal.voltage.Cell_Scale_1); GreenOutXY(19, 4, text); dis_device_calib_data.cal.voltage.Cell_Scale_1 = device_calib_data.cal.voltage.Cell_Scale_1; } // Pack_Offset (Offset 8) if (p || (dis_device_calib_data.cal.voltage.BatV_Gain != device_calib_data.cal.voltage.BatV_Gain)) { sprintf((char *)text, "%5d", device_calib_data.cal.voltage.BatV_Gain); GreenOutXY(19, 5, text); dis_device_calib_data.cal.voltage.BatV_Gain = device_calib_data.cal.voltage.BatV_Gain; } // BAT_Offset (Offset 10) if (p || (dis_device_calib_data.cal.voltage.BatV_Offset != device_calib_data.cal.voltage.BatV_Offset)) { sprintf((char *)text, "%5d", device_calib_data.cal.voltage.BatV_Offset); GreenOutXY(19, 6, text); dis_device_calib_data.cal.voltage.BatV_Offset = device_calib_data.cal.voltage.BatV_Offset; } } void CalDisplayDischargeCurrent(uint8_t p) { uint8_t text[20]; uint16_t x; x = 18; // DC_Gain (Offset 0) if (p || (dis_device_calib_data.cal.current.DC_Gain != device_calib_data.cal.current.DC_Gain)) { sprintf((char *)text, "%8d", device_calib_data.cal.current.DC_Gain); GreenOutXY(x, 8, text); dis_device_calib_data.cal.current.DC_Gain = device_calib_data.cal.current.DC_Gain; } // DC_Offset (Offset 4) if (p || (dis_device_calib_data.cal.current.DC_Offset != device_calib_data.cal.current.DC_Offset)) { sprintf((char *)text, "%8d", device_calib_data.cal.current.DC_Offset); GreenOutXY(x, 9, text); dis_device_calib_data.cal.current.DC_Offset = device_calib_data.cal.current.DC_Offset; } } void CalDisplayChargeCurrent(uint8_t p) { uint8_t text[20]; uint16_t x; x = 18; // CC1_Gain (Offset 0) if (p || (dis_device_calib_data.cal.current.CC1_Gain != device_calib_data.cal.current.CC1_Gain)) { sprintf((char *)text, "%8d", device_calib_data.cal.current.CC1_Gain); GreenOutXY(x, 11, text); dis_device_calib_data.cal.current.CC1_Gain = device_calib_data.cal.current.CC1_Gain; } // CC1_Offset (Offset 4) if (p || (dis_device_calib_data.cal.current.CC1_Offset != device_calib_data.cal.current.CC1_Offset)) { sprintf((char *)text, "%8d", device_calib_data.cal.current.CC1_Offset); GreenOutXY(x, 12, text); dis_device_calib_data.cal.current.CC1_Offset = device_calib_data.cal.current.CC1_Offset; } x = 18; // CC2_Gain (Offset 0) if (p || (dis_device_calib_data.cal.current.CCx_Gain != device_calib_data.cal.current.CCx_Gain)) { sprintf((char *)text, "%8d", device_calib_data.cal.current.CCx_Gain); GreenOutXY(x, 14, text); dis_device_calib_data.cal.current.CCx_Gain = device_calib_data.cal.current.CCx_Gain; } // CC2_Offset (Offset 4) if (p || (dis_device_calib_data.cal.current.CCx_Offset != device_calib_data.cal.current.CCx_Offset)) { sprintf((char *)text, "%8d", device_calib_data.cal.current.CCx_Offset); GreenOutXY(x, 15, text); dis_device_calib_data.cal.current.CCx_Offset = device_calib_data.cal.current.CCx_Offset; } } void CalDisplayPwrConsumpt(uint8_t p) { uint8_t text[20]; uint16_t x; x = 46; // Internal Power Consumption (Offset 0) if (p || (dis_device_calib_data.cal.current_offset.Int_Power != device_calib_data.cal.current_offset.Int_Power)) { sprintf((char *)text, "%5d", device_calib_data.cal.current_offset.Int_Power); GreenOutXY(x, 3, text); dis_device_calib_data.cal.current_offset.Int_Power = device_calib_data.cal.current_offset.Int_Power; } // Relay Power Consumption (Offset 0) if (p || (dis_device_calib_data.cal.current_offset.LifePowerCons != device_calib_data.cal.current_offset.LifePowerCons)) { sprintf((char *)text, "%5d", device_calib_data.cal.current_offset.LifePowerCons); GreenOutXY(x, 4, text); dis_device_calib_data.cal.current_offset.LifePowerCons = device_calib_data.cal.current_offset.LifePowerCons; } } void CalDisplayInitCode(uint8_t p) { uint8_t text[20]; uint16_t x; x = 69; // Initial Code (Offset 0) if (p || (dis_device_calib_data.initdata != device_calib_data.initdata)) { sprintf((char *)text, "%8X", device_calib_data.initdata); GreenOutXY(x, 20, text); dis_device_calib_data.initdata = device_calib_data.initdata; } } void CalDisplay(uint8_t p) { CalDisplayVoltage(p); CalDisplayChargeCurrent(p); CalDisplayDischargeCurrent(p); CalDisplayPwrConsumpt(p); CalDisplayInitCode(p); } #endif // #ifdef CONSOLE_DEBUG void Cal_InitData(void) { device_calib_data.cal.voltage.Cell_Scale_0 = 0; device_calib_data.cal.voltage.Cell_Scale_1 = 0; device_calib_data.cal.voltage.BatV_Gain = 10218; // (1/10000) device_calib_data.cal.voltage.BatV_Offset = 0; // (1/10000) device_calib_data.cal.current.CC1_Gain = SHUNT_FULL_1MOHM_DEFAULT; device_calib_data.cal.current.CC1_Offset = 0; device_calib_data.cal.current.CCx_Gain = SHUNT_LMT_1MOHM_DEFAULT; device_calib_data.cal.current.CCx_Offset = 0; device_calib_data.cal.current.DC_Gain = 81734; device_calib_data.cal.current.DC_Offset = 0; device_calib_data.cal.current_offset.Int_Power = 100; device_calib_data.cal.current_offset.LifePowerCons = 300; } /*******************(C)COPYRIGHT 2022 AMG ********************END OF FILE******/