remain_distance.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. /**
  2. ******************************************************************************
  3. * @file remain_distance.c
  4. * @author Damon
  5. * @version V1.5
  6. * @date 20190105
  7. * @brief 电池剩余续航里程统计
  8. ******************************************************************************
  9. * @attention
  10. *本功能模块输出计算结果为,剩余续航里程RemainDis.remainDistance
  11. *
  12. ******************************************************************************
  13. */
  14. #include "remain_distance.h"
  15. #include "eeprom_24c02.h"
  16. #include "math_tools.h"
  17. /*电流积分,最小值,单位mA*/
  18. #define CURRENT_MIN 130
  19. /*电流积分周期*/
  20. #define Q_ADD_TIME_MS 5
  21. extern const MC_AvgPower_Struct_t MC_AvgPower_Default;
  22. //续航计算相关参数
  23. Remain_Dis_t RemainDis = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFF, 0, 0, FALSE, 0};
  24. //电池电量计算相关参数
  25. Battery_Info_t Battery_Info = {0, 0, 0, 0, 0, FALSE, 0, 0, 0};
  26. /******************************************************************************
  27. * @Function: void RD_getQRemainRecord( void )
  28. * @Discrible: 读取电池剩余电量
  29. * @Param:
  30. * @Return:
  31. * @Others: 此函数在系统上电时调用一次,读取电池剩余电量
  32. 已添加到RD_RemainDis_init(void),无需单独调用
  33. ******************************************************************************
  34. * @Recode date version author modify
  35. * ------------------------------------------------------------------
  36. * 20190815 V1.3 Damon modify
  37. *
  38. *******************************************************************************/
  39. static void RD_getQRemainRecord(uint16_t Volgate, uint16_t RateVol, BatterCellInfo_Struct_t* CellParam)
  40. {
  41. uint16_t BusVoltage;
  42. uint16_t i;
  43. uint16_t Num, BatteryRemainQ;
  44. //根据额定电压换算电芯电压
  45. if(RateVol == 24)
  46. BusVoltage = Volgate * 10 / 7;
  47. else if(RateVol == 48)
  48. BusVoltage = Volgate * 10 / 13;
  49. else
  50. BusVoltage = Volgate;
  51. //查表读取电池电量
  52. Num = sizeof(CellParam->CellParam) >> 1;
  53. for(i = 0; i < Num; i++)
  54. {
  55. if(CellParam->CellParam[i] <= BusVoltage)
  56. {
  57. BatteryRemainQ = CellParam->DesignCap - i * CellParam->DesignCap / 100;
  58. break;
  59. }
  60. else//电池电压低于最小值
  61. {
  62. BatteryRemainQ = 0;
  63. }
  64. }
  65. MC_RunInfo.SOC = Num - i - 1;
  66. Battery_Info.Q_remain_real = BatteryRemainQ;
  67. }
  68. /******************************************************************************
  69. * @Function: void RD_RemainDis_init(void)
  70. * @Discrible: 模块功能初始化
  71. * @Param: uwWheelLength:轮胎周长,BusVoltage:母线电压
  72. * @Return:
  73. * @Others: 此函数在进入主循环前调用,调用后,标志位置位,开启模块的统计功能
  74. ******************************************************************************
  75. * @Recode date version author modify
  76. * ------------------------------------------------------------------
  77. * 20181221 V1.2 Damon modify
  78. *
  79. *******************************************************************************/
  80. void RD_RemainDis_Init(uint16_t uwWheelLength, TrueOrFalse_Flag_Struct_t BMS_COM_OK, uint16_t BusVoltage, uint8_t DesignVol, uint16_t BMS_RC)
  81. {
  82. Battery_Info.Q_discharged = 0;
  83. Battery_Info.Q_remain_real = 0;
  84. Battery_Info.Q_remain_record = BatteryCellInfo.DesignCap;
  85. Battery_Info.Q_remain_real_last = 0;
  86. if(BMS_COM_OK == TRUE) //电池通讯正常时,直接获取电池容量
  87. {
  88. Battery_Info.Q_remain_real = BMS_RC;
  89. }
  90. else //电池不含通讯时,根据母线电压估算剩余容量
  91. {
  92. // RD_getQRemainRecord(BusVoltage * 36 / DesignVol); //放电曲线是按照36V,针对48V或24V做等效转换
  93. }
  94. RemainDis.start = 0;
  95. RemainDis.I_motor = 0;
  96. RemainDis.acc_period = Q_ADD_TIME_MS;
  97. RemainDis.Q_add = 0;
  98. RemainDis.wheelLength = uwWheelLength;
  99. RemainDis.wheel_Count = 0;
  100. RemainDis.Power_per_km = 0;
  101. RemainDis.Power_per_km_average = 0;
  102. RemainDis.remainDistance = 0xFFFF;//码表显示---km
  103. RemainDis.flag_saveInfo = 0;
  104. RemainDis.flag_helpModeChange = 0;
  105. RemainDis.IsBMS_ComOK_Flag = FALSE;
  106. RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
  107. }
  108. /******************************************************************************
  109. * @Function: void RD_CalculateRemainDis(void)
  110. * @Discrible: 计算电池剩余续航里程
  111. * @Param:
  112. * @Return:
  113. * @Others: 计算平均功耗(中间变量),和剩余续航里程
  114. ******************************************************************************
  115. * @Recode date version author modify
  116. * ------------------------------------------------------------------
  117. * 20181210 V1.4 Damon modify
  118. *
  119. *******************************************************************************/
  120. void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SOC, uint16_t BusCurrent)
  121. {
  122. /*以下宏定义会影响平均功耗计算结果的变化快慢
  123. WHEEL_COUNT_REFRESH_VALUE 电量统计周期,每10圈统计一次电量
  124. Q_FIFO_LENGTH 动态平均功耗,取平均值的长度。Power_per_km(10圈x25=250圈,即动态功耗是车轮骑行250圈的平均值)
  125. P_FIFO_LENGTH 对Power_per_km求平均值的长度,Power_per_km_average(250圈x10=-2500圈)
  126. 修改宏定义的大小,可以改变Power_per_km_average的更新快慢,最终影响剩余续航里程的更新快慢。
  127. */
  128. /*车轮圈数,最小的电量统计周期*/
  129. #define WHEEL_COUNT_REFRESH_VALUE 10
  130. /*动态平均功耗,缓存长度*/
  131. #define Q_FIFO_LENGTH 25 //25 250圈 约500m
  132. /*平均功耗,缓存长度*/
  133. #define P_FIFO_LENGTH 30 //约15KM
  134. static uint16_t Q_FIFO[Q_FIFO_LENGTH]={0};
  135. static uint16_t Q_Index=0;
  136. static uint32_t Q_sum=0;
  137. static uint8_t Q_fifo_full_falg=0;
  138. static int16_t Q_add_tmp=0;
  139. static int32_t PowerPerKmFltSum=0;
  140. uint8_t i;
  141. int32_t ptmp;
  142. static uint32_t RunTimeCnt = 0;
  143. static uint32_t WheelTurnCntOld = 0;
  144. if((HAL_GetTick() - RunTimeCnt) < Q_ADD_TIME_MS)//计算周期为Q_ADD_TIME_MS
  145. {
  146. return;
  147. }
  148. RunTimeCnt = HAL_GetTick();
  149. //更新母线电流值
  150. RemainDis.I_motor = BusCurrent;
  151. //更新计算周期内轮子圈数
  152. RemainDis.wheel_Count = WheelTurnCnt - WheelTurnCntOld;
  153. /*开始计算*/
  154. if(RemainDis.start == 1)
  155. {
  156. /*电池通讯中断超时2s判断*/
  157. if((HAL_GetTick() - RemainDis.BMS_Com_DelayTimeCnt) > 2000)
  158. {
  159. RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
  160. RemainDis.IsBMS_ComOK_Flag = FALSE;
  161. }
  162. else
  163. {
  164. //更新电池剩余容量
  165. Battery_Info.Q_remain_real = RemainCap;
  166. }
  167. /*助力档位切换后*/
  168. if( RemainDis.flag_helpModeChange == 1 )
  169. {
  170. RemainDis.flag_helpModeChange = 0;
  171. /*清空一级缓冲区数据*/
  172. for(i=0;i<Q_FIFO_LENGTH;i++)
  173. {
  174. Q_FIFO[i] = 0;
  175. }
  176. Q_Index = 0;
  177. Q_sum = 0;
  178. Q_fifo_full_falg=0;
  179. if(RemainDis.Power_per_km_average != 0)
  180. {
  181. /*赋值求平均值的总和*/
  182. PowerPerKmFltSum = RemainDis.Power_per_km_average << 8;
  183. }
  184. }
  185. /*轮圈数大于设定值,计算一次*/
  186. if( RemainDis.wheel_Count >= WHEEL_COUNT_REFRESH_VALUE)
  187. {
  188. WheelTurnCntOld = WheelTurnCnt;
  189. /*消耗电量信息来自电池*/
  190. if(RemainDis.IsBMS_ComOK_Flag == TRUE )
  191. {
  192. //更新电池剩余容量
  193. Battery_Info.Q_remain_real = RemainCap;
  194. //更新电池剩余电量
  195. Battery_Info.SOC = SOC;
  196. if(Battery_Info.Q_remain_real_last != 0)
  197. {
  198. Q_add_tmp = (int16_t)(Battery_Info.Q_remain_real_last - Battery_Info.Q_remain_real);
  199. /*充电状态,或由母线电流切换到电量信息计算时,此值会出现负数*/
  200. Q_add_tmp = (Q_add_tmp > 0) ? Q_add_tmp : 0;
  201. Q_add_tmp = (Q_add_tmp < 30) ? Q_add_tmp : 30;
  202. /*判断电池是否满充*/
  203. if( ( Q_add_tmp == 0 ) && ( Battery_Info.SOC == 100 ) )
  204. {
  205. /*当电池满充时,发出的电量信息会是标称值,
  206. 在Battery.SOC==100时不会随电量消耗尔减小*/
  207. /*置标志位,不计算更新*/
  208. }
  209. else
  210. {
  211. /*将一定轮圈数消耗的电量,写入FIFO,FIFO中的数据滑动求平均值*/
  212. Q_sum -= Q_FIFO[Q_Index];
  213. Q_sum += Q_add_tmp;
  214. Q_FIFO[Q_Index++] = Q_add_tmp;
  215. if(Q_Index>=Q_FIFO_LENGTH)
  216. {
  217. Q_Index = 0;
  218. Q_fifo_full_falg = 1;
  219. /*250圈,动态功耗刷新一次,置一次eeprom保存标志*/
  220. RemainDis.flag_saveInfo = 1;
  221. }
  222. /*
  223. wheelCount x WHEEL_LENGTH(cm)
  224. ------------------------------- (km) wheelCount=(Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE)
  225. 1000 x 100
  226. Q_sum(mA*h) x 1000 x 100
  227. ------------------------------- (mA*h/km)
  228. wheelCount x WHEEL_LENGTH
  229. */
  230. if( Q_sum > 0 )
  231. {
  232. /*缓存满后,求平均值*/
  233. if(Q_fifo_full_falg==1)
  234. {
  235. RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
  236. }
  237. else
  238. {
  239. /*缓存数据未满,以当前有效数据个数求平均值*/
  240. RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_Index * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
  241. }
  242. }
  243. else
  244. {
  245. RemainDis.Power_per_km = 0;
  246. }
  247. /*电量缓存Q_FIFO计满一次,滑动滤波求平均值*/
  248. if(Q_Index==0)
  249. {
  250. ptmp = RemainDis.Power_per_km;
  251. PowerPerKmFltSum += ((ptmp << 8) - PowerPerKmFltSum) / P_FIFO_LENGTH;
  252. RemainDis.Power_per_km_average = (uint16_t)(PowerPerKmFltSum >> 8);
  253. }
  254. /*计算剩余续航里程*/
  255. if(RemainDis.Power_per_km_average > 0)
  256. {
  257. RemainDis.remainDistance = Battery_Info.Q_remain_real / RemainDis.Power_per_km_result;//单位km
  258. }
  259. else
  260. {
  261. RemainDis.remainDistance = 0xFFFF;//码表显示---km
  262. }
  263. }
  264. }
  265. }
  266. /*电量信息来自电池的计算,需要用到此数据*/
  267. Battery_Info.Q_remain_real_last = Battery_Info.Q_remain_real;
  268. }
  269. }
  270. }
  271. /******************************************************************************
  272. * @Function: void RD_saveAndUpdateInfo(uint8_t uwHelpMode)
  273. * @Discrible: 保存功耗数据到EEPROM
  274. * @Param:
  275. * @Return:
  276. * @Others: 每一公里,保存一次数据到eeprom;助力档位切换时,刷新计算的功耗数据。此函数在主循环中调用
  277. ******************************************************************************
  278. * @Recode date version author modify
  279. * ------------------------------------------------------------------
  280. * 20190105 V1.4 Damon modify
  281. *
  282. *******************************************************************************/
  283. void RD_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t MC_AssistRunMode)
  284. {
  285. static MC_GearSt_Struct_t MC_GearSt_Old = MC_GearSt_OFF;
  286. static MC_AssistRunMode_Struct_t MC_AssistRunMode_Old = MC_AssistRunMode_INVALID;
  287. static uint16_t usPowerPerKmAverageLast =0;
  288. static uint16_t powerDefaultCurrentMode=0;
  289. int16_t sPercent;
  290. int32_t ltmp;
  291. if( ( (GearSt & 0x0F) != 0 ) && ( MC_AssistRunMode != MC_AssistRunMode_INVALID ))
  292. {
  293. RemainDis.start = 1;
  294. /*保存当前助力档位的数据到eeprom*/
  295. if( RemainDis.flag_saveInfo == 1 )
  296. {
  297. RemainDis.flag_saveInfo = 0;
  298. /*平均功耗值有更新时,执行保存数据相关操作*/
  299. if( RemainDis.Power_per_km_average != usPowerPerKmAverageLast )
  300. {
  301. if(RemainDis.Power_per_km_average != 0)
  302. {
  303. /*计算平均功耗,增减量的百分比,放大100倍*/
  304. ltmp = (int32_t)(RemainDis.Power_per_km_average - powerDefaultCurrentMode) * 100;
  305. sPercent = ltmp / powerDefaultCurrentMode;
  306. /*各档位关联*/
  307. /*不低于默认值30%*/
  308. if( (sPercent >= -30)&&(sPercent <= 455) )
  309. {
  310. /*更新平均功耗*/
  311. RemainDis.Power_per_km_result = powerDefaultCurrentMode * ( 100 + sPercent ) / 100;
  312. /*计算各档位增减后的值*/
  313. ltmp = MC_AvgPower_Default.GearSt_ECO;
  314. MC_AvgPower.GearSt_ECO = ltmp * ( 100 + sPercent ) / 100;
  315. ltmp = MC_AvgPower_Default.GearSt_NORM;
  316. MC_AvgPower.GearSt_NORM = ltmp * ( 100 + sPercent ) / 100;
  317. ltmp = MC_AvgPower_Default.GearSt_SPORT;
  318. MC_AvgPower.GearSt_SPORT = ltmp * ( 100 + sPercent ) / 100;
  319. ltmp = MC_AvgPower_Default.GearSt_TURBO;
  320. MC_AvgPower.GearSt_TURBO = ltmp * ( 100 + sPercent ) / 100;
  321. ltmp = MC_AvgPower_Default.GearSt_SMART;
  322. MC_AvgPower.GearSt_SMART = ltmp * ( 100 + sPercent ) / 100;
  323. /*保存所有档位的更新数据*/
  324. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
  325. }
  326. }
  327. /*备份平均功耗值*/
  328. usPowerPerKmAverageLast = RemainDis.Power_per_km_average;
  329. }
  330. }
  331. /*助力档位切换后,根据当前档位更新功耗数据*/
  332. if((GearSt != MC_GearSt_Old) || (MC_AssistRunMode != MC_AssistRunMode_Old))
  333. {
  334. switch(GearSt)
  335. {
  336. case MC_GearSt_Torque_ECO:
  337. RemainDis.Power_per_km_average = MC_AvgPower.GearSt_ECO;
  338. powerDefaultCurrentMode = MC_AvgPower_Default.GearSt_ECO;
  339. break;
  340. case MC_GearSt_Torque_NORM:
  341. RemainDis.Power_per_km_average = MC_AvgPower.GearSt_NORM;
  342. powerDefaultCurrentMode = MC_AvgPower_Default.GearSt_NORM;
  343. break;
  344. case MC_GearSt_Torque_SPORT:
  345. RemainDis.Power_per_km_average = MC_AvgPower.GearSt_SPORT;
  346. powerDefaultCurrentMode = MC_AvgPower_Default.GearSt_SPORT;
  347. break;
  348. case MC_GearSt_Torque_TURBO:
  349. RemainDis.Power_per_km_average = MC_AvgPower.GearSt_TURBO;
  350. powerDefaultCurrentMode = MC_AvgPower_Default.GearSt_TURBO;
  351. break;
  352. case MC_GearSt_SMART:
  353. RemainDis.Power_per_km_average = MC_AvgPower.GearSt_SMART;
  354. powerDefaultCurrentMode = MC_AvgPower_Default.GearSt_SMART;
  355. break;
  356. default:
  357. RemainDis.Power_per_km_average = 0;
  358. powerDefaultCurrentMode = 0;
  359. break;
  360. }
  361. /*备份平均功耗值*/
  362. usPowerPerKmAverageLast = RemainDis.Power_per_km_average;
  363. RemainDis.Power_per_km_result = RemainDis.Power_per_km_average;
  364. /*计算剩余续航里程*/
  365. if(RemainDis.Power_per_km_average > 0)
  366. {
  367. RemainDis.remainDistance = Battery_Info.Q_remain_real / RemainDis.Power_per_km_result;//单位km
  368. }
  369. else
  370. {
  371. RemainDis.remainDistance = 0xFFFF;//码表界面显示:---km
  372. }
  373. /*置标志位,在后续计算中,刷新相关数据*/
  374. RemainDis.flag_helpModeChange = 1;
  375. }
  376. }
  377. else
  378. {
  379. RemainDis.start = 0;
  380. RemainDis.Power_per_km_average = 0;
  381. RemainDis.Power_per_km_result = 0;
  382. RemainDis.remainDistance = 0xFFFF;//码表界面显示:---km
  383. }
  384. /*备份助力档位*/
  385. MC_GearSt_Old = GearSt;
  386. MC_AssistRunMode_Old = MC_AssistRunMode;
  387. }
  388. /*
  389. 根据电池电压计算剩余电量,运行周期200ms
  390. */
  391. uint8_t Battery_SocCal(Battery_Info_t* p_Battery_Info, BatterCellInfo_Struct_t* p_CellInfo, uint8_t SOC_Old, uint8_t Vol_Design)
  392. {
  393. static uint16_t TimeDelayCnt = 0;
  394. static uint8_t Result = 0, Result_Pre=0;
  395. static TrueOrFalse_Flag_Struct_t InitFlag = FALSE;
  396. uint16_t i;
  397. uint16_t TableNum;
  398. uint32_t BatteryRemainQ;
  399. static uint8_t u8LoopCnt = 0;
  400. static uint16_t u16MaxVoltage = 0;
  401. static uint32_t u32VolSum = 0;
  402. static TrueOrFalse_Flag_Struct_t FlagFristCal = TRUE;
  403. TableNum = sizeof(p_CellInfo->CellParam) >> 1;
  404. if(InitFlag == FALSE) //初始化动态显示百分比
  405. {
  406. if(HAL_GetTick() < 2500)
  407. return 0;
  408. else
  409. {
  410. TimeDelayCnt++;
  411. u32VolSum += p_Battery_Info->u16CurVoltage;
  412. if(TimeDelayCnt <= 1) return 25;
  413. else if(TimeDelayCnt <= 3) return 50;
  414. else if(TimeDelayCnt <= 5) return 75;
  415. else if(TimeDelayCnt <= 7) return 100;
  416. else
  417. {
  418. InitFlag = TRUE;
  419. u16MaxVoltage = (Vol_Design == 24) ? (uint16_t)(u32VolSum >> 3) * 10 / 7
  420. : ((Vol_Design == 48) ? (uint16_t)(u32VolSum >> 3) * 10 / 13
  421. : (uint16_t)(u32VolSum >> 3));
  422. //查表计算SOC
  423. for(i=0; i<TableNum; i++)
  424. {
  425. if(p_CellInfo->CellParam[i] <= u16MaxVoltage)
  426. {
  427. BatteryRemainQ = p_CellInfo->DesignCap - i * p_CellInfo->DesignCap / 100;
  428. break;
  429. }
  430. else//电池电压低于最小值
  431. {
  432. BatteryRemainQ = 0;
  433. }
  434. }
  435. p_Battery_Info->Q_remain_record = BatteryRemainQ;
  436. return TableNum - i - 1;
  437. }
  438. }
  439. }
  440. else //初始化后根据电压平均值计算百分比
  441. {
  442. Result_Pre = SOC_Old;
  443. Result = Result_Pre;
  444. if(p_Battery_Info->BFlagCalSoc == TRUE)
  445. {
  446. //后面取12个值的最大值
  447. p_Battery_Info->u16BusAverageVol[u8LoopCnt++] = (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000);
  448. if(u8LoopCnt >= 12)
  449. {
  450. u16MaxVoltage = (Vol_Design == 24) ? GetMaxData(p_Battery_Info->u16BusAverageVol, 12) * 10 / 7
  451. : ((Vol_Design == 48) ? GetMaxData(p_Battery_Info->u16BusAverageVol, 12) * 10 / 13
  452. : GetMaxData(p_Battery_Info->u16BusAverageVol, 12));
  453. u8LoopCnt = 0;
  454. }
  455. //查表计算SOC
  456. for(i=0; i<TableNum; i++)
  457. {
  458. if(p_CellInfo->CellParam[i] <= u16MaxVoltage)
  459. {
  460. BatteryRemainQ = p_CellInfo->DesignCap - i * p_CellInfo->DesignCap / 100;
  461. break;
  462. }
  463. else//电池电压低于最小值
  464. {
  465. BatteryRemainQ = 0;
  466. }
  467. }
  468. p_Battery_Info->Q_remain_record = BatteryRemainQ;
  469. Result = TableNum - i - 1;
  470. //电量上升时,突变较小,取上次计算值
  471. if(Result > Result_Pre)
  472. {
  473. if(Result < (Result_Pre + 20))
  474. {
  475. Result = Result_Pre;
  476. }
  477. }
  478. p_Battery_Info->u32TotalBusVoltage = 0;
  479. p_Battery_Info->BFlagCalSoc = FALSE;
  480. }
  481. return Result;
  482. }
  483. }