ZDBMS/output/Balance.lst

294 lines
15 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

C51 COMPILER V9.01 BALANCE 02/07/2025 10:36:15 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>氤涞缃刂故痹萃<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/07/2025 10:36:15 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/07/2025 10:36:15 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/07/2025 10:36:15 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/07/2025 10:36:15 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)