app.c 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265
  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. #include "shark_charge.h"
  15. // CB_VAL cb_val_last;
  16. uint8_t cb_operate_state = CB_BAT_NO;
  17. uint8_t Check_CB_oper_sta_start = 0;
  18. DELAY_COMMON Check_CB_oper_sta_delay;
  19. uint8_t cfg_operate = CFG_BAT_NO;
  20. uint8_t work_normal = 0;
  21. uint8_t is_intelligent = 1;
  22. DELAY_COMMON Series_delay;
  23. uint8_t one_bat_initial = 1;
  24. uint8_t serise_low_qd_status = 0;
  25. const double nhb_default = 600;
  26. SHENG_YU_LI_CHENG sheng_yu_li_cheng;
  27. DELAY_COMMON save_param_delay;
  28. shark_bool shark_battery_series_locked;
  29. u8 shark_battery_series_times;
  30. shark_bool shark_battery_switch_busy;
  31. shark_bool shark_printf_enabled;
  32. void Misc_Initial(void)
  33. {
  34. GPIO_Initial();
  35. }
  36. void CB_Operate_Initial(void)
  37. {
  38. _CB_Operate_Initial();
  39. // memset(&cb_val_last,0x00,sizeof(cb_val_last));
  40. //Check_CB_oper_sta_delay.set = 1;
  41. //Check_CB_oper_sta_delay.count = 0;
  42. Battery_CB_Switch(CB_BAT_NO);
  43. }
  44. void App_Initial(void)
  45. {
  46. memset(&Series_delay,0x00,sizeof(Series_delay));
  47. Initial_Neng_Hao_Bi();
  48. }
  49. uint8_t Check_Battery_1_On(void)
  50. {
  51. uint32_t vol = 0;
  52. if(shark_charger_enabled)
  53. return 0;
  54. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_OPEN) == 0)
  55. {
  56. vol = Measure_Vol();
  57. if(vol != 0xFFFFFFFF && vol > sub_bms_info_2.packet_common.m_total_vol)
  58. return 1;
  59. }
  60. return 0;
  61. }
  62. uint8_t Check_Battery_2_On(void)
  63. {
  64. uint32_t vol = 0;
  65. if(shark_charger_enabled)
  66. return 0;
  67. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_OPEN) == 0)
  68. {
  69. vol = Measure_Vol();
  70. if(vol != 0xFFFFFFFF && vol > sub_bms_info_1.packet_common.m_total_vol)
  71. return 1;
  72. }
  73. return 0;
  74. }
  75. shark_bool battery_wait_voltage_parallel(void)
  76. {
  77. u64 time1 = shark_get_mseconds() + 1000;
  78. u64 time2 = shark_get_mseconds() + 5000;
  79. u32 voltage_min, voltage_max;
  80. if (sub_bms_info_1.connected == CONFIG_UART_GOOD) {
  81. if (sub_bms_info_2.connected == CONFIG_UART_GOOD) {
  82. voltage_max = shark_battery_get_voltage_max();
  83. } else {
  84. voltage_max = shark_battery_get_voltage1();
  85. }
  86. } else if (sub_bms_info_2.connected == CONFIG_UART_GOOD) {
  87. voltage_max = shark_battery_get_voltage2();
  88. } else {
  89. return shark_false;
  90. }
  91. if (shark_charger_state != SHARK_CHG_REMOVE && QD_Dect() == 0) {
  92. return shark_true;
  93. }
  94. voltage_min = voltage_max - SHARK_BATT_VOLTAGE_FUZZ;
  95. if (shark_charger_enabled) {
  96. voltage_max = SHARK_CHARGER_VOLTAGE_MAX;
  97. } else {
  98. voltage_max += SHARK_BATT_VOLTAGE_FUZZ;
  99. }
  100. while (shark_true) {
  101. u32 time = shark_get_time_safe();
  102. u32 voltage = Measure_Vol();
  103. if (voltage < voltage_min) {
  104. if (time > time1) {
  105. println("parallel: %d < %d", voltage, voltage_min);
  106. return shark_false;
  107. }
  108. } else if (voltage > voltage_max) {
  109. if (time > time2) {
  110. println("parallel: %d > %d", voltage, voltage_max);
  111. return shark_false;
  112. }
  113. } else {
  114. break;
  115. }
  116. }
  117. return shark_true;
  118. }
  119. shark_bool battery_wait_voltage_series(u32 voltage_min)
  120. {
  121. u64 time = shark_get_mseconds() + 1000;
  122. if (sub_bms_info_1.connected != CONFIG_UART_GOOD) {
  123. return shark_false;
  124. }
  125. if (sub_bms_info_1.connected != CONFIG_UART_GOOD) {
  126. return shark_false;
  127. }
  128. while (shark_true) {
  129. u32 voltage = Measure_Vol();
  130. if (voltage > voltage_min) {
  131. println("series: %d > %d", voltage, voltage_min);
  132. break;
  133. }
  134. if (time < shark_get_time_safe()) {
  135. println("series: %d < %d", voltage, voltage_min);
  136. return shark_false;
  137. }
  138. }
  139. return shark_true;
  140. }
  141. static u8 shark_battery_switch_series(void)
  142. {
  143. u32 voltage1 = shark_battery_get_voltage1();
  144. u32 voltage2 = shark_battery_get_voltage2();
  145. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, SHARK_BATT_MASK_BOTH) != SHARK_BATT_MASK_BOTH) {
  146. return CB_BAT_NO;
  147. }
  148. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_SMALL, SHARK_BATT_MASK_BOTH) != SHARK_BATT_MASK_BOTH) {
  149. return CB_BAT_NO;
  150. }
  151. shark_charger_set_enable(shark_false);
  152. shark_bms_set_mos_series();
  153. if (!battery_wait_voltage_series(voltage1 + (voltage2 / 3))) {
  154. shark_bms_set_mos_close();
  155. return CB_BAT_NO;
  156. }
  157. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, SHARK_BATT_MASK_BOTH) != SHARK_BATT_MASK_BOTH) {
  158. shark_bms_set_mos_close();
  159. return CB_BAT_NO;
  160. }
  161. sub_bms_info_1.used = shark_true;
  162. sub_bms_info_2.used = shark_true;
  163. shark_battery_series_locked = shark_false;
  164. return CB_BAT1_BAT2_SERIES;
  165. }
  166. static u8 shark_battery_switch_parrallel(void)
  167. {
  168. shark_bms_set_mos_parrallel();
  169. sub_bms_info_1.used = shark_true;
  170. sub_bms_info_2.used = shark_true;
  171. return CB_BAT1_BAT2_PARRALLEL;
  172. }
  173. static u8 shark_battery_switch_bat1(shark_battery_mask_t mask)
  174. {
  175. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, mask) != mask) {
  176. return CB_BAT_NO;
  177. }
  178. shark_bms_set_mos_bat1();
  179. sub_bms_info_1.used = shark_true;
  180. sub_bms_info_2.used = shark_false;
  181. return CB_BAT1;
  182. }
  183. static u8 shark_battery_switch_bat2(shark_battery_mask_t mask)
  184. {
  185. if (shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL, mask) != mask) {
  186. return CB_BAT_NO;
  187. }
  188. shark_bms_set_mos_bat2();
  189. sub_bms_info_1.used = shark_false;
  190. sub_bms_info_2.used = shark_true;
  191. return CB_BAT2;
  192. }
  193. static u8 shark_battery_switch_charge(void)
  194. {
  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 (voltage1 < voltage2) {
  204. return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
  205. } else {
  206. return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
  207. }
  208. }
  209. static u8 shark_battery_switch_single(void)
  210. {
  211. u32 voltage1 = shark_battery_get_voltage1();
  212. u32 voltage2 = shark_battery_get_voltage2();
  213. u64 time = shark_get_mseconds() + 500;
  214. u32 open1 = 0;
  215. u32 open2 = 0;
  216. if (sub_bms_info_1.exit_times < sub_bms_info_2.exit_times) {
  217. return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
  218. }
  219. if (sub_bms_info_2.exit_times < sub_bms_info_1.exit_times) {
  220. return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
  221. }
  222. while (time > shark_get_time_safe()) {
  223. if (BAT1_IS_OPEN()) {
  224. open1++;
  225. }
  226. if (BAT2_IS_OPEN()) {
  227. open2++;
  228. }
  229. }
  230. println("open: %d %d", open1, open2);
  231. println("voltage: %d %d", voltage1, voltage2);
  232. if (open1 > open2) {
  233. return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
  234. }
  235. if (open1 < open2) {
  236. return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
  237. }
  238. if (voltage1 > voltage2) {
  239. return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
  240. } else {
  241. return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
  242. }
  243. }
  244. static shark_bool shark_battery_series_enabled(void)
  245. {
  246. if (shark_charger_state != SHARK_CHG_REMOVE) {
  247. return shark_false;
  248. }
  249. if (QD_Dect()) {
  250. if (shark_xl_check()) {
  251. return shark_false;
  252. }
  253. #ifndef HAN_GUO_VERSION
  254. if (shark_battery_series_locked) {
  255. return shark_false;
  256. }
  257. #endif
  258. if (shark_battery_series_times > SHARK_SERIES_MAX_TIMES) {
  259. return shark_false;
  260. }
  261. }
  262. if (shark_battery_get_capacity1() < SERIES_ENTER_PERCENT) {
  263. return shark_false;
  264. }
  265. if (shark_battery_get_capacity2() < SERIES_ENTER_PERCENT) {
  266. return shark_false;
  267. }
  268. if (shark_battery_get_voltage1() < SERIES_PROTECT_VOL) {
  269. return shark_false;
  270. }
  271. if (shark_battery_get_voltage2() < SERIES_PROTECT_VOL) {
  272. return shark_false;
  273. }
  274. return shark_true;
  275. }
  276. static shark_bool shark_battery_check_series(u8 operate)
  277. {
  278. if (operate != CB_BAT1_BAT2_SERIES && is_intelligent == 0) {
  279. return shark_false;
  280. }
  281. return shark_battery_series_enabled();
  282. }
  283. static shark_bool shark_battery_parrallel_enabled(void)
  284. {
  285. return shark_charger_state == SHARK_CHG_INSERT;
  286. }
  287. static shark_bool shark_battery_check_parrallel(u8 operate)
  288. {
  289. if (operate != CB_BAT1_BAT2_PARRALLEL) {
  290. return shark_false;
  291. }
  292. return shark_battery_parrallel_enabled();
  293. }
  294. static u8 shark_battery_switch_auto(u8 operate)
  295. {
  296. if (operate == cb_operate_state) {
  297. return operate;
  298. }
  299. shark_bms_set_mos_close();
  300. sub_bms_info_1.used = shark_false;
  301. sub_bms_info_2.used = shark_false;
  302. if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, SHARK_BATT_MASK_BOTH) == SHARK_BATT_MASK_NONE) {
  303. return CB_BAT_NO;
  304. }
  305. if (operate == CB_BAT_NO) {
  306. return CB_BAT_NO;
  307. }
  308. if (!battery_wait_voltage_parallel()) {
  309. return CB_BAT_NO;
  310. }
  311. if (shark_battery_is_normal_power_on(&sub_bms_info_1) == SHARK_BATT_EXIT_SUCCESS) {
  312. if (shark_battery_is_normal_power_on(&sub_bms_info_2) == SHARK_BATT_EXIT_SUCCESS) {
  313. if (shark_battery_check_series(operate)) {
  314. operate = shark_battery_switch_series();
  315. if (operate == CB_BAT1_BAT2_SERIES) {
  316. shark_battery_series_times = 0;
  317. } else if (shark_battery_series_times < 0xFF) {
  318. shark_battery_series_times++;
  319. }
  320. return operate;
  321. } else if (shark_battery_check_parrallel(operate)) {
  322. return shark_battery_switch_parrallel();
  323. } else if (shark_charger_state != SHARK_CHG_REMOVE) {
  324. return shark_battery_switch_charge();
  325. } else {
  326. return shark_battery_switch_single();
  327. }
  328. } else {
  329. return shark_battery_switch_bat1(SHARK_BATT_MASK_BAT1);
  330. }
  331. } else if (shark_battery_is_normal_power_on(&sub_bms_info_2) == SHARK_BATT_EXIT_SUCCESS) {
  332. return shark_battery_switch_bat2(SHARK_BATT_MASK_BAT2);
  333. } else {
  334. return CB_BAT_NO;
  335. }
  336. }
  337. int8_t Battery_CB_Switch(uint8_t cb_operate)
  338. {
  339. println("switch: %d -> %d", cb_operate_state, cb_operate);
  340. shark_battery_switch_busy = shark_true;
  341. cb_operate_state = shark_battery_switch_auto(cb_operate);
  342. shark_battery_switch_busy = shark_false;
  343. sub_bms_info_1.exit_times = 0;
  344. sub_bms_info_2.exit_times = 0;
  345. if (cb_operate_state != CB_BAT1_BAT2_SERIES) {
  346. shark_charger_set_enable(shark_true);
  347. }
  348. println("switch: %d", cb_operate_state);
  349. return cb_operate_state;
  350. }
  351. void test_io(void)
  352. {
  353. volatile uint8_t a,b;
  354. a = BAT1_IS_OPEN();
  355. b = BAT2_IS_OPEN();
  356. a++;
  357. b++;
  358. }
  359. uint8_t Select_One_BAT(void)
  360. {
  361. if (sub_bms_info_1.connected) {
  362. return CB_BAT1_BAT2_AUTO;
  363. }
  364. if (sub_bms_info_2.connected) {
  365. return CB_BAT1_BAT2_AUTO;
  366. }
  367. if (work_normal) {
  368. if (Measure_Vol() > 20000) {
  369. return CB_BAT1_BAT2_AUTO;
  370. }
  371. if (shark_battery_ping(10) != SHARK_BATT_MASK_NONE) {
  372. return CB_BAT1_BAT2_AUTO;
  373. }
  374. }
  375. return CB_BAT_NO;
  376. }
  377. uint8_t Check_CB_BAT_1(void)
  378. {
  379. uint8_t temp_op = CB_MAX;
  380. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
  381. {
  382. 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))
  383. {
  384. //sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  385. //sub_bms_info_1.sub_bms_cmd.param = 0x03;
  386. if((sub_bms_info_1.packet_common.work_status &(ST_OVRDISCHRG_VOL|ST_PDOWN)) != 0)
  387. ;
  388. else
  389. temp_op = CB_BAT_NO;
  390. }
  391. //
  392. if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_S_OPEN)) != 0)
  393. {
  394. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  395. sub_bms_info_2.sub_bms_cmd.param = 0x00;
  396. }
  397. }
  398. else
  399. {
  400. /*if(Is_Sub_BMS_2_Normal())
  401. temp_op = CB_BAT2;
  402. else*/
  403. temp_op = CB_BAT_NO;
  404. }
  405. return temp_op;
  406. }
  407. uint8_t Check_CB_BAT_2(void)
  408. {
  409. uint8_t temp_op = CB_MAX;
  410. if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  411. {
  412. 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))
  413. {
  414. //sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  415. //sub_bms_info_2.sub_bms_cmd.param = 0x03;
  416. if((sub_bms_info_2.packet_common.work_status &(ST_OVRDISCHRG_VOL|ST_PDOWN)) != 0)
  417. ;
  418. else
  419. temp_op = CB_BAT_NO;
  420. }
  421. //
  422. if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_S_OPEN)) != 0)
  423. {
  424. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  425. sub_bms_info_1.sub_bms_cmd.param = 0x00;
  426. }
  427. }
  428. else
  429. {
  430. /*if(Is_Sub_BMS_1_Normal())
  431. temp_op = CB_BAT1;
  432. else*/
  433. temp_op = CB_BAT_NO;
  434. }
  435. return temp_op;
  436. }
  437. uint8_t Check_CB_BAT1_BAT2_PARRALLEL(void)
  438. {
  439. uint8_t temp_op = CB_MAX;
  440. if (!shark_battery_parrallel_enabled())
  441. {
  442. temp_op = Select_One_BAT();
  443. return temp_op;
  444. }
  445. //
  446. if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
  447. {
  448. 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))
  449. {
  450. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  451. sub_bms_info_1.sub_bms_cmd.param = 0x03;
  452. }
  453. 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))
  454. {
  455. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  456. sub_bms_info_2.sub_bms_cmd.param = 0x03;
  457. }
  458. }
  459. else
  460. {
  461. temp_op = Select_One_BAT();
  462. return temp_op;
  463. }
  464. //
  465. if(sub_bms_info_1.packet_common.m_current > 50000 || sub_bms_info_2.packet_common.m_current > 50000)
  466. {
  467. temp_op = Select_One_BAT();
  468. return temp_op;
  469. }
  470. if (shark_battery_get_voltage_delta() > PARRALLEL_DELTA_VOL)
  471. {
  472. temp_op = Select_One_BAT();
  473. return temp_op;
  474. }
  475. return temp_op;
  476. }
  477. void Series_Delay_Timeout(void)
  478. {
  479. if(Series_delay.set)
  480. {
  481. Series_delay.count++;
  482. }
  483. }
  484. #ifdef HAN_GUO_VERSION
  485. uint8_t Select_One_BAT_Han_Guo(void)
  486. {
  487. uint8_t temp_op = CB_BAT_NO;
  488. if(Is_Sub_BMS_1_Normal())
  489. {
  490. if(Is_Sub_BMS_2_Normal())
  491. {
  492. if(sub_bms_info_1.packet_common.m_total_vol >= sub_bms_info_2.packet_common.m_total_vol)
  493. {
  494. if(shark_charger_detected)
  495. {
  496. temp_op = CB_BAT2;
  497. }
  498. else
  499. {
  500. temp_op = CB_BAT1;
  501. }
  502. }
  503. else
  504. {
  505. if(shark_charger_detected)
  506. {
  507. temp_op = CB_BAT1;
  508. }
  509. else
  510. {
  511. temp_op = CB_BAT2;
  512. }
  513. }
  514. }
  515. else
  516. {
  517. temp_op = CB_BAT1;
  518. }
  519. }
  520. else if(Is_Sub_BMS_2_Normal())
  521. {
  522. temp_op = CB_BAT2;
  523. }
  524. else
  525. {
  526. if(sub_bms_info_1.packet_common.m_total_vol < sub_bms_info_2.packet_common.m_total_vol)
  527. temp_op = CB_BAT2;
  528. else
  529. temp_op = CB_BAT1;
  530. }
  531. return temp_op;
  532. }
  533. #endif
  534. static u8 shark_battery_get_series_error(void)
  535. {
  536. if (Is_Sub_BMS_1_Normal() != SHARK_BATT_EXIT_SUCCESS) {
  537. return 1;
  538. }
  539. if (Is_Sub_BMS_2_Normal() != SHARK_BATT_EXIT_SUCCESS) {
  540. return 2;
  541. }
  542. if (!shark_battery_check_power(&sub_bms_info_1, SHARK_BATT_POWER_FULL)) {
  543. return 3;
  544. }
  545. if (!shark_battery_check_power(&sub_bms_info_2, SHARK_BATT_POWER_FULL)) {
  546. return 4;
  547. }
  548. return 0;
  549. }
  550. uint8_t Check_CB_BAT1_BAT2_SERIES(void)
  551. {
  552. uint8_t temp_op = CB_MAX;
  553. #ifndef HAN_GUO_VERSION
  554. if (shark_battery_series_locked)
  555. {
  556. temp_op = Select_One_BAT();
  557. return temp_op;
  558. }
  559. #endif
  560. if (shark_charger_state == SHARK_CHG_INSERT)
  561. {
  562. temp_op = Select_One_BAT();
  563. return temp_op;
  564. }
  565. if (shark_battery_get_series_error() != 0)
  566. {
  567. if (shark_xl_check_with_qd()) {
  568. shark_battery_series_locked = shark_true;
  569. println("series locked");
  570. } else {
  571. println("no xl");
  572. }
  573. #ifdef HAN_GUO_VERSION
  574. temp_op = Select_One_BAT_Han_Guo();
  575. #else
  576. temp_op = Select_One_BAT();
  577. #endif
  578. return temp_op;
  579. }
  580. /*if(Measure_Vol() <= CHECK_SERIES_VOL)
  581. {
  582. temp_op = Select_One_BAT();
  583. return temp_op;
  584. }*/
  585. if (shark_battery_get_voltage1() < CHECK_SERIES_PROTECT_VOL || shark_battery_get_voltage2() < CHECK_SERIES_PROTECT_VOL)
  586. {
  587. if(Series_delay.set == 0)
  588. {
  589. Series_delay.set = 1;
  590. Series_delay.count = 0;
  591. }
  592. }
  593. else
  594. {
  595. memset(&Series_delay,0x00,sizeof(Series_delay));
  596. }
  597. if(Series_delay.set&&Series_delay.count >= SERIES_UNDER_VOL_TIME_OUT)
  598. {
  599. memset(&Series_delay,0x00,sizeof(Series_delay));
  600. shark_battery_series_locked = shark_true;
  601. return Select_One_BAT();
  602. }
  603. if(sub_bms_info_1.packet_common.m_percent < SERIES_EXIT_PERCENT || sub_bms_info_2.packet_common.m_percent < SERIES_EXIT_PERCENT)
  604. {
  605. temp_op = Select_One_BAT();
  606. return temp_op;
  607. }
  608. return temp_op;
  609. }
  610. uint8_t power_switch_from = 0;
  611. void Power_On_Normal(uint8_t enable,uint8_t from)
  612. {
  613. if(enable)
  614. {
  615. //FL_Enable(1);
  616. //ACC2_Enable(1);
  617. Can_Power_Enable(1);
  618. Enable_12V(1);
  619. one_bat_initial = 0;
  620. Reset_Enter_Sleep_Delay();
  621. /*if(serise_low_qd_status == 1)
  622. {
  623. QD_Enable(1);
  624. serise_low_qd_status = 0;
  625. }*/
  626. }
  627. else
  628. {
  629. #if 0
  630. NVIC_SystemReset();
  631. #else
  632. // FL_Enable(0);
  633. ACC2_Enable(0);
  634. Can_Power_Enable(0);
  635. //QD_Enable(0);
  636. QD_Enable_From(0,1);
  637. ADAS_Enable(0);
  638. Enable_12V(0);
  639. Set_Enter_Sleep_Delay();
  640. #endif
  641. }
  642. work_normal = enable;
  643. power_switch_from = from;
  644. }
  645. void Check_CB_Operate_State(void)
  646. {
  647. uint8_t temp_op = CB_MAX;
  648. switch(cb_operate_state)
  649. {
  650. case CB_BAT_NO:
  651. temp_op = Select_One_BAT();
  652. break;
  653. case CB_BAT1:
  654. temp_op = Check_CB_BAT_1();
  655. break;
  656. case CB_BAT2:
  657. temp_op = Check_CB_BAT_2();
  658. break;
  659. case CB_BAT1_BAT2_PARRALLEL:
  660. temp_op = Check_CB_BAT1_BAT2_PARRALLEL();
  661. break;
  662. case CB_BAT1_BAT2_SERIES:
  663. temp_op = Check_CB_BAT1_BAT2_SERIES();
  664. break;
  665. default:
  666. return;
  667. }
  668. #if CONFIG_SOAK_ENABLE
  669. if (Is_Soak()) {
  670. temp_op = CB_BAT_NO;
  671. }
  672. #endif
  673. if(temp_op >= CB_MAX)
  674. {
  675. //test-start
  676. if(work_normal == 0)
  677. {
  678. Power_On_Normal(1,3);
  679. }
  680. //test-end
  681. return;
  682. }
  683. else if(temp_op == CB_BAT_NO)
  684. {
  685. if(work_normal == 1)
  686. {
  687. Power_On_Normal(0,1);
  688. }
  689. }
  690. else
  691. {
  692. /*if(work_normal == 1)
  693. {
  694. Power_On_Normal(0);
  695. }*/
  696. }
  697. Battery_CB_Switch(temp_op);
  698. }
  699. uint8_t Is_BAT1_Lock(void)
  700. {
  701. return 0;
  702. }
  703. uint8_t Is_BAT2_Lock(void)
  704. {
  705. return 0;
  706. }
  707. uint8_t Change_Mode_Sub_BMS_1_Normal(void)
  708. {
  709. return Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS;
  710. }
  711. uint8_t Change_Mode_Sub_BMS_2_Normal(void)
  712. {
  713. return Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS;
  714. }
  715. uint8_t Change_Mode_Sub_BMS_PARRALLEL(void)
  716. {
  717. if (!shark_battery_parrallel_enabled()) {
  718. return 0;
  719. }
  720. if (shark_xl_check_with_qd()) {
  721. return 0;
  722. }
  723. if(Is_Sub_BMS_1_Normal() != SHARK_BATT_EXIT_SUCCESS || Is_Sub_BMS_2_Normal() != SHARK_BATT_EXIT_SUCCESS) {
  724. return 0;
  725. }
  726. if (shark_battery_get_voltage_delta() > SHARK_PARRALLEL_VOL_MIN) {
  727. return 0;
  728. }
  729. return 1;
  730. }
  731. uint8_t Change_Mode_Sub_BMS_SERIES(void)
  732. {
  733. if (!shark_battery_series_enabled()) {
  734. return 0;
  735. }
  736. if (Is_Sub_BMS_1_Normal() != SHARK_BATT_EXIT_SUCCESS || Is_Sub_BMS_2_Normal() != SHARK_BATT_EXIT_SUCCESS) {
  737. return 0;
  738. }
  739. /*if(cb_operate_state == CB_BAT1)
  740. {
  741. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_BAHU) != 0)
  742. {
  743. return 0;
  744. }
  745. }
  746. else if(cb_operate_state == CB_BAT2)
  747. {
  748. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_BAHU) != 0)
  749. {
  750. return 0;
  751. }
  752. }*/
  753. #ifdef HAN_GUO_VERSION
  754. if(sub_bms_info_1.packet_common.m_percent < 2\
  755. || sub_bms_info_2.packet_common.m_percent < 2)
  756. return 0;
  757. #else
  758. if(shark_battery_get_voltage1() < SERIES_PROTECT_VOL || shark_battery_get_voltage2() < SERIES_PROTECT_VOL )
  759. return 0;
  760. if(sub_bms_info_1.packet_common.m_percent < SERIES_ENTER_PERCENT || sub_bms_info_2.packet_common.m_percent < SERIES_ENTER_PERCENT)
  761. return 0;
  762. #endif
  763. return 1;
  764. }
  765. uint8_t Battery_Change_Mode(uint8_t cfg_mode)
  766. {
  767. uint8_t cb_operate = CB_MAX;
  768. if(!work_normal)
  769. return 0;
  770. switch(cfg_mode)
  771. {
  772. case CFG_BAT_NO:
  773. return 0;
  774. case CFG_BAT1:
  775. if(Change_Mode_Sub_BMS_1_Normal())
  776. {
  777. cb_operate = CB_BAT1;
  778. }
  779. break;
  780. case CFG_BAT2:
  781. if(Change_Mode_Sub_BMS_2_Normal())
  782. {
  783. cb_operate = CB_BAT2;
  784. }
  785. break;
  786. case CFG_BAT1_BAT2_PARRALLEL:
  787. if(Change_Mode_Sub_BMS_PARRALLEL())
  788. {
  789. cb_operate = CB_BAT1_BAT2_PARRALLEL;
  790. }
  791. break;
  792. case CFG_BAT1_BAT2_SERIES:
  793. if(Change_Mode_Sub_BMS_SERIES())
  794. {
  795. cb_operate = CB_BAT1_BAT2_SERIES;
  796. }
  797. break;
  798. case CFG_MAX:
  799. default:
  800. return 0;
  801. }
  802. if(cb_operate >= CB_MAX)
  803. return 0;
  804. return Battery_CB_Switch(cb_operate);
  805. }
  806. void Intelligent_Management_Battery(void)
  807. {
  808. if(is_intelligent)
  809. {
  810. if(shark_charger_state != SHARK_CHG_REMOVE)
  811. {
  812. if (shark_charge_get_time() < SHARK_CHG_TIME_SWITCH) {
  813. return;
  814. }
  815. if(cb_operate_state == CB_BAT1_BAT2_PARRALLEL)
  816. return;
  817. else if(Battery_Change_Mode(CFG_BAT1_BAT2_PARRALLEL) == CB_BAT1_BAT2_PARRALLEL)
  818. return;
  819. }
  820. else
  821. {
  822. if(cb_operate_state == CB_BAT1_BAT2_SERIES)
  823. return;
  824. if(Battery_Change_Mode(CB_BAT1_BAT2_SERIES) == CB_BAT1_BAT2_SERIES)
  825. return;
  826. }
  827. switch(cb_operate_state)
  828. {
  829. case CB_BAT1:
  830. if (shark_charger_state != SHARK_CHG_REMOVE)
  831. {
  832. if (shark_battery_charge_complete1() || shark_battery_get_voltage2() + SHARK_CHARGE_VOL_FUZZ < shark_battery_get_voltage1())
  833. {
  834. Battery_Change_Mode(CFG_BAT2);
  835. }
  836. }
  837. else if (shark_xl_detected == 0 && shark_battery_get_voltage2() > shark_battery_get_voltage1() + SHARK_BATT_SINGLE_DELTA)
  838. {
  839. Battery_Change_Mode(CFG_BAT2);
  840. }
  841. break;
  842. case CB_BAT2:
  843. if (shark_charger_state != SHARK_CHG_REMOVE)
  844. {
  845. if (shark_battery_charge_complete2() || shark_battery_get_voltage1() + SHARK_CHARGE_VOL_FUZZ < shark_battery_get_voltage2())
  846. {
  847. Battery_Change_Mode(CFG_BAT1);
  848. }
  849. }
  850. else if (shark_xl_detected == 0 && shark_battery_get_voltage1() > shark_battery_get_voltage2() + SHARK_BATT_SINGLE_DELTA)
  851. {
  852. Battery_Change_Mode(CFG_BAT1);
  853. }
  854. break;
  855. case CB_BAT_NO:
  856. case CB_BAT1_BAT2_SERIES:
  857. default:
  858. break;
  859. }
  860. }
  861. }
  862. void Check_Battery_Small_Current(void)
  863. {
  864. switch(cb_operate_state)
  865. {
  866. case CB_BAT1:
  867. if((sub_bms_info_2.packet_common.bms_status & BMS_STA_S_OPEN) == BMS_STA_S_OPEN)
  868. {
  869. sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
  870. sub_bms_info_2.sub_bms_cmd.param = 0x00;
  871. }
  872. break;
  873. case CB_BAT2:
  874. if((sub_bms_info_1.packet_common.bms_status & BMS_STA_S_OPEN) == BMS_STA_S_OPEN)
  875. {
  876. sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
  877. sub_bms_info_1.sub_bms_cmd.param = 0x00;
  878. }
  879. break;
  880. case CB_BAT_NO:
  881. case CB_BAT1_BAT2_PARRALLEL:
  882. case CB_BAT1_BAT2_SERIES:
  883. default:
  884. break;
  885. }
  886. }
  887. void Save_Neng_Hao_Bi(uint8_t *data,uint16_t len)
  888. {
  889. uint32_t capacity = (REG32(0x1FFFF7E0) & 0xFFFF) << 10;
  890. uint32_t address = 0x08000000 + (capacity - SYLC_FLASH_ADDRESS);
  891. uint8_t i = 0;
  892. uint32_t df_value = 0x0325;
  893. fmc_unlock();
  894. Flash_flag_clear();
  895. fmc_page_erase(address);
  896. Flash_flag_clear();
  897. fmc_lock();
  898. fmc_unlock();
  899. i = 0;
  900. while(i<len)
  901. {
  902. memcpy(&df_value,&data[i],4);
  903. fmc_word_program(address + i,df_value);
  904. Flash_flag_clear();
  905. i+= 4;
  906. }
  907. fmc_lock();
  908. }
  909. void Save_Param_Time_Out(void)
  910. {
  911. if(save_param_delay.set)
  912. {
  913. save_param_delay.count++;
  914. if(save_param_delay.count > 600)
  915. {
  916. save_param_delay.count = 0;
  917. g_event |= SAVE_PARAM_EVENT;
  918. }
  919. }
  920. }
  921. void Initial_Neng_Hao_Bi(void)
  922. {
  923. uint32_t capacity = (REG32(0x1FFFF7E0) & 0xFFFF) << 10;
  924. uint32_t address = 0x08000000 + (capacity - SYLC_FLASH_ADDRESS);
  925. SYLC_SAVE_PARM *sylc_temp = (SYLC_SAVE_PARM *)address;
  926. memset(&sheng_yu_li_cheng,0x00,sizeof(sheng_yu_li_cheng));
  927. if(sylc_temp->sy_valid_flag != SY_VALID_FLAG_KEY)
  928. {
  929. sheng_yu_li_cheng.sy_ss_parm.sy_valid_flag = SY_VALID_FLAG_KEY;
  930. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = nhb_default;
  931. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  932. }
  933. else
  934. {
  935. sheng_yu_li_cheng.sy_ss_parm = *sylc_temp;
  936. if(sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi < NENG_HAO_BI_MIN)
  937. {
  938. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = NENG_HAO_BI_MIN;
  939. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  940. }
  941. if(sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi > NENG_HAO_BI_MAX)
  942. {
  943. sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi = NENG_HAO_BI_MAX;
  944. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  945. }
  946. }
  947. save_param_delay.set = 1;
  948. save_param_delay.count = 0;
  949. }
  950. extern uint8_t Get_QD_State(void);
  951. uint8_t Reset_Cal(void)
  952. {
  953. if(Get_QD_State() == 0)
  954. return 1;
  955. if(sheng_yu_li_cheng.sy_dan_ci_li_cheng_temp < sheng_yu_li_cheng.sy_dan_ci_li_cheng)
  956. return 1;
  957. if(sheng_yu_li_cheng.sy_percent_dlta && sheng_yu_li_cheng.sy_dan_ci_li_cheng <= 50)
  958. return 1;
  959. return 0;
  960. }
  961. void Cal_Sheng_Yu_Li_Cheng(void)
  962. {
  963. uint8_t dlta = 0;
  964. uint32_t lc_temp;
  965. if(Reset_Cal())
  966. {
  967. sheng_yu_li_cheng.sy_percent_1 = sub_bms_info_1.packet_common.m_percent;
  968. sheng_yu_li_cheng.sy_percent_2 = sub_bms_info_2.packet_common.m_percent;
  969. sheng_yu_li_cheng.sy_percent_dlta = 0;
  970. //Left_Light_Enable(1);
  971. }
  972. sheng_yu_li_cheng.sy_dan_ci_li_cheng = sheng_yu_li_cheng.sy_dan_ci_li_cheng_temp;
  973. if(sub_bms_info_1.connected && sub_bms_info_1.packet_common.m_percent != 0)
  974. {
  975. if(sheng_yu_li_cheng.sy_percent_1 > sub_bms_info_1.packet_common.m_percent)
  976. {
  977. dlta = sheng_yu_li_cheng.sy_percent_1 - sub_bms_info_1.packet_common.m_percent;
  978. sheng_yu_li_cheng.sy_percent_dlta += dlta;
  979. }
  980. }
  981. sheng_yu_li_cheng.sy_percent_1 = sub_bms_info_1.packet_common.m_percent;
  982. if(sub_bms_info_2.connected && sub_bms_info_2.packet_common.m_percent != 0)
  983. {
  984. if(sheng_yu_li_cheng.sy_percent_2 > sub_bms_info_2.packet_common.m_percent)
  985. {
  986. dlta = sheng_yu_li_cheng.sy_percent_2 - sub_bms_info_2.packet_common.m_percent;
  987. sheng_yu_li_cheng.sy_percent_dlta += dlta;
  988. }
  989. }
  990. sheng_yu_li_cheng.sy_percent_2 = sub_bms_info_2.packet_common.m_percent;
  991. sheng_yu_li_cheng.sy_percent_total = sub_bms_info_1.packet_common.m_percent + sub_bms_info_2.packet_common.m_percent;
  992. if(dlta && sheng_yu_li_cheng.sy_percent_dlta >= 7 && sheng_yu_li_cheng.sy_dan_ci_li_cheng > 700 )
  993. {
  994. double nhb_temp = (double)(sheng_yu_li_cheng.sy_dan_ci_li_cheng)/sheng_yu_li_cheng.sy_percent_dlta;
  995. if(nhb_temp < NENG_HAO_BI_MIN)
  996. nhb_temp = NENG_HAO_BI_MIN;
  997. if(nhb_temp > NENG_HAO_BI_MAX)
  998. nhb_temp = NENG_HAO_BI_MAX;
  999. 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;
  1000. }
  1001. else
  1002. {
  1003. }
  1004. lc_temp = (uint32_t)(sheng_yu_li_cheng.sy_percent_total*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi/1000);
  1005. if(lc_temp > 200)
  1006. lc_temp = 200;
  1007. #if 0
  1008. //bang zi ce shi start
  1009. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = (uint8_t)(lc_temp*2);
  1010. //bang zi ce shi end
  1011. #else
  1012. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = (uint8_t)lc_temp;
  1013. #endif
  1014. if(sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng == 0\
  1015. || (sub_bms_info_1.packet_common.bms_status & BMS_STA_JIAO_YAN)\
  1016. || (sub_bms_info_2.packet_common.bms_status & BMS_STA_JIAO_YAN))
  1017. {
  1018. sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng = sub_bms_info_1.packet_common.yjkxslc\
  1019. + sub_bms_info_2.packet_common.yjkxslc;
  1020. }
  1021. }
  1022. void Save_Param(void)
  1023. {
  1024. Save_Neng_Hao_Bi((uint8_t *)&sheng_yu_li_cheng.sy_ss_parm,sizeof(sheng_yu_li_cheng.sy_ss_parm));
  1025. }