254 lines
6.8 KiB
C
254 lines
6.8 KiB
C
/**
|
|
******************************************************************************
|
|
* @file tim.c
|
|
* @author Jerry
|
|
* @version V2.1
|
|
* @date 19-April-2022
|
|
* @brief tim program body.
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "stm32f10x.h"
|
|
#include "global.h"
|
|
#include "string.h"
|
|
#include "rtc.h"
|
|
#include "soe.h"
|
|
|
|
_soe_obj soe;
|
|
uint8_t rdd[64];
|
|
|
|
|
|
/*******************************************************************************
|
|
Function:
|
|
Description: 发生SOE事件时,将事件写入EEPROM
|
|
Input:
|
|
Output:
|
|
Others:
|
|
*******************************************************************************/
|
|
void SOE_BkData(uint8_t type)
|
|
{
|
|
uint8_t wrBuf[64];
|
|
uint8_t extBuf[6];
|
|
uint8_t adrh,adrl;
|
|
uint16_t ee_vol,ee_fcc,ee_rcc;
|
|
int16_t ee_cur;
|
|
uint8_t afe_mode;
|
|
uint16_t ext_addr;
|
|
|
|
uint8_t i;
|
|
uint16_t ee_cellVol[20]; //用于转换存储单芯电压
|
|
|
|
ee_vol = (uint16_t)(bmsMem.packVoltage/10); //电压保存 单位0.01V
|
|
ee_cur = (int16_t) (bmsMem.packCurrent/100); //电流保存 单位0.1A
|
|
ee_fcc = (uint16_t)(fcc/3600/100); //满充容量 单位0.1Ah //5.16增加满充容量自适应逻辑后修改
|
|
ee_rcc = (uint16_t)(bmsMem.rcc/3600/100); //剩余容量 单位0.1Ah
|
|
|
|
/*记录序号,便于上位机排序和查看*/
|
|
wrBuf[0] = (soe.index >> 24) & 0xff ;
|
|
wrBuf[1] = (soe.index >> 16) & 0xff ;
|
|
wrBuf[2] = (soe.index >> 8) & 0xff ;
|
|
wrBuf[3] = (soe.index >> 0) & 0xff ;
|
|
|
|
/*记录时间*/
|
|
wrBuf[4] = calendar.w_year ;
|
|
wrBuf[5] = calendar.w_month ;
|
|
wrBuf[6] = calendar.w_date ;
|
|
wrBuf[7] = calendar.hour ;
|
|
wrBuf[8] = calendar.min ;
|
|
wrBuf[9] = calendar.sec ;
|
|
|
|
/*记录BMS参数*/
|
|
wrBuf[10] = bmsMem.bStatus1 & 0xff;
|
|
wrBuf[11] = bmsMem.bStatus2 & 0xff;
|
|
wrBuf[12] = bmsMem.bStatus3 & 0xff;
|
|
wrBuf[13] = bmsMem.temperaStatus & 0xff;
|
|
wrBuf[14] = bmsMem.balanceStatus & 0xff;
|
|
//wrBuf[15] = bmsMem.packStatus & 0xff;
|
|
wrBuf[15] = ((bmsMem.bStatus1>>4) & 0xf0) | ((bmsMem.temperaStatus>>8) & 0x0f); //占用原packStatus位置,保存新增保护
|
|
|
|
wrBuf[16] = (ee_vol >> 8) & 0xff;
|
|
wrBuf[17] = (ee_vol >> 0) & 0xff;
|
|
wrBuf[18] = (ee_cur >> 8) & 0xff;
|
|
wrBuf[19] = (ee_cur >> 0) & 0xff;
|
|
|
|
wrBuf[20] = (ee_fcc >> 8) & 0xff;
|
|
wrBuf[21] = (ee_fcc >> 0) & 0xff;
|
|
wrBuf[22] = (ee_rcc >> 8) & 0xff;
|
|
wrBuf[23] = (ee_rcc >> 0) & 0xff;
|
|
|
|
wrBuf[24] = (bmsMem.cycleCount >> 8) & 0xff;
|
|
wrBuf[25] = (bmsMem.cycleCount >> 0) & 0xff;
|
|
|
|
wrBuf[26] = bmsMem.soh & 0xff;
|
|
|
|
//afe_T1~T3
|
|
wrBuf[27] = (bmsMem.afe_T1>>8) & 0x0f;
|
|
wrBuf[28] = (bmsMem.afe_T1>>0) & 0xff;
|
|
wrBuf[29] = (bmsMem.afe_T2>>4) & 0xff;
|
|
wrBuf[30] = ((bmsMem.afe_T2<<4) & 0xf0) | ((bmsMem.afe_T3>>8) & 0x0f);
|
|
wrBuf[31] = (bmsMem.afe_T3>>0) & 0xff;
|
|
//mcu_T1~T4
|
|
wrBuf[32] = (bmsMem.mcu_T1>>4) & 0xff;
|
|
wrBuf[33] = ((bmsMem.mcu_T1<<4) & 0xf0) | ((bmsMem.mcu_T2>>8) & 0x0f);
|
|
wrBuf[34] = (bmsMem.mcu_T2>>0) & 0xff;
|
|
wrBuf[35] = (bmsMem.mcu_T3>>4) & 0xff;
|
|
wrBuf[36] = ((bmsMem.mcu_T3<<4) & 0xf0) | ((bmsMem.mcu_T4>>8) & 0x0f);
|
|
wrBuf[37] = (bmsMem.mcu_T4>>0) & 0xff;
|
|
|
|
afe_mode = (paraMem.sc_mode >> 8) & 0xFF;
|
|
|
|
for(i=0;i<20;i++)
|
|
{
|
|
if(i < 16)
|
|
{
|
|
if(bmsMem.vCell[i] > 5119)
|
|
{
|
|
ee_cellVol[i] = 0;
|
|
}
|
|
else if(bmsMem.vCell[i] > 4095)
|
|
{
|
|
ee_cellVol[i] = 4095;
|
|
}
|
|
else
|
|
{
|
|
ee_cellVol[i] = bmsMem.vCell[i];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(afe_mode == 1)
|
|
{
|
|
if(bmsMem.vCell2[i-16] > 5119)
|
|
{
|
|
ee_cellVol[i] = 0;
|
|
}
|
|
else if(bmsMem.vCell2[i-16] > 4095)
|
|
{
|
|
ee_cellVol[i] = 4095;
|
|
}
|
|
else
|
|
{
|
|
ee_cellVol[i] = bmsMem.vCell2[i-16];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ee_cellVol[i] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
wrBuf[38] = (ee_cellVol[0]>>4) & 0xff;
|
|
wrBuf[39] = ((ee_cellVol[0]<<4) & 0xf0) | ((ee_cellVol[1]>>8) & 0x0f);
|
|
wrBuf[40] = (ee_cellVol[1]>>0) & 0xff;
|
|
wrBuf[41] = (ee_cellVol[2]>>4) & 0xff;
|
|
wrBuf[42] = ((ee_cellVol[2]<<4) & 0xf0) | ((ee_cellVol[3]>>8) & 0x0f);
|
|
wrBuf[43] = (ee_cellVol[3]>>0) & 0xff;
|
|
wrBuf[44] = (ee_cellVol[4]>>4) & 0xff;
|
|
wrBuf[45] = ((ee_cellVol[4]<<4) & 0xf0) | ((ee_cellVol[5]>>8) & 0x0f);
|
|
wrBuf[46] = (ee_cellVol[5]>>0) & 0xff;
|
|
wrBuf[47] = (ee_cellVol[6]>>4) & 0xff;
|
|
wrBuf[48] = ((ee_cellVol[6]<<4) & 0xf0) | ((ee_cellVol[7]>>8) & 0x0f);
|
|
wrBuf[49] = (ee_cellVol[7]>>0) & 0xff;
|
|
wrBuf[50] = (ee_cellVol[8]>>4) & 0xff;
|
|
wrBuf[51] = ((ee_cellVol[8]<<4) & 0xf0) | ((ee_cellVol[9]>>8) & 0x0f);
|
|
wrBuf[52] = (ee_cellVol[9]>>0) & 0xff;
|
|
wrBuf[53] = (ee_cellVol[10]>>4) & 0xff;
|
|
wrBuf[54] = ((ee_cellVol[10]<<4) & 0xf0) | ((ee_cellVol[11]>>8) & 0x0f);
|
|
wrBuf[55] = (ee_cellVol[11]>>0) & 0xff;
|
|
wrBuf[56] = (ee_cellVol[12]>>4) & 0xff;
|
|
wrBuf[57] = ((ee_cellVol[12]<<4) & 0xf0) | ((ee_cellVol[13]>>8) & 0x0f);
|
|
wrBuf[58] = (ee_cellVol[13]>>0) & 0xff;
|
|
wrBuf[59] = (ee_cellVol[14]>>4) & 0xff;
|
|
wrBuf[60] = ((ee_cellVol[14]<<4) & 0xf0) | ((ee_cellVol[15]>>8) & 0x0f);
|
|
wrBuf[61] = (ee_cellVol[15]>>0) & 0xff;
|
|
|
|
wrBuf[62] = type;
|
|
if(afe_mode == 1) //SH36735XX, 20 cells
|
|
{
|
|
wrBuf[63] = 0xA6; //new format flag
|
|
//pack cell17~20 into extBuf[0~5]
|
|
extBuf[0] = (ee_cellVol[16]>>4) & 0xff;
|
|
extBuf[1] = ((ee_cellVol[16]<<4) & 0xf0) | ((ee_cellVol[17]>>8) & 0x0f);
|
|
extBuf[2] = (ee_cellVol[17]>>0) & 0xff;
|
|
extBuf[3] = (ee_cellVol[18]>>4) & 0xff;
|
|
extBuf[4] = ((ee_cellVol[18]<<4) & 0xf0) | ((ee_cellVol[19]>>8) & 0x0f);
|
|
extBuf[5] = (ee_cellVol[19]>>0) & 0xff;
|
|
}
|
|
else
|
|
{
|
|
wrBuf[63] = 0xA5; //old format flag
|
|
}
|
|
|
|
|
|
/*写入前检查是否合法*/
|
|
//当前地址=0或0XFFFF或不为64倍数,初始化地址和记录序号
|
|
if((soe.pc < 0x1000) || (soe.pc > 0x2940) || (soe.pc == 0xffff) || (soe.pc%64 !=0))
|
|
{
|
|
soe.pc = RECORD_START_ADDR;
|
|
soe.index = 0;
|
|
soe.num = 0;
|
|
}
|
|
|
|
|
|
/*记录写入EEPROM*/
|
|
adrh = (soe.pc>>8) & 0xff;
|
|
adrl = soe.pc & 0xff;
|
|
EEPROM_WrMulByte(EE_SOE,wrBuf);
|
|
delay_ms(10);
|
|
EEPROM_RdMulByte(EE_SOE,rdd);
|
|
|
|
//write extend cell17~20 for SH36735XX
|
|
if(afe_mode == 1)
|
|
{
|
|
ext_addr = 0x2900 + (soe.pc - 0x1000) * 6 / 64;
|
|
adrh = (ext_addr>>8) & 0xff;
|
|
adrl = ext_addr & 0xff;
|
|
EEPROM_WrMulByte(EE_SOE_EXT,extBuf);
|
|
delay_ms(10);
|
|
EEPROM_RdMulByte(EE_SOE_EXT,rdd);
|
|
}
|
|
|
|
/*清除记录写入标记*/
|
|
soe.bkType = 0;
|
|
|
|
/*暂定400条记录*/
|
|
soe.index+=1;
|
|
soe.pc +=0x40;
|
|
soe.num +=1;
|
|
|
|
// if(soe.pc == 0x7400) //0x1000-0x7400共400条
|
|
// if(soe.pc == 0x1C80) //0x1000-0x1C80共50条
|
|
if(soe.pc == 0x2900) //0x1000-0x2900共100条
|
|
{
|
|
soe.pc = RECORD_START_ADDR;
|
|
}
|
|
|
|
if(soe.num >= 100)
|
|
{
|
|
soe.num = 100;
|
|
}
|
|
|
|
wrBuf[0] = (soe.index >> 24) & 0xff ;
|
|
wrBuf[1] = (soe.index >> 16) & 0xff ;
|
|
wrBuf[2] = (soe.index >> 8) & 0xff ;
|
|
wrBuf[3] = (soe.index >> 0) & 0xff ;
|
|
wrBuf[4] = (soe.pc >>8)&0XFF ;
|
|
wrBuf[5] = soe.pc & 0xff ;
|
|
wrBuf[6] = (soe.num >>8)&0XFF ;
|
|
wrBuf[7] = soe.num & 0xff ;
|
|
|
|
EEPROM_WrMulByte(EE_SOE_INF,wrBuf);
|
|
delay_ms(10);
|
|
EEPROM_RdMulByte(EE_SOE_INF,rdd);
|
|
|
|
scr_RdRecord_Flg = 1;
|
|
//SCR_DispProcotol();
|
|
}
|
|
|