app.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878
  1. #include"common.h"
  2. #include "drv_io.h"
  3. #include "app.h"
  4. #include "app_rs485_1.h"
  5. #include "app_rs485_2.h"
  6. #include "drv_can.h"
  7. #include "app_adas.h"
  8. #include "measure_vol.h"
  9. #include "app_can.h"
  10. #include "low_power.h"
  11. #include "app_end_ctr.h"
  12. // CB_VAL cb_val_last;
  13. uint8_t cb_operate_state = CB_BAT_NO;
  14. uint8_t Check_CB_oper_sta_start = 0;
  15. DELAY_COMMON Check_CB_oper_sta_delay;
  16. uint8_t cfg_operate = CFG_BAT_NO;
  17. uint8_t work_normal = 0;
  18. uint8_t is_intelligent = 1;
  19. uint8_t CB_OPERATE_PRECEDENCE_PARRALLEL = PRE_SERIES;
  20. uint8_t CB_OPERATE_PRECEDENCE_Config = PRE_SERIES;
  21. DELAY_COMMON Series_delay;
  22. DELAY_COMMON Next_Series_delay;
  23. uint8_t Next_Series_Not_Enable = 0;
  24. uint8_t one_bat_charge_status = OBCS_CHARGER_OUT;
  25. uint8_t one_bat_initial = 1;
  26. uint8_t serise_low_enable = 0;
  27. uint8_t serise_low_qd_status = 0;
  28. UPDATE_BAT update_bat;
  29. const double nhb_default = 600;
  30. SHENG_YU_LI_CHENG sheng_yu_li_cheng;
  31. DELAY_COMMON save_param_delay;
  32. uint8_t shark_printf_enable;
  33. void Misc_Initial(void)
  34. {
  35. GPIO_Initial();
  36. }
  37. void CB_Operate_Initial(void)
  38. {
  39. _CB_Operate_Initial();
  40. // memset(&cb_val_last,0x00,sizeof(cb_val_last));
  41. //Check_CB_oper_sta_delay.set = 1;
  42. //Check_CB_oper_sta_delay.count = 0;
  43. Battery_CB_Switch(CB_BAT_NO);
  44. }
  45. void App_Initial(void)
  46. {
  47. CB_OPERATE_PRECEDENCE_PARRALLEL = CB_OPERATE_PRECEDENCE_Config;
  48. memset(&Series_delay,0x00,sizeof(Series_delay));
  49. memset(&Next_Series_delay,0x00,sizeof(Next_Series_delay));
  50. Initial_Neng_Hao_Bi();
  51. }
  52. uint8_t Check_Battery_1_On(void)
  53. {
  54. uint32_t vol = 0;
  55. if(IS_CHARGER_ON())
  56. return 0;
  57. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_OPEN) == 0)
  58. {
  59. vol = Measure_Vol();
  60. if(vol != 0xFFFFFFFF && vol > sub_bms_info_2.packet_common.m_total_vol)
  61. return 1;
  62. }
  63. return 0;
  64. }
  65. uint8_t Check_Battery_2_On(void)
  66. {
  67. uint32_t vol = 0;
  68. if(IS_CHARGER_ON())
  69. return 0;
  70. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_OPEN) == 0)
  71. {
  72. vol = Measure_Vol();
  73. if(vol != 0xFFFFFFFF && vol > sub_bms_info_1.packet_common.m_total_vol)
  74. return 1;
  75. }
  76. return 0;
  77. }
  78. shark_bool battery_wait_voltage_down(u32 voltage)
  79. {
  80. u8 success = 0;
  81. u16 times;
  82. for (times = 500; times > 0; times--) {
  83. if (Measure_Vol() < voltage) {
  84. if (++success > 20) {
  85. return shark_true;
  86. }
  87. } else {
  88. success = 0;
  89. }
  90. delay_1ms(10);
  91. }
  92. return shark_false;
  93. }
  94. shark_bool battery_wait_voltage_up(u32 voltage)
  95. {
  96. u64 time = shark_get_time() + 500;
  97. while (Measure_Vol() < voltage) {
  98. if (time < shark_get_time_safe()) {
  99. return shark_false;
  100. }
  101. }
  102. return shark_true;
  103. }
  104. static u8 shark_battery_switch_series(void)
  105. {
  106. Power_On_Normal(0, 2);
  107. if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
  108. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, 3) != 3) {
  109. return CB_BAT_NO;
  110. }
  111. delay_1ms(100);
  112. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_SMALL, 3) != 3) {
  113. return CB_BAT_NO;
  114. }
  115. } else {
  116. if (shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL, 3) != 3) {
  117. return CB_BAT_NO;
  118. }
  119. delay_1ms(100);
  120. if (shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_FULL, 3) != 3) {
  121. return CB_BAT_NO;
  122. }
  123. }
  124. shark_bms_set_mos_series();
  125. battery_wait_voltage_up(SERIES_VOLTAGE_MIN);
  126. delay_1ms(200);
  127. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) != 3) {
  128. shark_bms_set_mos_close();
  129. return CB_BAT_NO;
  130. }
  131. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  132. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  133. return CB_BAT1_BAT2_SERIES;
  134. }
  135. static u8 shark_battery_switch_bat1(u8 mask)
  136. {
  137. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, mask) != mask) {
  138. return CB_BAT_NO;
  139. }
  140. shark_bms_set_mos_bat1();
  141. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  142. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  143. return CB_BAT1;
  144. }
  145. static u8 shark_battery_switch_bat2(u8 mask)
  146. {
  147. if (shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL, mask) != mask) {
  148. return CB_BAT_NO;
  149. }
  150. shark_bms_set_mos_bat2();
  151. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  152. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  153. return CB_BAT2;
  154. }
  155. static u8 shark_battery_switch_bat1_or_bat2(void)
  156. {
  157. u64 time = shark_get_time() + 500;
  158. u32 open1 = 0;
  159. u32 open2 = 0;
  160. while (time > shark_get_time_safe()) {
  161. if (BAT1_IS_OPEN()) {
  162. open1++;
  163. }
  164. if (BAT2_IS_OPEN()) {
  165. open2++;
  166. }
  167. }
  168. if (open1 > open2) {
  169. return shark_battery_switch_bat1(3);
  170. }
  171. if (open1 < open2) {
  172. return shark_battery_switch_bat2(3);
  173. }
  174. if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
  175. return shark_battery_switch_bat1(3);
  176. }
  177. return shark_battery_switch_bat2(3);
  178. }
  179. static u8 shark_battery_switch_auto(shark_bool series)
  180. {
  181. u8 mask;
  182. shark_bms_set_mos_close();
  183. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  184. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  185. if (!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
  186. return CB_BAT_NO;
  187. }
  188. mask = shark_battery_detect();
  189. if (mask == 0) {
  190. return CB_BAT_NO;
  191. }
  192. if (cb_operate_state == CB_BAT_NO) {
  193. mask = shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_SMALL, mask);
  194. if (mask == 0) {
  195. return CB_BAT_NO;
  196. }
  197. delay_1ms(200);
  198. }
  199. mask = shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, mask);
  200. if (mask == 0) {
  201. return CB_BAT_NO;
  202. }
  203. if (shark_battery_is_normal_power_on(&sub_bms_info_1)) {
  204. if (shark_battery_is_normal_power_on(&sub_bms_info_2)) {
  205. if (series) {
  206. return shark_battery_switch_series();
  207. } else {
  208. return shark_battery_switch_bat1_or_bat2();
  209. }
  210. } else {
  211. return shark_battery_switch_bat1(1);
  212. }
  213. } else if (shark_battery_is_normal_power_on(&sub_bms_info_2)) {
  214. return shark_battery_switch_bat2(2);
  215. } else {
  216. return CB_BAT_NO;
  217. }
  218. }
  219. int8_t Battery_CB_Switch(uint8_t cb_operate)
  220. {
  221. uint16_t i = 0;
  222. if (Is_Soak()) {
  223. cb_operate = CB_BAT_NO;
  224. }
  225. println("switch: %d -> %d", cb_operate_state, cb_operate);
  226. #define COM_TIMEOUT (15)
  227. switch(cb_operate)
  228. {
  229. case CB_BAT1_BAT2_AUTO:
  230. cb_operate = shark_battery_switch_auto(shark_false);
  231. println("switch auto: %d", cb_operate);
  232. break;
  233. case CB_BAT1:
  234. shark_bms_set_mos_close();
  235. if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
  236. goto SWITCH_ERROR;
  237. }
  238. switch(cb_operate_state)
  239. {
  240. case CB_BAT_NO:
  241. //
  242. if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
  243. {
  244. i = 0;
  245. while(i++ < COM_TIMEOUT && RS485_busy_2)
  246. delay_1ms(10);
  247. if(RS485_busy_2)
  248. goto SWITCH_ERROR;
  249. if(Operate_Sub_BMS_2_CD(0) == 0)
  250. goto SWITCH_ERROR;
  251. }
  252. else if(sub_bms_info_2.conn_state == SUB_BMS_DISC_NO485)
  253. {
  254. if(Check_Battery_2_On())
  255. goto SWITCH_ERROR;
  256. }
  257. else
  258. {
  259. goto SWITCH_ERROR;
  260. }
  261. //
  262. i = 0;
  263. while(i++ < COM_TIMEOUT && RS485_busy_1)
  264. delay_1ms(10);
  265. if(RS485_busy_1)
  266. goto SWITCH_ERROR;
  267. if(one_bat_initial == 0)
  268. {
  269. if(Operate_Sub_BMS_1_CD(2) == 0)
  270. goto SWITCH_ERROR;
  271. delay_1ms(200);
  272. }
  273. if(Operate_Sub_BMS_1_CD(1) == 0)
  274. goto SWITCH_ERROR;
  275. break;
  276. case CB_BAT1:
  277. break;
  278. case CB_BAT2:
  279. i = 0;
  280. while(i++ < COM_TIMEOUT && RS485_busy_1)
  281. delay_1ms(10);
  282. if(RS485_busy_1)
  283. goto SWITCH_ERROR;
  284. if(Operate_Sub_BMS_1_CD(1) == 0)
  285. goto SWITCH_ERROR;
  286. //
  287. i = 0;
  288. while(i++ < COM_TIMEOUT && RS485_busy_2)
  289. delay_1ms(10);
  290. if(RS485_busy_2)
  291. goto SWITCH_ERROR;
  292. if(Operate_Sub_BMS_2_CD(0) == 0)
  293. goto SWITCH_ERROR;
  294. break;
  295. case CB_BAT1_BAT2_PARRALLEL:
  296. //
  297. i = 0;
  298. while(i++ < COM_TIMEOUT && RS485_busy_2)
  299. delay_1ms(10);
  300. if(RS485_busy_2)
  301. goto SWITCH_ERROR;
  302. if(Operate_Sub_BMS_2_CD(0) == 0)
  303. goto SWITCH_ERROR;
  304. break;
  305. case CB_BAT1_BAT2_SERIES:
  306. //
  307. if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
  308. {
  309. i = 0;
  310. while(i++ < COM_TIMEOUT && RS485_busy_2)
  311. delay_1ms(10);
  312. //if(RS485_busy_2)
  313. // goto SWITCH_ERROR;
  314. if(Operate_Sub_BMS_2_CD(0) == 0)
  315. {
  316. // goto SWITCH_ERROR;
  317. }
  318. }
  319. else
  320. Operate_Sub_BMS_2_CD(0);
  321. break;
  322. default:
  323. goto SWITCH_ERROR;
  324. }
  325. shark_bms_set_mos_bat1();
  326. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  327. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  328. break;
  329. case CB_BAT2:
  330. shark_bms_set_mos_close();
  331. if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
  332. goto SWITCH_ERROR;
  333. }
  334. switch(cb_operate_state)
  335. {
  336. case CB_BAT_NO:
  337. //
  338. if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
  339. {
  340. i = 0;
  341. while(i++ < COM_TIMEOUT && RS485_busy_1)
  342. delay_1ms(10);
  343. if(RS485_busy_1)
  344. goto SWITCH_ERROR;
  345. if(Operate_Sub_BMS_1_CD(0) == 0)
  346. goto SWITCH_ERROR;
  347. }
  348. else if(sub_bms_info_1.conn_state == SUB_BMS_DISC_NO485)
  349. {
  350. if(Check_Battery_1_On())
  351. goto SWITCH_ERROR;
  352. }
  353. else
  354. {
  355. goto SWITCH_ERROR;
  356. }
  357. //
  358. i = 0;
  359. while(i++ < COM_TIMEOUT && RS485_busy_2)
  360. delay_1ms(10);
  361. if(RS485_busy_2)
  362. goto SWITCH_ERROR;
  363. if(one_bat_initial == 0)
  364. {
  365. if(Operate_Sub_BMS_2_CD(2) == 0)
  366. goto SWITCH_ERROR;
  367. delay_1ms(200);
  368. }
  369. if(Operate_Sub_BMS_2_CD(1) == 0)
  370. goto SWITCH_ERROR;
  371. break;
  372. case CB_BAT1:
  373. //
  374. i = 0;
  375. while(i++ < COM_TIMEOUT && RS485_busy_2)
  376. delay_1ms(10);
  377. if(RS485_busy_2)
  378. goto SWITCH_ERROR;
  379. if(Operate_Sub_BMS_2_CD(1) == 0)
  380. goto SWITCH_ERROR;
  381. //
  382. i = 0;
  383. while(i++ < COM_TIMEOUT && RS485_busy_1)
  384. delay_1ms(10);
  385. if(RS485_busy_1)
  386. goto SWITCH_ERROR;
  387. if(Operate_Sub_BMS_1_CD(0) == 0)
  388. goto SWITCH_ERROR;
  389. break;
  390. case CB_BAT2:
  391. break;
  392. case CB_BAT1_BAT2_PARRALLEL:
  393. //
  394. i = 0;
  395. while(i++ < COM_TIMEOUT && RS485_busy_1)
  396. delay_1ms(10);
  397. if(RS485_busy_1)
  398. goto SWITCH_ERROR;
  399. if(Operate_Sub_BMS_1_CD(0) == 0)
  400. goto SWITCH_ERROR;
  401. break;
  402. case CB_BAT1_BAT2_SERIES:
  403. //
  404. if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
  405. {
  406. i = 0;
  407. while(i++ < COM_TIMEOUT && RS485_busy_1)
  408. delay_1ms(10);
  409. //if(RS485_busy_1)
  410. // goto SWITCH_ERROR;
  411. if(Operate_Sub_BMS_1_CD(0) == 0)
  412. {
  413. //goto SWITCH_ERROR;
  414. }
  415. }
  416. else
  417. Operate_Sub_BMS_1_CD(0);
  418. break;
  419. default:
  420. goto SWITCH_ERROR;
  421. }
  422. shark_bms_set_mos_bat2();
  423. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  424. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  425. break;
  426. case CB_BAT1_BAT2_PARRALLEL:
  427. shark_bms_set_mos_close();
  428. if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
  429. goto SWITCH_ERROR;
  430. }
  431. switch(cb_operate_state)
  432. {
  433. case CB_BAT_NO:
  434. goto SWITCH_ERROR;
  435. case CB_BAT1:
  436. //
  437. i = 0;
  438. while(i++ < COM_TIMEOUT && RS485_busy_2)
  439. delay_1ms(10);
  440. if(RS485_busy_2)
  441. goto SWITCH_ERROR;
  442. if(Operate_Sub_BMS_2_CD(1) == 0)
  443. goto SWITCH_ERROR;
  444. break;
  445. case CB_BAT2:
  446. //
  447. i = 0;
  448. while(i++ < COM_TIMEOUT && RS485_busy_1)
  449. delay_1ms(10);
  450. if(RS485_busy_1)
  451. goto SWITCH_ERROR;
  452. if(Operate_Sub_BMS_1_CD(1) == 0)
  453. goto SWITCH_ERROR;
  454. break;
  455. case CB_BAT1_BAT2_PARRALLEL:
  456. break;
  457. case CB_BAT1_BAT2_SERIES:
  458. delay_1ms(10);
  459. break;
  460. default:
  461. goto SWITCH_ERROR;
  462. }
  463. shark_bms_set_mos_parrallel();
  464. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  465. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  466. break;
  467. case CB_BAT1_BAT2_SERIES:
  468. #if 1
  469. cb_operate = shark_battery_switch_auto(shark_true);
  470. println("switch auto: %d", cb_operate);
  471. #else
  472. Power_On_Normal(0,2);
  473. shark_bms_set_mos_close();
  474. //delay_1ms(2000);
  475. //serise_low_qd_status = QD_Dect();
  476. //Power_On_Normal(0,2);
  477. switch(cb_operate_state)
  478. {
  479. case CB_BAT_NO:
  480. goto SWITCH_ERROR;
  481. case CB_BAT1:
  482. delay_1ms(10);
  483. shark_bms_set_mos_series();
  484. //
  485. i = 0;
  486. while(i++ < COM_TIMEOUT && RS485_busy_2)
  487. delay_1ms(10);
  488. if(RS485_busy_2)
  489. goto SWITCH_ERROR;
  490. if(Operate_Sub_BMS_2_CD(2) == 0)
  491. goto SWITCH_ERROR;
  492. /*for(uint16_t i = 0;i < 20;i++)
  493. {
  494. if(Handle_Can_Data() == 1)
  495. {
  496. // output fail
  497. ;
  498. }
  499. delay_1ms(10);
  500. }*/
  501. delay_1ms(200);
  502. if(Operate_Sub_BMS_2_CD(1) == 0)
  503. goto SWITCH_ERROR;
  504. break;
  505. case CB_BAT2:
  506. delay_1ms(10);
  507. shark_bms_set_mos_series();
  508. //
  509. i = 0;
  510. while(i++ < COM_TIMEOUT && RS485_busy_1)
  511. delay_1ms(10);
  512. if(RS485_busy_1)
  513. goto SWITCH_ERROR;
  514. if(Operate_Sub_BMS_1_CD(2) == 0)
  515. goto SWITCH_ERROR;
  516. /*for(uint16_t i = 0;i < 20;i++)
  517. {
  518. if(Handle_Can_Data() == 1)
  519. {
  520. // output fail
  521. ;
  522. }
  523. delay_1ms(10);
  524. }*/
  525. delay_1ms(200);
  526. if(Operate_Sub_BMS_1_CD(1) == 0)
  527. goto SWITCH_ERROR;
  528. break;
  529. case CB_BAT1_BAT2_PARRALLEL:
  530. if(sub_bms_info_1.packet_common.m_total_vol < sub_bms_info_2.packet_common.m_total_vol)
  531. {
  532. //
  533. i = 0;
  534. while(i++ < COM_TIMEOUT && RS485_busy_1)
  535. delay_1ms(10);
  536. if(RS485_busy_1)
  537. goto SWITCH_ERROR;
  538. if(Operate_Sub_BMS_1_CD(0) == 0)
  539. goto SWITCH_ERROR;
  540. delay_1ms(50);
  541. delay_1ms(10);
  542. shark_bms_set_mos_series();
  543. if(Operate_Sub_BMS_1_CD(2) == 0)
  544. goto SWITCH_ERROR;
  545. /*for(uint16_t i = 0;i < 20;i++)
  546. {
  547. if(Handle_Can_Data() == 1)
  548. {
  549. // output fail
  550. ;
  551. }
  552. delay_1ms(10);
  553. }*/
  554. delay_1ms(200);
  555. if(Operate_Sub_BMS_1_CD(1) == 0)
  556. goto SWITCH_ERROR;
  557. }
  558. else
  559. {
  560. //
  561. i = 0;
  562. while(i++ < COM_TIMEOUT && RS485_busy_2)
  563. delay_1ms(10);
  564. if(RS485_busy_2)
  565. goto SWITCH_ERROR;
  566. if(Operate_Sub_BMS_2_CD(0) == 0)
  567. goto SWITCH_ERROR;
  568. delay_1ms(50);
  569. delay_1ms(10);
  570. shark_bms_set_mos_series();
  571. if(Operate_Sub_BMS_2_CD(2) == 0)
  572. goto SWITCH_ERROR;
  573. /*for(uint16_t i = 0;i < 20;i++)
  574. {
  575. if(Handle_Can_Data() == 1)
  576. {
  577. // output fail
  578. ;
  579. }
  580. delay_1ms(10);
  581. }*/
  582. delay_1ms(200);
  583. if(Operate_Sub_BMS_2_CD(1) == 0)
  584. goto SWITCH_ERROR;
  585. }
  586. break;
  587. case CB_BAT1_BAT2_SERIES:
  588. break;
  589. default:
  590. goto SWITCH_ERROR;
  591. }
  592. delay_1ms(10);
  593. shark_bms_set_mos_series();
  594. sub_bms_info_1.state = SHARK_BATT_STATE_USED;
  595. sub_bms_info_2.state = SHARK_BATT_STATE_USED;
  596. #endif
  597. break;
  598. case CB_BAT_NO:
  599. default:
  600. ACC2_Enable(0);
  601. shark_bms_set_mos_close();
  602. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  603. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  604. cb_operate = CB_BAT_NO;
  605. if(Is_Soak())
  606. {
  607. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  608. sub_bms_info_1.sub_bms_cmd.param = 0x00;
  609. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  610. sub_bms_info_2.sub_bms_cmd.param = 0x00;
  611. }
  612. break;
  613. }
  614. // cb_val_last = cb_val_temp;
  615. cb_operate_state = cb_operate;
  616. return cb_operate;
  617. SWITCH_ERROR:
  618. println("switch err");
  619. shark_bms_set_mos_close();
  620. cb_operate_state = CB_BAT_NO;
  621. return cb_operate_state;
  622. #undef COM_TIMEOUT
  623. }
  624. void test_io(void)
  625. {
  626. volatile uint8_t a,b;
  627. a = BAT1_IS_OPEN();
  628. b = BAT2_IS_OPEN();
  629. a++;
  630. b++;
  631. }
  632. uint8_t Select_One_BAT(void)
  633. {
  634. #if 0
  635. uint8_t temp_op = CB_BAT_NO;
  636. println("select one");
  637. sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
  638. sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
  639. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
  640. {
  641. if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  642. {
  643. if(sub_bms_info_1.packet_common.m_total_vol >= sub_bms_info_2.packet_common.m_total_vol)
  644. {
  645. if(IS_CHARGE_IN())
  646. {
  647. temp_op = CB_BAT2;
  648. }
  649. else
  650. {
  651. temp_op = CB_BAT1;
  652. }
  653. }
  654. else
  655. {
  656. if(IS_CHARGE_IN())
  657. {
  658. temp_op = CB_BAT1;
  659. }
  660. else
  661. {
  662. temp_op = CB_BAT2;
  663. }
  664. }
  665. }
  666. else
  667. {
  668. temp_op = CB_BAT1;
  669. }
  670. }
  671. else if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  672. {
  673. temp_op = CB_BAT2;
  674. }
  675. return temp_op;
  676. #else
  677. return CB_BAT1_BAT2_AUTO;
  678. #endif
  679. }
  680. uint8_t Check_CB_BAT_1(void)
  681. {
  682. uint8_t temp_op = CB_MAX;
  683. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
  684. {
  685. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  686. {
  687. //sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  688. //sub_bms_info_1.sub_bms_cmd.param = 0x03;
  689. if((sub_bms_info_1.packet_common.work_status &(ST_OVRDISCHRG_VOL|ST_PDOWN)) != 0)
  690. ;
  691. else
  692. temp_op = CB_BAT_NO;
  693. }
  694. //
  695. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_S_OPEN)) != 0)
  696. {
  697. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  698. sub_bms_info_2.sub_bms_cmd.param = 0x00;
  699. }
  700. }
  701. else
  702. {
  703. /*if(Is_Sub_BMS_2_Normal())
  704. temp_op = CB_BAT2;
  705. else*/
  706. temp_op = CB_BAT_NO;
  707. }
  708. return temp_op;
  709. }
  710. uint8_t Check_CB_BAT_2(void)
  711. {
  712. uint8_t temp_op = CB_MAX;
  713. if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  714. {
  715. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  716. {
  717. //sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  718. //sub_bms_info_2.sub_bms_cmd.param = 0x03;
  719. if((sub_bms_info_2.packet_common.work_status &(ST_OVRDISCHRG_VOL|ST_PDOWN)) != 0)
  720. ;
  721. else
  722. temp_op = CB_BAT_NO;
  723. }
  724. //
  725. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_S_OPEN)) != 0)
  726. {
  727. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  728. sub_bms_info_1.sub_bms_cmd.param = 0x00;
  729. }
  730. }
  731. else
  732. {
  733. /*if(Is_Sub_BMS_1_Normal())
  734. temp_op = CB_BAT1;
  735. else*/
  736. temp_op = CB_BAT_NO;
  737. }
  738. return temp_op;
  739. }
  740. int32_t Battery_1_Bu_Chang_Vol(void)
  741. {
  742. return ((int32_t)sub_bms_info_1.packet_common.m_total_vol - (int32_t)(BATTERY_RESISTANCE_OHM * sub_bms_info_1.packet_common.m_current));
  743. }
  744. int32_t Battery_2_Bu_Chang_Vol(void)
  745. {
  746. return ((int32_t)sub_bms_info_2.packet_common.m_total_vol - (int32_t)(BATTERY_RESISTANCE_OHM * sub_bms_info_2.packet_common.m_current));
  747. }
  748. uint8_t Check_CB_BAT1_BAT2_PARRALLEL(void)
  749. {
  750. int32_t delta_vol;
  751. int32_t m_1_total_vol,m_2_total_vol;
  752. uint8_t temp_op = CB_MAX;
  753. if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_PARRALLEL)
  754. {
  755. temp_op = Select_One_BAT();
  756. return temp_op;
  757. }
  758. //
  759. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  760. {
  761. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  762. {
  763. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  764. sub_bms_info_1.sub_bms_cmd.param = 0x03;
  765. }
  766. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  767. {
  768. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  769. sub_bms_info_2.sub_bms_cmd.param = 0x03;
  770. }
  771. }
  772. else
  773. {
  774. temp_op = Select_One_BAT();
  775. return temp_op;
  776. }
  777. //
  778. if(sub_bms_info_1.packet_common.m_current > 20000 || sub_bms_info_2.packet_common.m_current > 20000)
  779. {
  780. temp_op = Select_One_BAT();
  781. return temp_op;
  782. }
  783. //
  784. m_1_total_vol = Battery_1_Bu_Chang_Vol();
  785. m_2_total_vol = Battery_2_Bu_Chang_Vol();
  786. if(m_1_total_vol >= m_2_total_vol)
  787. {
  788. delta_vol = m_1_total_vol - m_2_total_vol;
  789. }
  790. else
  791. {
  792. delta_vol = m_2_total_vol - m_1_total_vol;
  793. }
  794. if(delta_vol > PARRALLEL_DELTA_VOL)
  795. {
  796. temp_op = Select_One_BAT();
  797. return temp_op;
  798. }
  799. return temp_op;
  800. }
  801. void Series_Delay_Timeout(void)
  802. {
  803. if(Series_delay.set)
  804. {
  805. Series_delay.count++;
  806. }
  807. if(Next_Series_delay.set)
  808. {
  809. Next_Series_delay.count++;
  810. if(Next_Series_delay.count <= NEXT_SERIES_TIME_OUT)
  811. Next_Series_Not_Enable = 1;
  812. else
  813. {
  814. memset(&Next_Series_delay,0x00,sizeof(Next_Series_delay));
  815. Next_Series_Not_Enable = 0;
  816. }
  817. }
  818. }
  819. #ifdef HAN_GUO_VERSION
  820. uint8_t Select_One_BAT_Han_Guo(void)
  821. {
  822. uint8_t temp_op = CB_BAT_NO;
  823. if(Is_Sub_BMS_1_Normal())
  824. {
  825. if(Is_Sub_BMS_2_Normal())
  826. {
  827. if(sub_bms_info_1.packet_common.m_total_vol >= sub_bms_info_2.packet_common.m_total_vol)
  828. {
  829. if(IS_CHARGE_IN())
  830. {
  831. temp_op = CB_BAT2;
  832. }
  833. else
  834. {
  835. temp_op = CB_BAT1;
  836. }
  837. }
  838. else
  839. {
  840. if(IS_CHARGE_IN())
  841. {
  842. temp_op = CB_BAT1;
  843. }
  844. else
  845. {
  846. temp_op = CB_BAT2;
  847. }
  848. }
  849. }
  850. else
  851. {
  852. temp_op = CB_BAT1;
  853. }
  854. }
  855. else if(Is_Sub_BMS_2_Normal())
  856. {
  857. temp_op = CB_BAT2;
  858. }
  859. else
  860. {
  861. if(sub_bms_info_1.packet_common.m_total_vol < sub_bms_info_2.packet_common.m_total_vol)
  862. temp_op = CB_BAT2;
  863. else
  864. temp_op = CB_BAT1;
  865. }
  866. return temp_op;
  867. }
  868. #endif
  869. uint8_t Check_CB_BAT1_BAT2_SERIES(void)
  870. {
  871. uint8_t temp_op = CB_MAX;
  872. int32_t m_1_total_vol,m_2_total_vol;
  873. if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_SERIES)
  874. {
  875. temp_op = Select_One_BAT();
  876. return temp_op;
  877. }
  878. if(serise_low_enable)
  879. {
  880. temp_op = Select_One_BAT();
  881. return temp_op;
  882. }
  883. if(IS_CHARGE_IN())
  884. {
  885. temp_op = Select_One_BAT();
  886. return temp_op;
  887. }
  888. if (Measure_Vol() < SELECT_ONE_BATTERY_VOL) {
  889. return Select_One_BAT();
  890. }
  891. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  892. {
  893. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  894. {
  895. //sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  896. //sub_bms_info_1.sub_bms_cmd.param = 0x03;
  897. sub_bms_info_1.define_error= D_BMS_ERROR_SERISE_CD_OFF;
  898. temp_op = Select_One_BAT();
  899. sub_bms_info_1.define_error = D_BMS_ERROR_NO;
  900. return temp_op;
  901. }
  902. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
  903. {
  904. //sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  905. //sub_bms_info_2.sub_bms_cmd.param = 0x03;
  906. sub_bms_info_2.define_error = D_BMS_ERROR_SERISE_CD_OFF;
  907. temp_op = Select_One_BAT();
  908. sub_bms_info_2.define_error = D_BMS_ERROR_NO;
  909. return temp_op;
  910. }
  911. }
  912. else
  913. {
  914. #ifdef HAN_GUO_VERSION
  915. temp_op = Select_One_BAT_Han_Guo();
  916. #else
  917. temp_op = Select_One_BAT();
  918. #endif
  919. return temp_op;
  920. }
  921. /*if(Measure_Vol() <= CHECK_SERIES_VOL)
  922. {
  923. temp_op = Select_One_BAT();
  924. return temp_op;
  925. }*/
  926. m_1_total_vol = Battery_1_Bu_Chang_Vol();
  927. m_2_total_vol = Battery_2_Bu_Chang_Vol();
  928. if(m_1_total_vol <= CHECK_SERIES_PROTECT_VOL\
  929. ||m_2_total_vol <= CHECK_SERIES_PROTECT_VOL )
  930. {
  931. if(Series_delay.set == 0)
  932. {
  933. Series_delay.set = 1;
  934. Series_delay.count = 0;
  935. }
  936. }
  937. else
  938. {
  939. memset(&Series_delay,0x00,sizeof(Series_delay));
  940. }
  941. if(Series_delay.set&&Series_delay.count >= SERIES_UNDER_VOL_TIME_OUT)
  942. {
  943. memset(&Series_delay,0x00,sizeof(Series_delay));
  944. temp_op = Select_One_BAT();
  945. serise_low_enable = 1;
  946. return temp_op;
  947. }
  948. /* if(sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT\
  949. || sub_bms_info_2.packet_common.m_percent < SERIES_UNDER_XX_PERCENT)
  950. {
  951. temp_op = Select_One_BAT();
  952. return temp_op;
  953. }
  954. */
  955. return temp_op;
  956. }
  957. uint8_t power_switch_from = 0;
  958. void Power_On_Normal(uint8_t enable,uint8_t from)
  959. {
  960. if(enable)
  961. {
  962. //FL_Enable(1);
  963. //ACC2_Enable(1);
  964. Can_Power_Enable(1);
  965. Enable_12V(1);
  966. one_bat_initial = 0;
  967. Reset_Enter_Sleep_Delay();
  968. /*if(serise_low_qd_status == 1)
  969. {
  970. QD_Enable(1);
  971. serise_low_qd_status = 0;
  972. }*/
  973. }
  974. else
  975. {
  976. #if 0
  977. NVIC_SystemReset();
  978. #else
  979. // FL_Enable(0);
  980. ACC2_Enable(0);
  981. Can_Power_Enable(0);
  982. Can_Stop_Send();
  983. //QD_Enable(0);
  984. QD_Enable_From(0,1);
  985. ADAS_Enable(0);
  986. Enable_12V(0);
  987. Set_Enter_Sleep_Delay();
  988. #endif
  989. }
  990. work_normal = enable;
  991. power_switch_from = from;
  992. }
  993. void Check_CB_Operate_State(void)
  994. {
  995. uint8_t temp_op = CB_MAX;
  996. //if(Check_CB_oper_sta_start == 0)
  997. // return;
  998. if(!Sub_BMS_1_COM_Finish() || !Sub_BMS_2_COM_Finish())
  999. return;
  1000. switch(cb_operate_state)
  1001. {
  1002. case CB_BAT_NO:
  1003. temp_op = Select_One_BAT();
  1004. break;
  1005. case CB_BAT1:
  1006. temp_op = Check_CB_BAT_1();
  1007. break;
  1008. case CB_BAT2:
  1009. temp_op = Check_CB_BAT_2();
  1010. break;
  1011. case CB_BAT1_BAT2_PARRALLEL:
  1012. temp_op = Check_CB_BAT1_BAT2_PARRALLEL();
  1013. break;
  1014. case CB_BAT1_BAT2_SERIES:
  1015. temp_op = Check_CB_BAT1_BAT2_SERIES();
  1016. /*if(temp_op != CB_MAX)
  1017. {
  1018. Next_Series_delay.set = 1;
  1019. Next_Series_delay.count = 0;
  1020. Next_Series_Not_Enable = 1;
  1021. }*/
  1022. break;
  1023. default:
  1024. return;
  1025. }
  1026. if (Is_Soak()) {
  1027. temp_op = CB_BAT_NO;
  1028. }
  1029. if(temp_op >= CB_MAX)
  1030. {
  1031. //test-start
  1032. if(work_normal == 0)
  1033. {
  1034. Power_On_Normal(1,3);
  1035. }
  1036. //test-end
  1037. return;
  1038. }
  1039. else if(temp_op == CB_BAT_NO)
  1040. {
  1041. if(work_normal == 1)
  1042. {
  1043. Power_On_Normal(0,1);
  1044. }
  1045. }
  1046. else
  1047. {
  1048. /*if(work_normal == 1)
  1049. {
  1050. Power_On_Normal(0);
  1051. }*/
  1052. }
  1053. Battery_CB_Switch(temp_op);
  1054. }
  1055. uint8_t Is_BAT1_Lock(void)
  1056. {
  1057. return 0;
  1058. }
  1059. uint8_t Is_BAT2_Lock(void)
  1060. {
  1061. return 0;
  1062. }
  1063. void Charger_Out(void)
  1064. {
  1065. Set_Charger_In(0);
  1066. one_bat_charge_status = OBCS_CHARGER_OUT;
  1067. if(sub_bms_info_1.packet_common.m_percent >= 100 && sub_bms_info_2.packet_common.m_percent >= 100)
  1068. battery_charged_full = 1;
  1069. }
  1070. void Check_Charge_In(void)
  1071. {
  1072. if(sub_bms_info_1.packet_common.m_percent < 97 || sub_bms_info_2.packet_common.m_percent < 97)
  1073. battery_charged_full = 0;
  1074. //if(gpio_input_bit_get(GPIOC,GPIO_PIN_4) == 0)
  1075. {
  1076. // Set_Charger_In(1);
  1077. }
  1078. if(IS_CHARGE_IN())
  1079. {
  1080. if(is_intelligent)
  1081. {
  1082. CB_OPERATE_PRECEDENCE_PARRALLEL = PRE_PARRALLEL;
  1083. if(cb_operate_state == CB_BAT1_BAT2_SERIES)
  1084. {
  1085. if(Battery_Change_Mode(CFG_BAT1_BAT2_PARRALLEL) == CB_BAT1_BAT2_PARRALLEL)
  1086. CHARG_PROTECT_OPEN(1);
  1087. }
  1088. else
  1089. {
  1090. CHARG_PROTECT_OPEN(1);
  1091. if(cb_operate_state == CB_BAT1 || cb_operate_state == CB_BAT2)
  1092. {
  1093. if(one_bat_charge_status == OBCS_CHARGER_OUT)
  1094. one_bat_charge_status = OBCS_CHARGER_IN;
  1095. }
  1096. }
  1097. }
  1098. else
  1099. {
  1100. if(cb_operate_state == CB_BAT1_BAT2_SERIES)
  1101. {
  1102. ;
  1103. }
  1104. else
  1105. CHARG_PROTECT_OPEN(1);
  1106. }
  1107. if(IS_CHARGER_ON())
  1108. {
  1109. if(sub_bms_info_1.packet_common.charge_flag == 0 && sub_bms_info_2.packet_common.charge_flag == 0)
  1110. {
  1111. if(charge_delay.set == 0)
  1112. {
  1113. charge_delay.set = 1;
  1114. charge_delay.count = 0;
  1115. }
  1116. else
  1117. {
  1118. if(charge_delay.count >= CHARGE_DELAY_TIME_OUT_COUNT)
  1119. {
  1120. memset(&charge_delay,0x00,sizeof(charge_delay));
  1121. Charger_Out();
  1122. }
  1123. }
  1124. }
  1125. else
  1126. {
  1127. memset(&charge_delay,0x00,sizeof(charge_delay));
  1128. }
  1129. if(cb_operate_state == CB_BAT1_BAT2_PARRALLEL)
  1130. {
  1131. if(sub_bms_info_1.packet_common.charge_flag)
  1132. {
  1133. if((sub_bms_info_2.packet_common.work_status&ST_DISCHRG_CUR)!= 0)
  1134. {
  1135. if(sub_bms_info_1.packet_common.m_current + sub_bms_info_2.packet_common.m_current\
  1136. < 5000)
  1137. Charger_Out();
  1138. }
  1139. }
  1140. else if(sub_bms_info_2.packet_common.charge_flag)
  1141. {
  1142. if((sub_bms_info_1.packet_common.work_status&ST_DISCHRG_CUR)!= 0)
  1143. {
  1144. if(sub_bms_info_1.packet_common.m_current + sub_bms_info_2.packet_common.m_current\
  1145. < 5000)
  1146. Charger_Out();
  1147. }
  1148. }
  1149. }
  1150. }
  1151. }
  1152. else
  1153. {
  1154. CHARG_PROTECT_OPEN(0);
  1155. if(is_intelligent)
  1156. {
  1157. CB_OPERATE_PRECEDENCE_PARRALLEL = CB_OPERATE_PRECEDENCE_Config;
  1158. }
  1159. }
  1160. }
  1161. uint8_t Change_Mode_Sub_BMS_1_Normal(void)
  1162. {
  1163. return Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS;
  1164. }
  1165. uint8_t Change_Mode_Sub_BMS_2_Normal(void)
  1166. {
  1167. return Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS;
  1168. }
  1169. uint8_t Change_Mode_Sub_BMS_PARRALLEL(void)
  1170. {
  1171. int32_t delta_vol;
  1172. int32_t m_1_total_vol,m_2_total_vol;
  1173. //
  1174. if(cb_operate_state == CB_BAT_NO)
  1175. return 0;
  1176. if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_PARRALLEL)
  1177. return 0;
  1178. //
  1179. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  1180. ;
  1181. else
  1182. return 0;
  1183. m_1_total_vol = Battery_1_Bu_Chang_Vol();
  1184. m_2_total_vol = Battery_2_Bu_Chang_Vol();
  1185. if(m_1_total_vol >= m_2_total_vol)
  1186. {
  1187. delta_vol = m_1_total_vol - m_2_total_vol;
  1188. }
  1189. else
  1190. {
  1191. delta_vol = m_2_total_vol - m_1_total_vol;
  1192. }
  1193. if(delta_vol <= PARRALLEL_BL_DELTA_VOL)
  1194. return 1;
  1195. return 0;
  1196. }
  1197. uint8_t Change_Mode_Sub_BMS_SERIES(void)
  1198. {
  1199. int32_t m_1_total_vol,m_2_total_vol;
  1200. //
  1201. if(!(cb_operate_state == CB_BAT1 || cb_operate_state == CB_BAT2))
  1202. return 0;
  1203. if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_SERIES)
  1204. return 0;
  1205. #ifdef HAN_GUO_VERSION
  1206. #else
  1207. if(serise_low_enable)
  1208. return 0;
  1209. #endif
  1210. if(IS_CHARGE_IN())
  1211. return 0;
  1212. if(!(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS))
  1213. return 0;
  1214. /*if(cb_operate_state == CB_BAT1)
  1215. {
  1216. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_BAHU) != 0)
  1217. {
  1218. return 0;
  1219. }
  1220. }
  1221. else if(cb_operate_state == CB_BAT2)
  1222. {
  1223. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_BAHU) != 0)
  1224. {
  1225. return 0;
  1226. }
  1227. }*/
  1228. #ifdef HAN_GUO_VERSION
  1229. if(sub_bms_info_1.packet_common.m_percent < 2\
  1230. || sub_bms_info_2.packet_common.m_percent < 2)
  1231. return 0;
  1232. #else
  1233. if(Next_Series_Not_Enable)
  1234. return 0;
  1235. m_1_total_vol = Battery_1_Bu_Chang_Vol();
  1236. m_2_total_vol = Battery_2_Bu_Chang_Vol();
  1237. if(m_1_total_vol <= SERIES_PROTECT_VOL\
  1238. ||m_2_total_vol <= SERIES_PROTECT_VOL )
  1239. return 0;
  1240. #if 0
  1241. if(sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT\
  1242. || sub_bms_info_2.packet_common.m_percent < SERIES_UNDER_XX_PERCENT)
  1243. return 0;
  1244. #endif
  1245. #endif
  1246. return 1;
  1247. }
  1248. uint8_t Battery_Change_Mode(uint8_t cfg_mode)
  1249. {
  1250. uint8_t cb_operate = CB_MAX;
  1251. if(!work_normal)
  1252. return 0;
  1253. switch(cfg_mode)
  1254. {
  1255. case CFG_BAT_NO:
  1256. return 0;
  1257. case CFG_BAT1:
  1258. if(Change_Mode_Sub_BMS_1_Normal())
  1259. {
  1260. cb_operate = CB_BAT1;
  1261. }
  1262. break;
  1263. case CFG_BAT2:
  1264. if(Change_Mode_Sub_BMS_2_Normal())
  1265. {
  1266. cb_operate = CB_BAT2;
  1267. }
  1268. break;
  1269. case CFG_BAT1_BAT2_PARRALLEL:
  1270. if(Change_Mode_Sub_BMS_PARRALLEL())
  1271. {
  1272. cb_operate = CB_BAT1_BAT2_PARRALLEL;
  1273. }
  1274. break;
  1275. case CFG_BAT1_BAT2_SERIES:
  1276. if(Change_Mode_Sub_BMS_SERIES())
  1277. {
  1278. cb_operate = CB_BAT1_BAT2_SERIES;
  1279. }
  1280. break;
  1281. case CFG_MAX:
  1282. default:
  1283. return 0;
  1284. }
  1285. if(cb_operate >= CB_MAX)
  1286. return 0;
  1287. return Battery_CB_Switch(cb_operate);
  1288. }
  1289. void Intelligent_Management_Battery(void)
  1290. {
  1291. if(is_intelligent)
  1292. {
  1293. if(CB_OPERATE_PRECEDENCE_PARRALLEL == PRE_PARRALLEL)
  1294. {
  1295. if(cb_operate_state == CB_BAT1_BAT2_PARRALLEL)
  1296. return;
  1297. else if(Battery_Change_Mode(CFG_BAT1_BAT2_PARRALLEL) == CB_BAT1_BAT2_PARRALLEL)
  1298. return;
  1299. }
  1300. else
  1301. {
  1302. if(cb_operate_state == CB_BAT1_BAT2_SERIES || end_ctr_self_ss_new.qd_sta)
  1303. return;
  1304. else if(Battery_Change_Mode(CB_BAT1_BAT2_SERIES) == CB_BAT1_BAT2_SERIES)
  1305. return;
  1306. }
  1307. switch(cb_operate_state)
  1308. {
  1309. case CB_BAT1:
  1310. if(IS_CHARGER_ON())
  1311. {
  1312. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_C_FULL) == BMS_STA_C_FULL)
  1313. {
  1314. Battery_Change_Mode(CFG_BAT2);
  1315. }
  1316. else
  1317. {
  1318. if(one_bat_charge_status == OBCS_CHARGER_IN)
  1319. {
  1320. if(Battery_2_Bu_Chang_Vol() < Battery_1_Bu_Chang_Vol())
  1321. {
  1322. Battery_Change_Mode(CFG_BAT2);
  1323. }
  1324. one_bat_charge_status = OBCS_CHARGER_CHECK_FINISH;
  1325. }
  1326. }
  1327. }
  1328. else
  1329. {
  1330. if((abs(sub_bms_info_1.packet_common.m_current) <= 1000)\
  1331. &&(Battery_2_Bu_Chang_Vol() > Battery_1_Bu_Chang_Vol()+ONE_BATTERY_DELTA_VOL))
  1332. {
  1333. Battery_Change_Mode(CFG_BAT2);
  1334. }
  1335. }
  1336. break;
  1337. case CB_BAT2:
  1338. if(IS_CHARGER_ON())
  1339. {
  1340. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_C_FULL) == BMS_STA_C_FULL)
  1341. {
  1342. Battery_Change_Mode(CFG_BAT1);
  1343. }
  1344. else
  1345. {
  1346. if(one_bat_charge_status == OBCS_CHARGER_IN)
  1347. {
  1348. if(Battery_1_Bu_Chang_Vol() < Battery_2_Bu_Chang_Vol())
  1349. {
  1350. Battery_Change_Mode(CFG_BAT1);
  1351. }
  1352. one_bat_charge_status = OBCS_CHARGER_CHECK_FINISH;
  1353. }
  1354. }
  1355. }
  1356. else
  1357. {
  1358. if((abs(sub_bms_info_2.packet_common.m_current) <= 1000)\
  1359. &&(Battery_1_Bu_Chang_Vol() > Battery_2_Bu_Chang_Vol()+ONE_BATTERY_DELTA_VOL))
  1360. {
  1361. Battery_Change_Mode(CFG_BAT1);
  1362. }
  1363. }
  1364. break;
  1365. case CB_BAT_NO:
  1366. case CB_BAT1_BAT2_SERIES:
  1367. default:
  1368. break;
  1369. }
  1370. }
  1371. }
  1372. void Check_Battery_Small_Current(void)
  1373. {
  1374. switch(cb_operate_state)
  1375. {
  1376. case CB_BAT1:
  1377. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_OPEN) == BMS_STA_S_OPEN)
  1378. {
  1379. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  1380. sub_bms_info_2.sub_bms_cmd.param = 0x00;
  1381. }
  1382. break;
  1383. case CB_BAT2:
  1384. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_OPEN) == BMS_STA_S_OPEN)
  1385. {
  1386. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  1387. sub_bms_info_1.sub_bms_cmd.param = 0x00;
  1388. }
  1389. break;
  1390. case CB_BAT_NO:
  1391. case CB_BAT1_BAT2_PARRALLEL:
  1392. case CB_BAT1_BAT2_SERIES:
  1393. default:
  1394. break;
  1395. }
  1396. }
  1397. void Save_Neng_Hao_Bi(uint8_t *data,uint16_t len)
  1398. {
  1399. uint32_t capacity = (REG32(0x1FFFF7E0) & 0xFFFF) << 10;
  1400. uint32_t address = 0x08000000 + (capacity - SYLC_FLASH_ADDRESS);
  1401. uint8_t i = 0;
  1402. uint32_t df_value = 0x0325;
  1403. fmc_unlock();
  1404. Flash_flag_clear();
  1405. fmc_page_erase(address);
  1406. Flash_flag_clear();
  1407. fmc_lock();
  1408. fmc_unlock();
  1409. i = 0;
  1410. while(i<len)
  1411. {
  1412. memcpy(&df_value,&data[i],4);
  1413. fmc_word_program(address + i,df_value);
  1414. Flash_flag_clear();
  1415. i+= 4;
  1416. }
  1417. fmc_lock();
  1418. }
  1419. void Save_Param_Time_Out(void)
  1420. {
  1421. if(save_param_delay.set)
  1422. {
  1423. save_param_delay.count++;
  1424. if(save_param_delay.count > 600)
  1425. {
  1426. save_param_delay.count = 0;
  1427. g_event |= SAVE_PARAM_EVENT;
  1428. }
  1429. }
  1430. }
  1431. void Initial_Neng_Hao_Bi(void)
  1432. {
  1433. uint32_t capacity = (REG32(0x1FFFF7E0) & 0xFFFF) << 10;
  1434. uint32_t address = 0x08000000 + (capacity - SYLC_FLASH_ADDRESS);
  1435. SYLC_SAVE_PARM *sylc_temp = (SYLC_SAVE_PARM *)address;
  1436. memset(&sheng_yu_li_cheng,0x00,sizeof(sheng_yu_li_cheng));
  1437. if(sylc_temp->sy_valid_flag != SY_VALID_FLAG_KEY)
  1438. {
  1439. sheng_yu_li_cheng.sy_ss_parm.sy_valid_flag = SY_VALID_FLAG_KEY;
  1440. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = nhb_default;
  1441. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1442. }
  1443. else
  1444. {
  1445. sheng_yu_li_cheng.sy_ss_parm = *sylc_temp;
  1446. if(sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi < NENG_HAO_BI_MIN)
  1447. {
  1448. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = NENG_HAO_BI_MIN;
  1449. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1450. }
  1451. if(sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi > NENG_HAO_BI_MAX)
  1452. {
  1453. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = NENG_HAO_BI_MAX;
  1454. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1455. }
  1456. }
  1457. save_param_delay.set = 1;
  1458. save_param_delay.count = 0;
  1459. }
  1460. extern uint8_t Get_QD_State(void);
  1461. uint8_t Reset_Cal(void)
  1462. {
  1463. if(Get_QD_State() == 0)
  1464. return 1;
  1465. if(sheng_yu_li_cheng.sy_dan_ci_li_cheng_temp < sheng_yu_li_cheng.sy_dan_ci_li_cheng)
  1466. return 1;
  1467. if(sheng_yu_li_cheng.sy_percent_dlta && sheng_yu_li_cheng.sy_dan_ci_li_cheng <= 50)
  1468. return 1;
  1469. return 0;
  1470. }
  1471. void Cal_Sheng_Yu_Li_Cheng(void)
  1472. {
  1473. uint8_t dlta = 0;
  1474. uint32_t lc_temp;
  1475. if(Reset_Cal())
  1476. {
  1477. sheng_yu_li_cheng.sy_percent_1 = sub_bms_info_1.packet_common.m_percent;
  1478. sheng_yu_li_cheng.sy_percent_2 = sub_bms_info_2.packet_common.m_percent;
  1479. sheng_yu_li_cheng.sy_percent_dlta = 0;
  1480. //Left_Light_Enable(1);
  1481. }
  1482. sheng_yu_li_cheng.sy_dan_ci_li_cheng = sheng_yu_li_cheng.sy_dan_ci_li_cheng_temp;
  1483. if(sub_bms_info_1.rs485_connect && sub_bms_info_1.packet_common.m_percent != 0)
  1484. {
  1485. if(sheng_yu_li_cheng.sy_percent_1 > sub_bms_info_1.packet_common.m_percent)
  1486. {
  1487. dlta = sheng_yu_li_cheng.sy_percent_1 - sub_bms_info_1.packet_common.m_percent;
  1488. sheng_yu_li_cheng.sy_percent_dlta += dlta;
  1489. }
  1490. }
  1491. sheng_yu_li_cheng.sy_percent_1 = sub_bms_info_1.packet_common.m_percent;
  1492. if(sub_bms_info_2.rs485_connect && sub_bms_info_2.packet_common.m_percent != 0)
  1493. {
  1494. if(sheng_yu_li_cheng.sy_percent_2 > sub_bms_info_2.packet_common.m_percent)
  1495. {
  1496. dlta = sheng_yu_li_cheng.sy_percent_2 - sub_bms_info_2.packet_common.m_percent;
  1497. sheng_yu_li_cheng.sy_percent_dlta += dlta;
  1498. }
  1499. }
  1500. sheng_yu_li_cheng.sy_percent_2 = sub_bms_info_2.packet_common.m_percent;
  1501. sheng_yu_li_cheng.sy_percent_total = sub_bms_info_1.packet_common.m_percent + sub_bms_info_2.packet_common.m_percent;
  1502. if(dlta && sheng_yu_li_cheng.sy_percent_dlta >= 7 && sheng_yu_li_cheng.sy_dan_ci_li_cheng > 700 )
  1503. {
  1504. double nhb_temp = (double)(sheng_yu_li_cheng.sy_dan_ci_li_cheng)/sheng_yu_li_cheng.sy_percent_dlta;
  1505. if(nhb_temp < NENG_HAO_BI_MIN)
  1506. nhb_temp = NENG_HAO_BI_MIN;
  1507. if(nhb_temp > NENG_HAO_BI_MAX)
  1508. nhb_temp = NENG_HAO_BI_MAX;
  1509. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi*0.8 + nhb_temp*0.2;
  1510. }
  1511. else
  1512. {
  1513. }
  1514. lc_temp = (uint32_t)(sheng_yu_li_cheng.sy_percent_total*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi/1000);
  1515. if(lc_temp > 200)
  1516. lc_temp = 200;
  1517. #if 0
  1518. //bang zi ce shi start
  1519. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = (uint8_t)(lc_temp*2);
  1520. //bang zi ce shi end
  1521. #else
  1522. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = (uint8_t)lc_temp;
  1523. #endif
  1524. if(sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng == 0\
  1525. || (sub_bms_info_1.packet_common.bms_status & BMS_STA_JIAO_YAN)\
  1526. || (sub_bms_info_2.packet_common.bms_status & BMS_STA_JIAO_YAN))
  1527. {
  1528. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = sub_bms_info_1.packet_common.yjkxslc\
  1529. + sub_bms_info_2.packet_common.yjkxslc;
  1530. }
  1531. }
  1532. void Save_Param(void)
  1533. {
  1534. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1535. }