shark_charge.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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_bool shark_battery_full;
  7. shark_u16 shark_charger_debounce;
  8. void shark_charge_init(void)
  9. {
  10. rcu_periph_clock_enable(GPIO_RCU_CHG_DET);
  11. gpio_init(GPIO_PORT_CHG_DET, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_DET);
  12. rcu_periph_clock_enable(GPIO_RCU_CHG_EN);
  13. gpio_init(GPIO_PORT_CHG_EN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_EN);
  14. gpio_exti_source_select(EXTI_PORT_CHG_DET, EXTI_PIN_CHG_DET);
  15. exti_init(EXTI_CHG_DET, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  16. exti_interrupt_flag_clear(EXTI_CHG_DET);
  17. nvic_irq_enable(EXTI4_IRQn , 1, 0);
  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 (shark_charger_enabled != enable) {
  31. shark_charger_enabled = enable;
  32. if (enable) {
  33. gpio_bit_set(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  34. println("charger enabled");
  35. } else {
  36. gpio_bit_reset(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
  37. shark_charger_debounce = SHARK_CHG_DEBOUNCE;
  38. println("charger disabled");
  39. }
  40. }
  41. }
  42. void shark_charge_tick(void)
  43. {
  44. if (shark_charger_debounce > 0) {
  45. if (shark_charger_debounce > 1) {
  46. shark_charger_debounce--;
  47. } else {
  48. shark_charger_debounce = 0;
  49. shark_charger_detected = shark_charger_detect();
  50. if (shark_charger_detected)
  51. cang_wei = CW_CHE_SHANG_CHARGER;
  52. else
  53. cang_wei = CW_CHE_SHANG_NO_CHARGER;
  54. }
  55. }
  56. }
  57. void shark_charge_poll(void)
  58. {
  59. if (shark_charger_detected) {
  60. if (shark_charger_enabled) {
  61. switch (cb_operate_state) {
  62. case CB_BAT1:
  63. if (sub_bms_info_1.packet_common.charge_flag == 0) {
  64. shark_charger_set_enable(shark_false);
  65. }
  66. break;
  67. case CB_BAT2:
  68. if (sub_bms_info_2.packet_common.charge_flag == 0) {
  69. shark_charger_set_enable(shark_false);
  70. }
  71. break;
  72. case CB_BAT1_BAT2_PARRALLEL:
  73. if (sub_bms_info_1.packet_common.charge_flag == 0 && sub_bms_info_2.packet_common.charge_flag == 0) {
  74. shark_charger_set_enable(shark_false);
  75. }
  76. break;
  77. }
  78. } else {
  79. shark_charger_set_enable(shark_true);
  80. }
  81. }
  82. }
  83. void EXTI4_IRQHandler(void)
  84. {
  85. if (exti_flag_get(EXTI_4) != RESET) {
  86. exti_flag_clear(EXTI_4);
  87. shark_charger_debounce = SHARK_CHG_DEBOUNCE;
  88. }
  89. }