/**
******************************************************************************
* @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"
#include "bq769x0.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 = getBatterySumVoltage();
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 = 80832;
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******/