Battery.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. //
  2. // Created by admin on 2025/10/1.
  3. //
  4. #include "Battery.h"
  5. /*
  6. ****************************************************************************************************
  7. 2025/10/1 计划采用ADC来实现电量检测
  8. */
  9. ADC_HandleTypeDef g_adc_handle;
  10. void adc_init(void)
  11. {
  12. g_adc_handle.Instance = ADC_ADCX;
  13. g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  14. g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;
  15. g_adc_handle.Init.ContinuousConvMode = DISABLE;
  16. g_adc_handle.Init.NbrOfConversion = 1;
  17. g_adc_handle.Init.DiscontinuousConvMode = DISABLE;
  18. g_adc_handle.Init.NbrOfDiscConversion = 0;
  19. g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  20. HAL_ADC_Init(&g_adc_handle);
  21. HAL_ADCEx_Calibration_Start(&g_adc_handle);
  22. }
  23. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
  24. {
  25. if(hadc->Instance == ADC_ADCX)
  26. {
  27. GPIO_InitTypeDef gpio_init_struct;
  28. RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
  29. ADC_ADCX_CHY_CLK_ENABLE();
  30. ADC_ADCX_CHY_GPIO_CLK_ENABLE();
  31. adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  32. adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  33. HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);
  34. gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN;
  35. gpio_init_struct.Mode = GPIO_MODE_ANALOG;
  36. HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, &gpio_init_struct);
  37. }
  38. }
  39. void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime)
  40. {
  41. ADC_ChannelConfTypeDef adc_ch_conf;
  42. adc_ch_conf.Channel = ch;
  43. adc_ch_conf.Rank = rank;
  44. adc_ch_conf.SamplingTime = stime;
  45. HAL_ADC_ConfigChannel(adc_handle, &adc_ch_conf);
  46. }
  47. uint32_t adc_get_result(uint32_t ch)
  48. {
  49. adc_channel_set(&g_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);
  50. HAL_ADC_Start(&g_adc_handle);
  51. HAL_ADC_PollForConversion(&g_adc_handle, 10);
  52. return (uint16_t)HAL_ADC_GetValue(&g_adc_handle);
  53. }
  54. uint32_t adc_get_result_average(uint32_t ch, uint8_t times)
  55. {
  56. uint32_t temp_val = 0;
  57. uint8_t t;
  58. for (t = 0; t < times; t++)
  59. {
  60. temp_val += adc_get_result(ch);
  61. HAL_Delay(5);
  62. }
  63. return temp_val / times;
  64. }