531 lines
16 KiB
C
531 lines
16 KiB
C
/**
|
|
******************************************************************************
|
|
* @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.
|
|
*
|
|
* <h2><center>© COPYRIGHT 2022 AMG</center></h2>
|
|
******************************************************************************
|
|
*/
|
|
|
|
/** @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******/
|