shark_charge.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "shark_charge.h"
  2. #include "app_rs485_1.h"
  3. #include "shark_xl.h"
  4. #include "app.h"
  5. shark_bool shark_charger_detected;
  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. }
  43. }
  44. void shark_charge_tick(void)
  45. {
  46. if (gpio_input_bit_get(GPIO_PORT_CHG_DET, GPIO_PIN_CHG_DET) == RESET) {
  47. shark_charger_remove = 0;
  48. if (shark_charger_insert < 50) {
  49. shark_charger_insert++;
  50. } else if (shark_xl_check_with_qd() == shark_false) {
  51. shark_charger_detected = shark_true;
  52. if (shark_charger_enabled && shark_charge_times < SHARK_CHG_TIME_MAX) {
  53. shark_charge_times++;
  54. }
  55. }
  56. } else {
  57. shark_charger_insert = 0;
  58. if (shark_charger_remove < 2000) {
  59. shark_charger_remove++;
  60. } else {
  61. shark_charger_detected = shark_false;
  62. }
  63. }
  64. }
  65. void shark_charge_poll(void)
  66. {
  67. if (shark_charger_detected) {
  68. if (shark_charger_enabled) {
  69. switch (cb_operate_state) {
  70. case CB_BAT1:
  71. if (sub_bms_info_1.packet_common.charge_flag == 0) {
  72. shark_charger_disable();
  73. }
  74. break;
  75. case CB_BAT2:
  76. if (sub_bms_info_2.packet_common.charge_flag == 0) {
  77. shark_charger_disable();
  78. }
  79. break;
  80. case CB_BAT1_BAT2_PARRALLEL:
  81. if (sub_bms_info_1.packet_common.charge_flag == 0) {
  82. if (sub_bms_info_2.packet_common.charge_flag == 0) {
  83. shark_charger_disable();
  84. }
  85. if (shark_battery_get_current12() < 0) {
  86. shark_charger_disable();
  87. }
  88. } else if (sub_bms_info_2.packet_common.charge_flag == 0 && shark_battery_get_current12() < 0) {
  89. shark_charger_disable();
  90. }
  91. break;
  92. }
  93. } else {
  94. shark_charger_set_enable(shark_true);
  95. }
  96. }
  97. }