shark_charge.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "shark_charge.h"
  2. #include "app_rs485_1.h"
  3. #include "app.h"
  4. shark_bool shark_charger_detected;
  5. shark_bool shark_charger_enabled;
  6. shark_u16 shark_charger_remove;
  7. shark_u16 shark_charge_times;
  8. shark_bool shark_battery_full;
  9. void shark_charge_init(void)
  10. {
  11. rcu_periph_clock_enable(GPIO_RCU_CHG_DET);
  12. gpio_init(GPIO_PORT_CHG_DET, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_DET);
  13. rcu_periph_clock_enable(GPIO_RCU_CHG_EN);
  14. gpio_init(GPIO_PORT_CHG_EN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_EN);
  15. gpio_exti_source_select(EXTI_PORT_CHG_DET, EXTI_PIN_CHG_DET);
  16. exti_init(EXTI_CHG_DET, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  17. exti_interrupt_flag_clear(EXTI_CHG_DET);
  18. nvic_irq_enable(EXTI4_IRQn, 1, 0);
  19. }
  20. void shark_charger_set_enable(shark_bool enable)
  21. {
  22. if (sub_bms_info_1.packet_common.m_percent > 99 && sub_bms_info_2.packet_common.m_percent > 99) {
  23. shark_battery_full = shark_true;
  24. }
  25. if (sub_bms_info_1.packet_common.m_percent < 97 || sub_bms_info_2.packet_common.m_percent < 97) {
  26. shark_battery_full = shark_false;
  27. }
  28. if (shark_battery_full || cb_operate_state == CB_BAT1_BAT2_SERIES || shark_charger_remove) {
  29. enable = shark_false;
  30. }
  31. if (shark_charger_enabled != enable) {
  32. shark_charger_enabled = enable;
  33. shark_charge_times = 0;
  34. if (enable) {
  35. gpio_bit_set(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  36. println("charger enabled");
  37. } else {
  38. gpio_bit_reset(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  39. shark_charger_remove = SHARK_CHG_DEBOUNCE;
  40. println("charger disabled");
  41. }
  42. }
  43. }
  44. void shark_charger_disable(void)
  45. {
  46. if (shark_charge_times > SHARK_CHG_TIME_MIN) {
  47. shark_charger_set_enable(shark_false);
  48. }
  49. }
  50. void shark_charge_tick(void)
  51. {
  52. if (shark_charger_remove > 0) {
  53. if (shark_charger_remove > 1) {
  54. shark_charger_remove--;
  55. } else {
  56. shark_charger_remove = 0;
  57. shark_charger_detected = shark_false;
  58. }
  59. }
  60. if (shark_charger_enabled && shark_charge_times < SHARK_CHG_TIME_MAX) {
  61. shark_charge_times++;
  62. }
  63. }
  64. void shark_charge_poll(void)
  65. {
  66. if (shark_charger_detected) {
  67. if (shark_charger_enabled) {
  68. switch (cb_operate_state) {
  69. case CB_BAT1:
  70. if (sub_bms_info_1.packet_common.charge_flag == 0) {
  71. shark_charger_disable();
  72. }
  73. break;
  74. case CB_BAT2:
  75. if (sub_bms_info_2.packet_common.charge_flag == 0) {
  76. shark_charger_disable();
  77. }
  78. break;
  79. case CB_BAT1_BAT2_PARRALLEL:
  80. if (sub_bms_info_1.packet_common.charge_flag == 0 || sub_bms_info_2.packet_common.charge_flag == 0) {
  81. shark_charger_disable();
  82. }
  83. break;
  84. }
  85. } else {
  86. shark_charger_set_enable(shark_true);
  87. }
  88. }
  89. }
  90. void EXTI4_IRQHandler(void)
  91. {
  92. if (exti_flag_get(EXTI_4) != RESET) {
  93. exti_flag_clear(EXTI_4);
  94. shark_charger_remove = 0;
  95. shark_charger_detected = shark_true;
  96. }
  97. }