C51 COMPILER V9.00 GASGAUGE 03/13/2023 18:09:38 PAGE 1 C51 COMPILER V9.00, COMPILATION OF MODULE GASGAUGE OBJECT MODULE PLACED IN .\output\GasGauge.obj COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE code_gasguage\GasGauge.c LARGE OPTIMIZE(7,SIZE) REGFILE(.\output\MCUCore -_Load.ORC) BROWSE INTVECTOR(0X1000) INCDIR(.\header_app;.\header_drv;.\code_gasguage) DEBUG OBJECTEXTEND PRINT(.\output\ -GasGauge.lst) OBJECT(.\output\GasGauge.obj) line level source 1 /******************************************************************************** 2 Copyright (C), Sinowealth Electronic. Ltd. 3 Author: Sino 4 Version: V0.0 5 Date: 2020/05/30 6 History: 7 V0.0 2020/05/30 Preliminary 8 ********************************************************************************/ 9 #include "Main.h" 10 #include "math.h" 11 12 13 //ÈÝÁ¿Í³¼ÆÏà¹ØµÄ±äÁ¿ 14 BOOL bDsgEndFlg; 15 BOOL bCHGEndFlg; 16 BOOL bRSOCSlow; //SOCµ÷½ÚËÙÂʼõÂý 17 BOOL bRSOCFast; //SOCµ÷½ÚËÙÂʼӿì 18 19 U16 idata uiRCCharge; //³äµçÈÝÁ¿Í³¼Æ 20 U16 idata uiRCDischarge; //·ÅµçÈÝÁ¿Í³¼Æ 21 U16 idata uiTempBK; //ζȱ¸·Ý 22 U8 idata ucCycleGain; //¸ù¾Ý·Åµç´ÎÊýµ÷ÕûÈÝÁ¿°Ù·Ö±È 23 U16 xdata uiDfFCC; //Â˲¨Ç°µÄFCC 24 U16 xdata uiDfRC; //Â˲¨Ç°RC 25 U16 xdata uiDfRSOC; //Â˲¨Ç°RSOC 26 U8 xdata ucDSGEndDelay; 27 U8 xdata ucCHGEndDelay; 28 U8 xdata ucDSGDelay1; 29 U8 xdata ucDSGDelay2; 30 U8 xdata ucRSOCCnt; 31 S32 xdata slCur; 32 33 34 /************************************************************************************************* 35 * º¯ÊýÃû: GasGaugeInit 36 * ²Î Êý: ÎÞ 37 * ·µ»ØÖµ: ÎÞ 38 * Ãè Êö: µÚÒ»´ÎÉϵç¸ù¾Ýµçѹ³õʼ»¯ÈÝÁ¿ 39 *************************************************************************************************/ 40 void GasGaugeInit(void) 41 { 42 1 U8 i; 43 1 U16 RSOCtemp = 100; 44 1 45 1 //±äÁ¿³õʼ»¯ 46 1 bDsgEndFlg = 0; 47 1 uiRCCharge = 0; 48 1 uiRCDischarge = 0; 49 1 uiTempBK = 0; 50 1 ucCycleGain = 0; 51 1 uiDfFCC = 0; 52 1 uiDfRC = 0; 53 1 uiDfRSOC = 0; C51 COMPILER V9.00 GASGAUGE 03/13/2023 18:09:38 PAGE 2 54 1 ucDSGEndDelay = 0; 55 1 ucCHGEndDelay = 0; 56 1 ucDSGDelay1 = 0; 57 1 ucDSGDelay2 = 0; 58 1 bRSOCSlow = 0; 59 1 bRSOCFast = 0; 60 1 //ÈÝÁ¿³õʼ»¯ 61 1 for(i=0; i<10; i++) //Prejudge capacity according to initial voltage 62 1 { 63 2 if(uiCellVmax < E2uiVOC[i]) 64 2 { 65 3 if(i == 0) 66 3 { 67 4 if((uiCellVmax= E2uiVOC[7]) //·ÀÖ¹³äÂúµçºó£¬ÔٶϵçÉϵ磬RSOC»á¸Ä±ä 86 1 { 87 2 RSOCtemp = 100; 88 2 } 89 1 90 1 if(RSOCtemp>E2ucSOC) 91 1 { 92 2 RSOCtemp = E2ucSOC; 93 2 } 94 1 else 95 1 { 96 2 if((E2ucSOC-RSOCtemp) > INTSOCDIF) 97 2 { 98 3 E2ucSOC = RSOCtemp; 99 3 } 100 2 else 101 2 { 102 3 RSOCtemp = E2ucSOC; 103 3 } 104 2 } 105 1 106 1 Info.uiRSOC = RSOCtemp; 107 1 Info.ulFCC = E2ulLastFCC; 108 1 Info.ulRC = (U32)Info.ulFCC*Info.uiRSOC/100; 109 1 110 1 uiDfFCC = Info.ulFCC; //uiDfFCC/uiDfRC/uiDfRSOCΪÂ˲¨Ç°µÄ²ÎÊý£¬³ -õʼ»¯Ê±²¢Ã»ÓÐÂ˲¨ 111 1 uiDfRC = Info.ulRC; 112 1 uiDfRSOC = Info.uiRSOC *10; 113 1 114 1 if(E2uiCycleCount>CYCLECOUNTC) //¸ù¾ÝÑ­»·´ÎÊýµ÷ÕûFCCÐÞµ÷ϵÊý C51 COMPILER V9.00 GASGAUGE 03/13/2023 18:09:38 PAGE 3 115 1 { 116 2 ucCycleGain=75; 117 2 } 118 1 else if(E2uiCycleCount>CYCLECOUNTB) 119 1 { 120 2 ucCycleGain=95 - E2uiCycleCount/5; 121 2 } 122 1 else if(E2uiCycleCount>CYCLECOUNTA) 123 1 { 124 2 ucCycleGain=105 - E2uiCycleCount/10; 125 2 } 126 1 else 127 1 { 128 2 ucCycleGain=100; 129 2 } 130 1 131 1 uiTempBK = 0; //±£Ö¤·Åµç¾Í¼ÆËãÒ»´ÎFCC 132 1 ucDSGEndDelay = 0; 133 1 ucDSGDelay1 = 0; 134 1 ucDSGDelay2 = 0; 135 1 bDsgEndFlg = 0; 136 1 ucCHGEndDelay = 0; 137 1 } 138 139 140 /************************************************************************************************* 141 * º¯ÊýÃû: GasGaugeManage 142 * ²Î Êý: ÎÞ 143 * ·µ»ØÖµ: ÎÞ 144 * Ãè Êö: ¸ù¾Ý³ä·Åµç״̬ͳ¼ÆÈÝÁ¿ 145 *************************************************************************************************/ 146 void GasGaugeManage(void) 147 { 148 1 U16 xdata chgdffcc = 0; 149 1 150 1 slCur=0; 151 1 152 1 if(Info.slCurr > E2siDfilterCur) //³äµç¹ý³ÌÖеçÁ¿¼ÆËã 153 1 { 154 2 ucDSGEndDelay = 0; 155 2 ucDSGDelay1 = 0; 156 2 ucDSGDelay2 = 0; 157 2 bDsgEndFlg = 0; 158 2 159 2 chgdffcc = E2ulChgFCC*ucCycleGain/100; //³äµç¹ý³ÌFCCÒ»Ö±±£³Ö²»¸Ä±ä 160 2 161 2 if(chgdffcc != uiDfFCC) //Âú³äÈÝÁ¿ 162 2 { 163 3 uiDfRC = (U16)(chgdffcc*Info.uiRSOC/100); 164 3 IrqUartDis(); 165 3 Info.ulRC = uiDfRC; 166 3 IrqUartEn(); 167 3 } 168 2 uiDfFCC = chgdffcc; 169 2 170 2 uiRCCharge += slCadcCurAverage; //ÿ1S¼ÆËãÒ»´ÎµçÁ¿£¬Ã¿´Î¼ÓÉϵçÁ÷Öµ¼´¼ÆËãÿ -1SµÄµçÁ¿mAS 171 2 while(uiRCCharge >= mAhVALUE) //µ±ÀÛ¼ÓµçÁ¿³¬¹ý3600mAS¼´µÈÓÚ1mAh 172 2 { 173 3 uiRCCharge -= mAhVALUE; 174 3 if(uiDfRC < uiDfFCC) 175 3 { C51 COMPILER V9.00 GASGAUGE 03/13/2023 18:09:38 PAGE 4 176 4 uiDfRC++; //Ê£ÓàÈÝÁ¿Ôö¼Ó1mAh 177 4 } 178 3 else 179 3 { 180 4 uiDfRC = uiDfFCC; //µ±Ê£ÓàÈÝÁ¿µÈÓÚÂú³äÈÝÁ¿£¬ÈÝÁ¿²»ÔÙÔö¼Ó 181 4 uiRCCharge = 0; 182 4 } 183 3 } 184 2 185 2 if(uiDfRC < uiDfFCC) 186 2 { 187 3 uiDfRSOC = (U32)uiDfRC*1000/uiDfFCC; 188 3 } 189 2 else 190 2 { 191 3 uiDfRSOC = 1000; 192 3 } 193 2 194 2 if(slCadcCurAverage < E2siChgEndCurr) //³äµç½ØÖ¹Åжϣ¬Èç¹û´ËʱµÄµçÁ÷СÓÚ³äµç½ØÖ¹ -µçÁ÷ 195 2 { 196 3 if(uiCellVmax>E2uiChgEndVol) //´ËʱµÄµ¥½Ú×î´óµçѹ´óÓÚ³äµç½ØÖ¹µçѹ 197 3 { 198 4 if(++ucCHGEndDelay>=E2ucChgEndDelay) 199 4 { 200 5 ucCHGEndDelay = E2ucChgEndDelay; 201 5 bCHGEndFlg = 1; 202 5 } 203 4 } 204 3 } 205 2 206 2 CorrectCHGSOC(); //¸ù¾ÝEEPROMÖеĵçѹµã£¬ÐÞÕý³äµç¹ý³ÌÖеÄSO -C,ͬʱÐèÒªµ÷ÕûuiDfRC 207 2 208 2 } 209 1 else if(Info.slCurr < -E2siDfilterCur) //·Åµç¹ý³ÌÖмÆËãµçÁ¿ 210 1 { 211 2 ucCHGEndDelay = 0; 212 2 bCHGEndFlg = 0; 213 2 214 2 slCur = slCadcCurAverage /*+ slAdcCur2*/; //·Åµç¹ý³ÌÖÐͬʱ¼ÆËãÖ÷»Ø·¼°¸¨¿Ø»Ø·µÄµçÁ¿ 215 2 if(slCur<0) 216 2 { 217 3 uiRCDischarge -= slCur; 218 3 } 219 2 if(uiRCDischarge >= mAhVALUE) 220 2 { 221 3 while(uiRCDischarge >= mAhVALUE) //ÀۼӵķŵçµçÁ¿´óÓÚ3600mASºóͬÑùÊ£ÓàµçÁ¿¼õ1mAh 222 3 { 223 4 uiRCDischarge -= mAhVALUE; 224 4 E2ulCycleThresholdCount++; //ÀÛ¼Æ 225 4 if(uiDfRC > 1) 226 4 { 227 5 uiDfRC --; 228 5 } 229 4 } 230 3 if(E2ulCycleThresholdCount >= E2ulCycleThreshold) //cyclecount 231 3 { 232 4 E2ulCycleThresholdCount -= E2ulCycleThreshold; 233 4 E2uiCycleCount++; 234 4 } 235 3 } C51 COMPILER V9.00 GASGAUGE 03/13/2023 18:09:38 PAGE 5 236 2 237 2 CorrectDSGSOC(); 238 2 } 239 1 240 1 if(bOV) //Charge end 241 1 { 242 2 IrqUartDis(); 243 2 uiDfRC = uiDfFCC; 244 2 Info.ulRC = uiDfRC; 245 2 Info.ulFCC = Info.ulRC; 246 2 Info.uiRSOC = 100; 247 2 IrqUartEn(); 248 2 } 249 1 250 1 if(uiDfRC>uiDfFCC) 251 1 { 252 2 uiDfRC = uiDfFCC; 253 2 } 254 1 else if(uiDfRC <(uiDfFCC*2/100)) 255 1 { 256 2 uiDfRC = uiDfFCC*2/100; 257 2 } 258 1 uiDfRSOC=(U32)uiDfRC*1000/uiDfFCC; 259 1 260 1 DataFilter(); 261 1 262 1 IrqUartDis(); 263 1 E2ucSOC = Info.uiRSOC; 264 1 E2ulLastFCC = Info.ulFCC; 265 1 Info.uiCycleCount = E2uiCycleCount; 266 1 IrqUartEn(); 267 1 } 268 269 270 271 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 1410 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = 15 3 PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = 7 ---- BIT SIZE = 4 ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)