ZDBMS/output/Calculate.lst

543 lines
30 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 CALCULATE 02/13/2025 10:07:28 PAGE 1
C51 COMPILER V9.01, COMPILATION OF MODULE CALCULATE
OBJECT MODULE PLACED IN .\output\Calculate.obj
COMPILER INVOKED BY: D:\Tool\Keil\C51\BIN\C51.EXE code_drv\Calculate.c LARGE OPTIMIZE(7,SIZE) REGFILE(.\output\MCUCore_L
-oad.ORC) BROWSE INTVECTOR(0X1000) INCDIR(.\header_app;.\header_drv;.\code_gasguage;.\code_classb\iec60730_lib\include;.\
-code_classb\iec60730_proc\Include;.\code_classb\config) DEBUG OBJECTEXTEND PRINT(.\output\Calculate.lst) OBJECT(.\output
-\Calculate.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 U8 xdata ucChgingCheckCnt;
13 U8 xdata ucDsgingCheckCnt;
14
15 /*************************************************************************************************
16 * 函数名: CalcuTemp
17 * 参 数: 无
18 * 返回值: 无
19 * 描 述: 根据计算的阻值来查表,获取对应温度。温度变量保存的为开尔文温度*10
20 例如摄氏度25°温度变量保存的值为2731+250
21 *************************************************************************************************/
22 U16 CalcuTemp(U16 getdata)
23 {
24 1 U8 i;
25 1 U16 Temperature;
26 1 U32 Tempcalcu;
27 1
28 1 #if (AFE_ID == 0x34)
Tempcalcu = (U32)getdata*REF_RES_VAL/(32768-getdata);
#else
31 1 Tempcalcu= (U32)getdata*REF_RES_VAL/(4096-getdata); //calculte the resistance value of 103AT
32 1 if(Tempcalcu > 10)
33 1 {
34 2 Tempcalcu -= 10;
35 2 }
36 1 #endif
37 1
38 1 if(Tempcalcu >= NTC103AT[0]) //look up table to find the resieter correspond
-temp
39 1 {
40 2 Temperature = 2731+(TEMP_LOWER_LIMIT *10);
41 2 }
42 1 else if(Tempcalcu <= NTC103AT[NTC103AT_ARRAY_LEN-1])
43 1 {
44 2 Temperature = 2731+(TEMP_UPPER_LIMIT *10);
45 2 }
46 1 else
47 1 {
48 2 i = ucTempeMiddle; //the ucTempeMiddle must be initialized in InitVar()
49 2 if(Tempcalcu > NTC103AT[i])
50 2 {
51 3 for(i=ucTempeMiddle-1; i>=0; i--)
C51 COMPILER V9.01 CALCULATE 02/13/2025 10:07:28 PAGE 2
52 3 {
53 4 if(Tempcalcu <= NTC103AT[i]) //NTC103AT[i+1]<resis<NTC103AT[i]
54 4 {
55 5 break;
56 5 }
57 4 }
58 3 }
59 2 else
60 2 {
61 3 for(i=ucTempeMiddle+1; i<NTC103AT_ARRAY_LEN-1; i++)
62 3 {
63 4 if(Tempcalcu > NTC103AT[i]) //NTC103AT[i-1]<resis<NTC103AT[i]
64 4 {
65 5 break;
66 5 }
67 4 }
68 3 i--;
69 3 }
70 2 ucTempeMiddle = i;
71 2 #if NTC_SL //SL热敏电阻
72 2 Temperature = (U16)(ucTempeMiddle-20)*10+(NTC103AT[i]-Tempcalcu)*10/(NTC103AT[i]-NTC103AT[i+1])+2731;
73 2 #else
Temperature = (U16)(ucTempeMiddle-50)*10+(NTC103AT[i]-Tempcalcu)*10/(NTC103AT[i]-NTC103AT[i+1])+2731;
#endif
76 2 }
77 1 return Temperature;
78 1 }
79
80
81 /*************************************************************************************************
82 * 函数名: AfeGetVol、AfeGetTempe
83 * 参 数: 无
84 * 返回值: 无
85 * 描 述: 从AFE读取电压、温度采集数据
86 *************************************************************************************************/
87 BOOL AfeGetVol(void)
88 {
89 1 U8 i;
90 1 BOOL Result=1;
91 1
92 1 for(i=ucCellNumOffset; i<(ucCellNum+ucCellNumOffset); i++)
93 1 {
94 2 if(!AFEReadReg(AFE_CELL1H+2*i, 2, (U8 xdata *)(&AFE.uiCell[i]))) //通过TWI读取VADC采集的电压值()
95 2 {
96 3 Result = 0;
97 3 return Result;
98 3 }
99 2 }
100 1
101 1 return Result;
102 1 }
103
104 BOOL AfeGetTempe(void)
105 {
106 1 BOOL Result=1;
107 1
108 1 if(!AFEReadReg(AFE_TS1H, 2, (U8 xdata *)&AFE.uiTS[0]))
109 1 {
110 2 Result = 0;
111 2 }
112 1 if(!AFEReadReg(AFE_TS2H, 2, (U8 xdata *)&AFE.uiTS[1]))
113 1 {
C51 COMPILER V9.01 CALCULATE 02/13/2025 10:07:28 PAGE 3
114 2 Result = 0;
115 2 }
116 1
117 1 if(!AFEReadReg(AFE_TEMP1H, 2, (U8 xdata *)&AFE.uiICTempe[0]))
118 1 {
119 2 Result = 0;
120 2 }
121 1 if(ucCellNum > 5) //6~10串应用时
122 1 {
123 2 if(!AFEReadReg(AFE_TEMP2H, 2, (U8 xdata *)&AFE.uiICTempe[1]))
124 2 {
125 3 Result = 0;
126 3 }
127 2 }
128 1
129 1 return Result;
130 1 }
131
132
133 /*************************************************************************************************
134 * 函数名: AfeCalcuTempe
135 * 参 数: 无
136 * 返回值: 无
137 * 描 述: 计算温度更新uiTempeMax、uiTempeMin
138 *************************************************************************************************/
139 void AfeCalcuTempe(void)
140 {
141 1 U16 TempeData;
142 1
143 1 if(AfeGetTempe())
144 1 {
145 2 TempeData = CalcuTemp(AFE.uiTS[0]) + E2siTS0Offset; //计算外部温度1
146 2 #if (UART0_DEFINE != 0)
147 2 IrqUart0Dis();
148 2 #endif
149 2 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
152 2 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
155 2 Info.uiTS[0] = TempeData;
156 2 #if (UART0_DEFINE != 0)
157 2 IrqUart0En(); //开启uart0中断
158 2 #endif
159 2 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
162 2 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
165 2 TempeData = (U32)AFE.uiICTempe[0]*17/10+31; //计算内部温度1
166 2 #if (UART0_DEFINE != 0)
167 2 IrqUart0Dis();
168 2 #endif
169 2 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
172 2 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
175 2 Info.uiICTempe[0] = TempeData;
C51 COMPILER V9.01 CALCULATE 02/13/2025 10:07:28 PAGE 4
176 2
177 2 #if (UART0_DEFINE != 0)
178 2 IrqUart0En(); //开启uart0中断
179 2 #endif
180 2 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
183 2 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
186 2
187 2 if(ucCellNum > 5) //6~10串应用时
188 2 {
189 3 TempeData = (U32)AFE.uiICTempe[1]*17/10+31; //计算内部温度2
190 3 #if (UART0_DEFINE != 0)
191 3 IrqUart0Dis();
192 3 #endif
193 3 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
196 3 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
199 3 Info.uiICTempe[1] = TempeData;
200 3 #if (UART0_DEFINE != 0)
201 3 IrqUart0En(); //开启uart0中断
202 3 #endif
203 3 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
206 3 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
209 3 }
210 2
211 2 uiTempeMin = Info.uiTS[0];
212 2 uiTempeMax = Info.uiTS[0];
213 2 if(bTempNum)
214 2 {
215 3 TempeData = CalcuTemp(AFE.uiTS[1]) + E2siTS1Offset; //计算外部温度2
216 3 #if (UART0_DEFINE != 0)
217 3 IrqUart0Dis();
218 3 #endif
219 3 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
222 3 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
225 3 Info.uiTS[1] = TempeData;
226 3 #if (UART0_DEFINE != 0)
227 3 IrqUart0En(); //开启uart0中断
228 3 #endif
229 3 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
232 3 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
235 3
236 3 if(TempeData < uiTempeMin)
237 3 {
C51 COMPILER V9.01 CALCULATE 02/13/2025 10:07:28 PAGE 5
238 4 uiTempeMin = TempeData;
239 4 }
240 3 else
241 3 {
242 4 uiTempeMax = TempeData;
243 4 }
244 3 }
245 2 }
246 1 }
247
248
249 /*************************************************************************************************
250 * 函数名: AfeCalcuVol
251 * 参 数: 无
252 * 返回值: 无
253 * 描 述: 计算电压同步更新最大值最小值uiVadcVmax、uiVadcVmin用于断线判断
254 当没有平衡时才更新uiCellVmax、uiCellVmin用于保护判断
255 *************************************************************************************************/
256 void AfeCalcuVol(void)
257 {
258 1 U8 i;
259 1 U32 TempPackVol=0, TempCellVol=0;
260 1 uiVadcVmax = 0;
261 1 uiVadcVmin = 6000;
262 1
263 1 if(AfeGetVol())
264 1 {
265 2 for(i=ucCellNumOffset; i<(ucCellNum+ucCellNumOffset); i++)
266 2 {
267 3 TempCellVol = (U32)AFE.uiCell[i]*CALIVOL/E2uiVPackGain;
268 3
269 3 if(TempCellVol > uiVadcVmax) //计算最大值&最小值
270 3 {
271 4 uiVadcVmax = TempCellVol;
272 4 }
273 3 if(TempCellVol < uiVadcVmin)
274 3 {
275 4 uiVadcVmin = TempCellVol;
276 4 }
277 3
278 3 if(!bBalancingFlg) //if bCellOpenDecFlag this data will throw away
279 3 {
280 4 #if (UART0_DEFINE != 0)
281 4 IrqUart0Dis();
282 4 #endif
283 4 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
286 4 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
289 4 Info.uiVCell[i] = TempCellVol;
290 4 #if (UART0_DEFINE != 0)
291 4 IrqUart0En(); //开启uart0中断
292 4 #endif
293 4 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
296 4 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
299 4 TempPackVol += TempCellVol;
C51 COMPILER V9.01 CALCULATE 02/13/2025 10:07:28 PAGE 6
300 4 }
301 3 }
302 2
303 2 if(!bBalancingFlg)
304 2 {
305 3 uiCellVmax = uiVadcVmax;
306 3 uiCellVmin = uiVadcVmin;
307 3
308 3 #if (UART0_DEFINE != 0)
309 3 IrqUart0Dis();
310 3 #endif
311 3 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
314 3 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
317 3 Info.ulVoltage = TempPackVol; //Calculate the total voltage
318 3 #if (UART0_DEFINE != 0)
319 3 IrqUart0En(); //开启uart0中断
320 3 #endif
321 3 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
324 3 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
327 3 }
328 2 }
329 1 }
330
331
332 /*************************************************************************************************
333 * 函数名: CurTempOffset
334 * 参 数: 无
335 * 返回值: 无
336 * 描 述: 不同芯片温度下ADC的补偿值
337 *************************************************************************************************/
338 S16 code siCurTempOffset[2][13]=
339 { /**0****1****2****3***4***5***6***7***8***9**10**11**12**/
340 {-40, -30, -20, -10, 0, 10, 25, 35, 45, 55, 65, 75, 85},
341 { -5, -4, -3, -2, -1, -1, 0, 1, 1, 2, 3, 4, 5},
342 };
343
344 /*************************************************************************************************
345 * 函数名: OffsetCalculate()
346 * 参 数: 无
347 * 返回值: 无
348 * 描 述: 根据芯片内部温度实时调整0电流补偿值以便消除温度对ADC采集产生的影响
349 *************************************************************************************************/
350 S16 OffsetCalculate(void)
351 {
352 1 S16 xdata siCadcTempOffset=0; //20220620
353 1 U8 xdata i;
354 1
355 1 for(i=0; i<12; i++)
356 1 {
357 2 if(Info.uiICTempe[0] <= (((S32)siCurTempOffset[0][i] + siCurTempOffset[0][i+1]) / 2 * 10 + 2731))
358 2 {
359 3 siCadcTempOffset = siCurTempOffset[1][i];
360 3 break;
361 3 }
C51 COMPILER V9.01 CALCULATE 02/13/2025 10:07:28 PAGE 7
362 2 }
363 1 return siCadcTempOffset;
364 1 }
365
366 /*************************************************************************************************
367 * 函数名: AfeCalcuCurr
368 * 参 数: 无
369 * 返回值: 无
370 * 描 述: 计算CADC采集的电流数据
371 *************************************************************************************************/
372 void AfeCalcuCurr(void)
373 {
374 1 U8 i;
375 1 S32 Tempdata=0;
376 1
377 1 AFEReadReg(AFE_CURH, 2, (U8 xdata *)&AFE.siCurr); //通过TWI读取CADC采集的电流值
378 1
379 1 if((AFE.siCurr&0x1000) != 0) //根据bit12判断是否为负数(放电电流为负值)如为负值高位补0
380 1 {
381 2 AFE.siCurr|=0xE000;
382 2 }
383 1 slCadcCurrent = (S32)CALICUR*(AFE.siCurr-E2siCadcOffset+OffsetCalculate())/E2siCadcGain;
384 1
385 1 slCadcCurBuf[ucCadcCnt] = slCadcCurrent; //对连续采集的16次电流取平均值作为当前电流值
386 1 if(++ucCadcCnt >= 16)
387 1 {
388 2 ucCadcCnt = 0;
389 2 }
390 1 for(i=0; i<16; i++)
391 1 {
392 2 Tempdata += slCadcCurBuf[i];
393 2 }
394 1 slCadcCurAverage = Tempdata/16;
395 1
396 1 bDSGING = 0; //根据电流判定充放电状态
397 1 bCHGING = 0;
398 1 if(slCadcCurAverage < (-E2siDfilterCur))
399 1 {
400 2 if(++ucDsgingCheckCnt >= TIME_50MS_500MS) //充放电状态检测延时10*50mS
401 2 {
402 3 ucDsgingCheckCnt = TIME_50MS_500MS;
403 3 bDSGING = 1;
404 3 #if (UART0_DEFINE != 0)
405 3 IrqUart0Dis();
406 3 #endif
407 3 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
410 3 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
413 3 Info.slCurr = slCadcCurAverage;
414 3 #if (UART0_DEFINE != 0)
415 3 IrqUart0En(); //开启uart0中断
416 3 #endif
417 3 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
420 3 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
423 3 }
C51 COMPILER V9.01 CALCULATE 02/13/2025 10:07:28 PAGE 8
424 2 }
425 1 else if(slCadcCurAverage > E2siDfilterCur)
426 1 {
427 2 if(++ucChgingCheckCnt >= TIME_50MS_500MS) //充放电状态检测延时10*50mS
428 2 {
429 3 ucChgingCheckCnt = TIME_50MS_500MS;
430 3 bCHGING = 1;
431 3 McuPWM2Set(4000, 100);
432 3 #if (UART0_DEFINE != 0)
433 3 IrqUart0Dis();
434 3 #endif
435 3 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
438 3 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
441 3 Info.slCurr = slCadcCurAverage;
442 3 #if (UART0_DEFINE != 0)
443 3 IrqUart0En(); //开启uart0中断
444 3 #endif
445 3 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
448 3 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
451 3 }
452 2 }
453 1 else
454 1 {
455 2 #if (UART0_DEFINE != 0)
456 2 IrqUart0Dis();
457 2 #endif
458 2 #if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
461 2 #if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
464 2 Info.slCurr = 0;
465 2 #if (UART0_DEFINE != 0)
466 2 IrqUart0En(); //开启uart0中断
467 2 #endif
468 2 #if (UART1_DEFINE != 0)
IrqUart1En(); //开启uart1中断
#endif
471 2 #if (UART2_DEFINE != 0)
IrqUart2En(); //初始化UART2中断使能根据具体使用UART模块来进行选择
#endif
474 2 }
475 1 }
476
477
478 /*************************************************************************************************
479 * 函数名: AFEInfoProcess
480 * 参 数: 无
481 * 返回值: 无
482 * 描 述: 每50mS读取AFE信息并更新电压、电流、温度数据
483 *************************************************************************************************/
484 void AFEInfoProcess(void)
485 {
C51 COMPILER V9.01 CALCULATE 02/13/2025 10:07:28 PAGE 9
486 1 AFERdFlg();
487 1
488 1 bVADCFlg = 0;
489 1 AfeCalcuVol();
490 1 AfeCalcuTempe();
491 1
492 1 if(bCADCFlg) //当CADC转换完成后才读取AFE电流信息并计算
493 1 {
494 2 bCADCFlg = 0;
495 2 AfeCalcuCurr();
496 2 }
497 1 }
498
499
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1772 ----
CONSTANT SIZE = 52 ----
XDATA SIZE = 2 25
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)