app.c 41 KB

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