294 lines
15 KiB
Plaintext
294 lines
15 KiB
Plaintext
C51 COMPILER V9.01 BALANCE 02/08/2025 15:18:20 PAGE 1
|
||
|
||
|
||
C51 COMPILER V9.01, COMPILATION OF MODULE BALANCE
|
||
OBJECT MODULE PLACED IN .\output\Balance.obj
|
||
COMPILER INVOKED BY: D:\Tool\Keil\C51\BIN\C51.EXE code_drv\Balance.c LARGE OPTIMIZE(7,SIZE) REGFILE(.\output\MCUCore_Loa
|
||
-d.ORC) BROWSE INTVECTOR(0X1000) INCDIR(.\header_app;.\header_drv;.\code_gasguage;.\code_classb\iec60730_lib\include;.\co
|
||
-de_classb\iec60730_proc\Include;.\code_classb\config) DEBUG OBJECTEXTEND PRINT(.\output\Balance.lst) OBJECT(.\output\Bal
|
||
-ance.obj)
|
||
|
||
line level source
|
||
|
||
1 /********************************************************************************
|
||
2 Copyright (C), Sinowealth Electronic. Ltd.
|
||
3 Author: Sino
|
||
4 Version: V0.0
|
||
5 Date: 2020/04/26
|
||
6 History:
|
||
7 V2.0 2020/04/26 Preliminary
|
||
8 ********************************************************************************/
|
||
9 #include "Main.h"
|
||
10
|
||
11
|
||
12 BOOL bBalanceFlg;
|
||
13 BOOL bBalancingFlg;
|
||
14 BOOL bBalanceOddFlg;
|
||
15 BOOL bCTOValidFlg; //当电芯压差超过1200mV时,才认为存在断线,主要
|
||
-解决电芯电压低于2V情况下
|
||
16 BOOL bCellOpenDecFlag;
|
||
17 U16 xdata uiBalanceChannel;
|
||
18 U8 xdata ucBalanceTimeCnt;
|
||
19 U8 xdata ucBalanceStep;
|
||
20 U8 xdata ucCellOpenDecCnt;
|
||
21 U8 xdata ucCtoCnt;
|
||
22
|
||
23 /*************************************************************************************************
|
||
24 * 函数名: BalTurnOnCheck
|
||
25 * 参 数: 无
|
||
26 * 返回值: 无
|
||
27 * 描 述:
|
||
28 1. 平衡开启条件是电压、压差及电流 同时满足
|
||
29 2. 平衡过程中,不再进行平衡检测
|
||
30 3. 断线检测借用平衡
|
||
31 *************************************************************************************************/
|
||
32 void BalTurnOnCheck(void)
|
||
33 {
|
||
34 1 U8 i;
|
||
35 1
|
||
36 1 if(!bBalancingFlg && !bCellOpenDecFlag) //在一个平衡周期中或开启断线检测时不判定是否进行<E8BF9B>
|
||
-胶<>
|
||
37 1 {
|
||
38 2 if(bBAL_EN)
|
||
39 2 {
|
||
40 3 uiBalanceChannel = 0;
|
||
41 3 if(((uiCellVmax>E2uiOVvol)&&(!bOV)) //发生温度保护时不进行平衡,判定进入过压、过压恢复、<E5A48D>
|
||
-<2D>氤涞缃刂故痹萃F胶<EFBCA6>
|
||
42 3 ||((uiCellVmax < E2uiOVRvol)&&(bOV))
|
||
43 3 || bOTC || bUTC || bOTD || bUTD)
|
||
44 3 {
|
||
45 4 bBalanceFlg = 0;
|
||
46 4 ucBalanceTimeCnt = 0;
|
||
47 4 }
|
||
48 3 else
|
||
49 3 {
|
||
C51 COMPILER V9.01 BALANCE 02/08/2025 15:18:20 PAGE 2
|
||
|
||
50 4 if(((uiCellVmax>E2uiBalanceVol) && (uiCellVmax-uiCellVmin)>=E2uiBalanceVolDiff) && (Info.slCurr>=E2
|
||
-siBalCurrent))
|
||
51 4 {
|
||
52 5 if(!bBalanceFlg)
|
||
53 5 {
|
||
54 6 ucBalanceTimeCnt++;
|
||
55 6 }
|
||
56 5 if(ucBalanceTimeCnt >= BAL_DELAY_CNT)
|
||
57 5 {
|
||
58 6 for(i=ucCellNumOffset; i<ucCellNumOffset+ucCellNum; i++)
|
||
59 6 {
|
||
60 7 if(((Info.uiVCell[i]-uiCellVmin)>=E2uiBalanceVolDiff)&&(Info.uiVCell[i]>=E2uiBalanceVol)) //电芯
|
||
-电压大于平衡电压,且压差大于阈值,开启该电芯平衡
|
||
61 7 {
|
||
62 8 uiBalanceChannel |= (1<<i);
|
||
63 8 }
|
||
64 7 }
|
||
65 6 bBalanceFlg = 1;
|
||
66 6 }
|
||
67 5 }
|
||
68 4 else
|
||
69 4 {
|
||
70 5 bBalanceFlg = 0;
|
||
71 5 ucBalanceTimeCnt = 0;
|
||
72 5 }
|
||
73 4 }
|
||
74 3 }
|
||
75 2 }
|
||
76 1 }
|
||
77
|
||
78
|
||
79
|
||
80 /*******************************************************************************
|
||
81 Function: CTOCheckVol(void)
|
||
82 Description:
|
||
83 Input:
|
||
84 Output:
|
||
85 Others:
|
||
86 *******************************************************************************/
|
||
87 BOOL CTOCheckVol(void)
|
||
88 {
|
||
89 1 BOOL bResult=0;
|
||
90 1
|
||
91 1 if(bCTO_EN) //判断是否支持断线检测
|
||
92 1 {
|
||
93 2 if(!bCTO) //如果已经检测到断线,则不再检测
|
||
94 2 {
|
||
95 3 if(bCTOValidFlg) //判断电压压差是否超过1.2V
|
||
96 3 {
|
||
97 4 if(uiVadcVmin < VOL_CELL_CUT_180MV) //180mV
|
||
98 4 {
|
||
99 5 bResult = 1;
|
||
100 5 if(++ucCtoCnt >= TIME_50MS_500MS) //断线 500mS
|
||
101 5 {
|
||
102 6 bCTO = 1;
|
||
103 6 }
|
||
104 5 }
|
||
105 4 else
|
||
106 4 {
|
||
107 5 bCTOValidFlg = 0;
|
||
108 5 ucCtoCnt = 0;
|
||
109 5 }
|
||
C51 COMPILER V9.01 BALANCE 02/08/2025 15:18:20 PAGE 3
|
||
|
||
110 4 }
|
||
111 3 }
|
||
112 2 #ifdef SP_CTO_RECOVER
|
||
else //断线恢复功能,每250mS一个周期判断最小电压
|
||
{
|
||
if(uiVadcVmin >= VOL_CELL_CUT_180MV) //180mV
|
||
{
|
||
if(++ucCtoRCnt >= TIME_250MS_1S)
|
||
{
|
||
bCTO = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
ucCtoRCnt = 0;
|
||
}
|
||
}
|
||
#endif
|
||
128 2 }
|
||
129 1
|
||
130 1 return bResult;
|
||
131 1 }
|
||
132
|
||
133
|
||
134 /*************************************************************************************************
|
||
135 * 函数名: BalProcess
|
||
136 * 参 数: 无
|
||
137 * 返回值: 无
|
||
138 * 描 述:
|
||
139 1. 平衡周期分为5个STEP,合计250mS
|
||
140 2. 平衡效率<100/(250mS*2)(采用奇偶平衡)
|
||
141 3. 如果检测到断线,则持续开启平衡进行断线检测
|
||
142 4. 平衡开启后,正常的电压保护判断延时可能会多延时250mS(一个平衡周期)
|
||
143 *************************************************************************************************/
|
||
144 void BalProcess(void)
|
||
145 {
|
||
146 1 U16 BalChTemp;
|
||
147 1
|
||
148 1 //判断电芯电压压差是否超过1.2V,如果超过则允许判断断线,主要解决电芯电压<2V情况下平衡会触发断线判断条件
|
||
149 1 //判断电芯最大电压是否小于1.38V,如果小于则允许判断断线,主要解决未有效检测电芯电压的情况下压差不满足断线<EFBFBD>
|
||
-卸咸跫<E592B8>
|
||
150 1 if((uiCellVmax-uiCellVmin>=VOL_CELL_CUT_1200MV) || (uiCellVmax<=VOL_CELL_CUT_1380MV))
|
||
151 1 {
|
||
152 2 bCTOValidFlg = 1;
|
||
153 2 }
|
||
154 1
|
||
155 1 switch(ucBalanceStep)
|
||
156 1 {
|
||
157 2 case BALANCE_ENABLE: //VADC采集的数据用于正常电压判断
|
||
158 2 if(bCellOpenDecFlag || bBalanceFlg)
|
||
159 2 {
|
||
160 3 if(bBalanceOddFlg) //odd balance
|
||
161 3 {
|
||
162 4 BalChTemp = uiBalanceChannel&0x5555;
|
||
163 4 }
|
||
164 3 else //even balance
|
||
165 3 {
|
||
166 4 BalChTemp = uiBalanceChannel&0xAAAA;
|
||
167 4 }
|
||
168 3 AfeBalCtl(BalChTemp); //开启平衡
|
||
169 3 ucBalanceStep = BALANCE_START;
|
||
170 3 bBalancingFlg = 1;
|
||
C51 COMPILER V9.01 BALANCE 02/08/2025 15:18:20 PAGE 4
|
||
|
||
171 3 }
|
||
172 2 break;
|
||
173 2
|
||
174 2 case BALANCE_START: //VADC采集的电压数据丢掉
|
||
175 2 ucBalanceStep = BALANCING;
|
||
176 2 break;
|
||
177 2
|
||
178 2 case BALANCING: //VADC采集的电压数据判断断线
|
||
179 2 if(!CTOCheckVol()) //如果发现有断线则连续检测断线
|
||
180 2 {
|
||
181 3 AfeBalCtl(0); //关闭平衡
|
||
182 3 ucBalanceStep = BALANCE_DISABLE;
|
||
183 3 bBalanceOddFlg = ~bBalanceOddFlg;
|
||
184 3 }
|
||
185 2 break;
|
||
186 2
|
||
187 2 case BALANCE_DISABLE: //VADC采集的电压数据丢掉
|
||
188 2 if(!CTOCheckVol()) //如果发现有断线则连续检测断线
|
||
189 2 {
|
||
190 3 ucBalanceStep = BALANCE_NULL;
|
||
191 3 }
|
||
192 2 else
|
||
193 2 {
|
||
194 3 ucBalanceStep = BALANCE_ENABLE;
|
||
195 3 bBalanceOddFlg = ~bBalanceOddFlg;
|
||
196 3 }
|
||
197 2 break;
|
||
198 2
|
||
199 2 case BALANCE_NULL: //VADC采集的数据用于正常电压判断
|
||
200 2 ucBalanceStep = BALANCE_ENABLE;
|
||
201 2 bCellOpenDecFlag = 0;
|
||
202 2 bBalanceFlg = 0;
|
||
203 2 bBalancingFlg = 0;
|
||
204 2 break;
|
||
205 2 }
|
||
206 1 }
|
||
207
|
||
208
|
||
209 /*************************************************************************************************
|
||
210 * 函数名: CellOpenProcess
|
||
211 * 参 数: 无
|
||
212 * 返回值: 无
|
||
213 * 描 述: 每2S开启一次断线检测
|
||
214 *************************************************************************************************/
|
||
215 void CTOTurnOnCheck(void)
|
||
216 {
|
||
217 1 #ifdef SP_CTO_RECOVER
|
||
if(bCTO_EN) //支持断线恢复
|
||
#else
|
||
220 1 if(bCTO_EN && !bCTO) //如果已发生断线则不检测
|
||
221 1 #endif
|
||
222 1 {
|
||
223 2 if(++ucCellOpenDecCnt >= TIME_50MS_2250MS) //2S
|
||
224 2 {
|
||
225 3 ucCellOpenDecCnt = TIME_50MS_2250MS; //避免该检测周期是平衡的偶数倍关系
|
||
226 3 if(!bBalancingFlg) //如果正在平衡,则等一个平衡周期结束后再开启断线检测
|
||
227 3 {
|
||
228 4 ucCellOpenDecCnt = 0;
|
||
229 4 bCellOpenDecFlag = 1;
|
||
230 4 uiBalanceChannel = 0x03ff;
|
||
231 4 }
|
||
232 3 }
|
||
C51 COMPILER V9.01 BALANCE 02/08/2025 15:18:20 PAGE 5
|
||
|
||
233 2 }
|
||
234 1 }
|
||
235
|
||
236 /*************************************************************************************************
|
||
237 * 函数名: BalanceProcess
|
||
238 * 参 数: 无
|
||
239 * 返回值: 无
|
||
240 * 描 述: 平衡与断线检测处理
|
||
241 *************************************************************************************************/
|
||
242 void BalanceProcess(void)
|
||
243 {
|
||
244 1 BalTurnOnCheck(); //检测是否满足平衡开启条件
|
||
245 1
|
||
246 1 CTOTurnOnCheck(); //定时开启断线检测
|
||
247 1
|
||
248 1 BalProcess(); //处理平衡和断线时序
|
||
249 1 }
|
||
250
|
||
251
|
||
252
|
||
253
|
||
|
||
|
||
MODULE INFORMATION: STATIC OVERLAYABLE
|
||
CODE SIZE = 611 ----
|
||
CONSTANT SIZE = ---- ----
|
||
XDATA SIZE = 6 2
|
||
PDATA SIZE = ---- ----
|
||
DATA SIZE = ---- ----
|
||
IDATA SIZE = ---- ----
|
||
BIT SIZE = 5 1
|
||
END OF MODULE INFORMATION.
|
||
|
||
|
||
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|