bsp_saradc_vbat.c 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "include.h"
  2. #include "driver_saradc.h"
  3. #include "bsp_saradc_vbat.h"
  4. #if BSP_VBAT_DETECT_EN
  5. #define VBAT_FILTER_BUF_LEN 5
  6. static u32 vbat_voltage = 0;
  7. // 电池电量相关参数
  8. const vbat_param_struct vbat_param = {
  9. .vbat_max_level = 100,
  10. .vbat_min_power = 2500,
  11. .vbat_max_power = 4200,
  12. };
  13. // 初始化Vbat检测
  14. void bsp_vbat_detect_init(void)
  15. {
  16. saradc_channel_init_typedef saradc_channel_init_struct;
  17. saradc_channel_init_struct.channel = ADC_CHANNEL_VBAT | VBAT_DETECT_ASSIST_CHANNEL;
  18. saradc_channel_init_struct.pullup_en = SARADC_PULLUP_DIS;
  19. saradc_channel_init_struct.setup_time = SARADC_ST_8_CLK;
  20. saradc_channel_init_struct.interrupt_en = DISABLE;
  21. saradc_channel_init(&saradc_channel_init_struct);
  22. saradc_kick_start(ADC_CHANNEL_VBAT | VBAT_DETECT_ASSIST_CHANNEL);
  23. while(!saradc_get_channel_flag(ADC_CHANNEL_VBAT | VBAT_DETECT_ASSIST_CHANNEL));
  24. bsp_vbat_proc();
  25. }
  26. uint32_t bsp_vbat_filter(uint32_t voltage)
  27. {
  28. static uint8_t div = 1;
  29. static uint8_t index = 0;
  30. static uint32_t filter_buf[VBAT_FILTER_BUF_LEN] = {0};
  31. uint32_t total_vol = 0;
  32. uint32_t result = 0;
  33. filter_buf[index] = voltage;
  34. for (uint8_t i=0; i<VBAT_FILTER_BUF_LEN; i++) {
  35. total_vol += filter_buf[i];
  36. }
  37. result = total_vol / div;
  38. div = (div >= VBAT_FILTER_BUF_LEN) ? VBAT_FILTER_BUF_LEN : (div+1);
  39. index = (index >= (VBAT_FILTER_BUF_LEN-1)) ? 0 : (index+1);
  40. return result;
  41. }
  42. AT(.text.app.proc.vbat)
  43. void bsp_vbat_proc(void)
  44. {
  45. uint32_t adc_val;
  46. uint32_t adc_vbg;
  47. uint32_t vbat_cur;
  48. uint16_t diff;
  49. if (saradc_get_channel_flag(ADC_CHANNEL_VBAT | VBAT_DETECT_ASSIST_CHANNEL)) {
  50. adc_val = saradc_get_data(ADC_CHANNEL_VBAT);
  51. adc_vbg = saradc_get_data(VBAT_DETECT_ASSIST_CHANNEL);
  52. vbat_cur = adc_val * VBAT_DETECT_ASSIST_VOLTAGE / adc_vbg;
  53. vbat_cur = bsp_vbat_filter(vbat_cur);
  54. if(vbat_voltage > vbat_cur) {
  55. diff = vbat_voltage - vbat_cur;
  56. } else {
  57. diff = vbat_cur - vbat_voltage;
  58. }
  59. if (diff >= 30) {
  60. vbat_voltage = vbat_cur;
  61. }
  62. saradc_kick_start(ADC_CHANNEL_VBAT | VBAT_DETECT_ASSIST_CHANNEL);
  63. }
  64. }
  65. // 获取电池电量: 1:电量adc值(mA) 0:电量水平
  66. uint16_t bsp_get_vbat_level(u8 mode)
  67. {
  68. uint8_t current_power;
  69. if (mode == 0) {
  70. if (vbat_param.vbat_min_power > vbat_voltage) {
  71. return 0;
  72. }
  73. current_power = vbat_param.vbat_max_level * \
  74. (vbat_voltage - vbat_param.vbat_min_power) / (vbat_param.vbat_max_power - vbat_param.vbat_min_power);
  75. current_power = (current_power > vbat_param.vbat_max_level) ? vbat_param.vbat_max_level : current_power;
  76. return current_power;
  77. } else {
  78. return vbat_voltage;
  79. }
  80. }
  81. #endif // BSP_VBAT_DETECT_EN