shark_charge.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "shark_charge.h"
  2. #include "app_rs485_1.h"
  3. #include "shark_xl.h"
  4. #include "app.h"
  5. shark_charger_state_t shark_charger_state;
  6. shark_bool shark_charger_enabled;
  7. shark_bool shark_charger_valid;
  8. shark_bool shark_battery_full;
  9. shark_u16 shark_charge_times;
  10. shark_u16 shark_charge_skip;
  11. static shark_u16 shark_charger_remove;
  12. static shark_u16 shark_charger_insert;
  13. void shark_charge_init(void)
  14. {
  15. rcu_periph_clock_enable(GPIO_RCU_CHG_DET);
  16. gpio_init(GPIO_PORT_CHG_DET, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_DET);
  17. rcu_periph_clock_enable(GPIO_RCU_CHG_EN);
  18. gpio_bit_reset(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  19. gpio_init(GPIO_PORT_CHG_EN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_EN);
  20. }
  21. shark_bool shark_battery_charge_full(void)
  22. {
  23. if (sub_bms_info_1.connected) {
  24. if (sub_bms_info_2.connected) {
  25. if (sub_bms_info_1.packet_common.m_percent > 99 && sub_bms_info_2.packet_common.m_percent > 99) {
  26. shark_battery_full = shark_true;
  27. }
  28. if (sub_bms_info_1.packet_common.m_percent < 97 || sub_bms_info_2.packet_common.m_percent < 97) {
  29. shark_battery_full = shark_false;
  30. }
  31. } else {
  32. if (sub_bms_info_1.packet_common.m_percent > 99) {
  33. shark_battery_full = shark_true;
  34. }
  35. if (sub_bms_info_1.packet_common.m_percent < 97) {
  36. shark_battery_full = shark_false;
  37. }
  38. }
  39. } else if (sub_bms_info_2.connected) {
  40. if (sub_bms_info_2.packet_common.m_percent > 99) {
  41. shark_battery_full = shark_true;
  42. }
  43. if (sub_bms_info_2.packet_common.m_percent < 97) {
  44. shark_battery_full = shark_false;
  45. }
  46. } else {
  47. return shark_false;
  48. }
  49. return shark_battery_full;
  50. }
  51. shark_bool shark_charger_is_normal(void)
  52. {
  53. return shark_charger_enabled && (shark_battery_charge_in1() || shark_battery_charge_in2());
  54. }
  55. void shark_charger_set_state(shark_charger_state_t state)
  56. {
  57. if (shark_battery_charge_full()) {
  58. state = SHARK_CHG_REMOVE;
  59. }
  60. if (shark_charger_state != state) {
  61. shark_charger_state = state;
  62. println("charger: state%d", state);
  63. }
  64. }
  65. void shark_charger_set_enable(shark_bool enable)
  66. {
  67. if (shark_battery_charge_full()) {
  68. shark_charger_set_state(SHARK_CHG_REMOVE);
  69. enable = shark_false;
  70. }
  71. if (cb_operate_state == CB_BAT1_BAT2_SERIES) {
  72. enable = shark_false;
  73. }
  74. if (shark_charger_state != SHARK_CHG_INSERT) {
  75. enable = shark_false;
  76. }
  77. if (enable) {
  78. println("charger enable");
  79. gpio_bit_set(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  80. shark_charge_times = 0;
  81. } else {
  82. println("charger disable");
  83. gpio_bit_reset(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  84. }
  85. shark_charger_valid = shark_false;
  86. shark_charger_enabled = enable;
  87. }
  88. void shark_charger_disable(void)
  89. {
  90. if (shark_charge_times > SHARK_CHG_TIME_DETECT || shark_charger_valid) {
  91. println("charger detect");
  92. shark_charger_insert = 0;
  93. shark_charge_skip = 6000;
  94. shark_charger_set_state(SHARK_CHG_DETECT);
  95. shark_charger_set_enable(shark_false);
  96. }
  97. }
  98. void shark_charge_tick(void)
  99. {
  100. if (gpio_input_bit_get(GPIO_PORT_CHG_DET, GPIO_PIN_CHG_DET) == RESET) {
  101. shark_charger_remove = 0;
  102. if (shark_charger_insert > SHARK_CHG_INSERT_MIN) {
  103. if (shark_charger_enabled && shark_charge_times < SHARK_CHG_TIME_MAX) {
  104. shark_charge_times++;
  105. }
  106. } else if (shark_charge_skip > 0) {
  107. shark_charge_skip--;
  108. } else {
  109. if (shark_charger_insert == SHARK_CHG_INSERT_MIN && shark_xl_check_with_qd() == shark_false) {
  110. shark_charger_set_state(SHARK_CHG_INSERT);
  111. }
  112. shark_charger_insert++;
  113. }
  114. } else {
  115. shark_charger_insert = 0;
  116. shark_charge_skip = 0;
  117. if (shark_charger_remove > SHARK_CHG_REMOVE_MIN) {
  118. shark_charger_set_state(SHARK_CHG_REMOVE);
  119. shark_battery_full = shark_false;
  120. } else {
  121. shark_charger_remove++;
  122. }
  123. }
  124. }
  125. void shark_charge_poll(void)
  126. {
  127. if (shark_charger_enabled) {
  128. switch (cb_operate_state) {
  129. case CB_BAT1:
  130. if (sub_bms_info_1.packet_common.charge_flag == 0) {
  131. shark_charger_disable();
  132. }
  133. break;
  134. case CB_BAT2:
  135. if (sub_bms_info_2.packet_common.charge_flag == 0) {
  136. shark_charger_disable();
  137. }
  138. break;
  139. case CB_BAT1_BAT2_PARRALLEL:
  140. if (sub_bms_info_1.packet_common.charge_flag == 0) {
  141. if (sub_bms_info_2.packet_common.charge_flag == 0) {
  142. shark_charger_disable();
  143. }
  144. if (shark_battery_get_current12() < 0) {
  145. shark_charger_disable();
  146. }
  147. } else if (sub_bms_info_2.packet_common.charge_flag == 0 && shark_battery_get_current12() < 0) {
  148. shark_charger_disable();
  149. }
  150. break;
  151. }
  152. } else if (shark_charger_state == SHARK_CHG_INSERT) {
  153. shark_charger_set_enable(shark_true);
  154. }
  155. }