vbat.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "include.h"
  2. #if HLW_UI
  3. #include "hlw_func.h"
  4. #endif
  5. #if VBAT_DETECT_EN
  6. #define VBAT_CACL_VOLTAGE() (u32)((VBAT_VALUE() * VBAT2_COEF / adc_cb.vbg) * VBG_VOLTAGE / 10000)
  7. //AT(.com_rodata.bat)
  8. //const char bat_str[] = "VBAT: %d.%03dV\n";
  9. AT(.com_text.port.vbat)
  10. uint16_t vbat_get_voltage(void)
  11. {
  12. static u16 vbat_bak = 0;
  13. u32 vbat = VBAT_CACL_VOLTAGE();
  14. //不同方案可能采用不同 vbat 滤波算法, 在方案对应的plugin.c中处理
  15. plugin_vbat_filter(&vbat);
  16. //默认的取平均值算法.
  17. adc_cb.vbat_total = adc_cb.vbat_total - adc_cb.vbat_val + vbat; //均值
  18. adc_cb.vbat_val = adc_cb.vbat_total>>5;
  19. if(adc_cb.vbat_val > vbat_bak) {
  20. vbat = adc_cb.vbat_val - vbat_bak;
  21. } else {
  22. vbat = vbat_bak - adc_cb.vbat_val;
  23. }
  24. if (vbat >= 30) { //偏差大于一定值则更新
  25. vbat_bak = adc_cb.vbat_val;
  26. // printf(bat_str, adc_cb.vbat_val/1000, adc_cb.vbat_val%1000);
  27. }
  28. return vbat_bak;
  29. }
  30. void vbat_init(void)
  31. {
  32. saradc_set_channel(BIT(ADCCH_BGOP) | BIT(ADCCH_VBAT));
  33. }
  34. void vbat_voltage_init(void)
  35. {
  36. adc_cb.vbat_val = VBAT_CACL_VOLTAGE();
  37. adc_cb.vbat_total = adc_cb.vbat_val << 5;
  38. sys_cb.vbat = vbat_get_voltage();
  39. }
  40. int is_lowpower_vbat_warning(void)
  41. {
  42. if (sys_cb.vbat <= ((u16)LPWR_OFF_VBAT*100+2700)) {
  43. if (LPWR_OFF_VBAT) {
  44. if (!sys_cb.lpwr_cnt) {
  45. sys_cb.lpwr_cnt = 1;
  46. } else if (sys_cb.lpwr_cnt >= 10) {
  47. return 1; //VBAT低电关机
  48. }
  49. }
  50. return 0; //VBAT低电不关机
  51. }
  52. #if WARNING_LOW_BATTERY
  53. else {
  54. sys_cb.lpwr_cnt = 0;
  55. #if HLW_UI
  56. if (hlw_cb.curr_bat_level == 0){
  57. #else
  58. if (sys_cb.vbat < ((u16)LPWR_WARNING_VBAT*100 + 2800)) {
  59. #endif
  60. #if LED_LOWBAT_EN
  61. if (xcfg_cb.rled_lowbat_en) {
  62. if ((!CHARGE_DC_IN()) && (!RLED_LOWBAT_FOLLOW_EN)) {
  63. led_lowbat();
  64. } else {
  65. led_lowbat_recover();
  66. }
  67. }
  68. #endif // LED_LOWBAT_EN
  69. if (xcfg_cb.lowpower_warning_en) {
  70. return 2; //低电压提示音播报
  71. }
  72. } else {
  73. #if LED_LOWBAT_EN
  74. if (xcfg_cb.rled_lowbat_en) {
  75. led_lowbat_recover();
  76. }
  77. #endif // LED_LOWBAT_EN
  78. }
  79. return 0;
  80. }
  81. #endif // WARNING_LOW_BATTERY
  82. sys_cb.lpwr_cnt = 0;
  83. return 0;
  84. }
  85. #endif //VBAT_DETECT_EN