api-hal-power.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <api-hal-power.h>
  2. #include <adc.h>
  3. #include <math.h>
  4. #define BATTERY_MIN_VOLTAGE 3.4f
  5. #define BATTERY_MAX_VOLTAGE 4.1f
  6. void api_hal_power_init() {}
  7. uint8_t api_hal_power_get_pct() {
  8. float value = api_hal_power_get_battery_voltage();
  9. if (value == NAN || value < BATTERY_MIN_VOLTAGE) {
  10. return 0;
  11. }
  12. value = (value - BATTERY_MIN_VOLTAGE) / (BATTERY_MAX_VOLTAGE - BATTERY_MIN_VOLTAGE) * 100;
  13. if(value > 100) {
  14. value = 100;
  15. }
  16. return value;
  17. }
  18. bool api_hal_power_is_charging() {
  19. return false;
  20. }
  21. void api_hal_power_off() {}
  22. void api_hal_power_enable_otg() {}
  23. void api_hal_power_disable_otg() {}
  24. float api_hal_power_get_battery_voltage() {
  25. ADC_ChannelConfTypeDef sConfig = {0};
  26. sConfig.Channel = ADC_CHANNEL_4;
  27. sConfig.Rank = ADC_REGULAR_RANK_1;
  28. sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  29. sConfig.SingleDiff = ADC_SINGLE_ENDED;
  30. sConfig.OffsetNumber = ADC_OFFSET_NONE;
  31. sConfig.Offset = 0;
  32. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
  33. Error_Handler();
  34. }
  35. float value = NAN;
  36. HAL_ADC_Start(&hadc1);
  37. if(HAL_ADC_PollForConversion(&hadc1, 1000) != HAL_TIMEOUT) {
  38. // adc range / 12 bits * adc_value * divider ratio * sampling drag correction
  39. value = 3.3f / 4096.0f * HAL_ADC_GetValue(&hadc1) * 2 * 1.3;
  40. }
  41. return value;
  42. }
  43. float api_hal_power_get_battery_current() {
  44. return NAN;
  45. }
  46. void api_hal_power_dump_state(string_t buffer) {
  47. string_cat_printf(buffer, "Not supported");
  48. }