shark_charge.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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_u16 shark_charge_times;
  8. static shark_u16 shark_charger_remove;
  9. static shark_u16 shark_charger_insert;
  10. static shark_bool shark_battery_full;
  11. void shark_charge_init(void)
  12. {
  13. rcu_periph_clock_enable(GPIO_RCU_CHG_DET);
  14. gpio_init(GPIO_PORT_CHG_DET, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_DET);
  15. rcu_periph_clock_enable(GPIO_RCU_CHG_EN);
  16. gpio_bit_reset(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  17. gpio_init(GPIO_PORT_CHG_EN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_EN);
  18. }
  19. void shark_charger_set_enable(shark_bool enable)
  20. {
  21. if (sub_bms_info_1.packet_common.m_percent > 99 && sub_bms_info_2.packet_common.m_percent > 99) {
  22. shark_battery_full = shark_true;
  23. }
  24. if (sub_bms_info_1.packet_common.m_percent < 97 || sub_bms_info_2.packet_common.m_percent < 97) {
  25. shark_battery_full = shark_false;
  26. }
  27. if (shark_battery_full || cb_operate_state == CB_BAT1_BAT2_SERIES) {
  28. enable = shark_false;
  29. }
  30. if (enable) {
  31. gpio_bit_set(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  32. } else {
  33. gpio_bit_reset(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  34. }
  35. shark_charger_enabled = enable;
  36. shark_charge_times = 0;
  37. }
  38. void shark_charger_disable(void)
  39. {
  40. if (shark_charge_times > SHARK_CHG_TIME_DETECT) {
  41. shark_charger_set_enable(shark_false);
  42. shark_charger_insert = 0;
  43. shark_charger_state = SHARK_CHG_DETECT;
  44. }
  45. }
  46. void shark_charge_tick(void)
  47. {
  48. if (gpio_input_bit_get(GPIO_PORT_CHG_DET, GPIO_PIN_CHG_DET) == RESET) {
  49. shark_charger_remove = 0;
  50. if (shark_charger_insert > SHARK_CHG_INSERT_MIN) {
  51. if (shark_xl_check_with_qd() == shark_false) {
  52. shark_charger_state = SHARK_CHG_INSERT;
  53. }
  54. if (shark_charger_enabled && shark_charge_times < SHARK_CHG_TIME_MAX) {
  55. shark_charge_times++;
  56. }
  57. } else {
  58. shark_charger_insert++;
  59. }
  60. } else {
  61. shark_charger_insert = 0;
  62. if (shark_charger_remove > SHARK_CHG_REMOVE_MIN) {
  63. shark_charger_state = SHARK_CHG_REMOVE;
  64. } else {
  65. shark_charger_remove++;
  66. }
  67. }
  68. }
  69. void shark_charge_poll(void)
  70. {
  71. if (shark_charger_state == SHARK_CHG_INSERT) {
  72. if (shark_charger_enabled) {
  73. switch (cb_operate_state) {
  74. case CB_BAT1:
  75. if (sub_bms_info_1.packet_common.charge_flag == 0) {
  76. shark_charger_disable();
  77. }
  78. break;
  79. case CB_BAT2:
  80. if (sub_bms_info_2.packet_common.charge_flag == 0) {
  81. shark_charger_disable();
  82. }
  83. break;
  84. case CB_BAT1_BAT2_PARRALLEL:
  85. if (sub_bms_info_1.packet_common.charge_flag == 0) {
  86. if (sub_bms_info_2.packet_common.charge_flag == 0) {
  87. shark_charger_disable();
  88. }
  89. if (shark_battery_get_current12() < 0) {
  90. shark_charger_disable();
  91. }
  92. } else if (sub_bms_info_2.packet_common.charge_flag == 0 && shark_battery_get_current12() < 0) {
  93. shark_charger_disable();
  94. }
  95. break;
  96. }
  97. } else {
  98. shark_charger_set_enable(shark_true);
  99. }
  100. }
  101. }