soft_adc.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "soft_adc.h"
  2. #include "common.h"
  3. #include "main.h"
  4. #include "stm32f4xx_hal_adc.h"
  5. extern ADC_HandleTypeDef hadc1;
  6. uint16_t Get_ADCChannelValue(ADC_HandleTypeDef *hadc, uint32_t channel)
  7. {
  8. uint16_t temp_adc = 0;
  9. ADC_ChannelConfTypeDef ADC_ChanConf;
  10. ADC_ChanConf.Channel = channel;
  11. ADC_ChanConf.Rank = 1;
  12. ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_28CYCLES;
  13. if (HAL_ADC_ConfigChannel(hadc, &ADC_ChanConf) != HAL_OK)
  14. {
  15. Error_Handler();
  16. }
  17. HAL_ADC_Start_IT(hadc);
  18. HAL_ADC_PollForConversion(hadc, 1);
  19. temp_adc = HAL_ADC_GetValue(hadc);
  20. HAL_ADC_Stop(hadc);
  21. return temp_adc;
  22. }
  23. uint16_t adc_12v_buf[20] = {0};
  24. uint16_t adc_5v_buf[20] = {0};
  25. uint16_t adc_bms_buf[20] = {0};
  26. void ADC_GET_DATA(void)
  27. {
  28. static uint32_t time = 0;
  29. static uint8_t get_count = 0;
  30. if(Check_Timer_Ready(&time,_20_HZ_))
  31. {
  32. adc_12v_buf[get_count] = Get_ADCChannelValue(&hadc1, ADC_CHANNEL_4);
  33. adc_5v_buf[get_count] = Get_ADCChannelValue(&hadc1, ADC_CHANNEL_8);
  34. adc_bms_buf[get_count] = Get_ADCChannelValue(&hadc1, ADC_CHANNEL_9);
  35. get_count++;
  36. if (get_count >= 20)
  37. {
  38. get_count = 0;
  39. }
  40. }
  41. }
  42. float Adc_Get(uint8_t Pin)
  43. {
  44. float real_value = 0;
  45. switch (Pin)
  46. {
  47. case ADC_12V:
  48. u16t_buf_sort(adc_12v_buf, 20);
  49. for (uint8_t ib = 1; ib < 19; ib++)
  50. {
  51. real_value += adc_12v_buf[ib];
  52. }
  53. real_value = real_value / 4096 * 3.226f / 18 * 5.7 * 1000; // 10k 47k
  54. break;
  55. case ADC_5V:
  56. u16t_buf_sort(adc_5v_buf, 20);
  57. for (uint8_t ib = 1; ib < 19; ib++)
  58. {
  59. real_value += adc_5v_buf[ib];
  60. }
  61. real_value = real_value / 4096 * 3.226f / 18 * 2 * 1000; //10k 10k
  62. break;
  63. case ADC_Bms:
  64. u16t_buf_sort(adc_bms_buf, 20);
  65. for (uint8_t ib = 1; ib < 19; ib++)
  66. {
  67. real_value += adc_bms_buf[ib];
  68. }
  69. real_value = real_value / 4096 * 3.226f / 18 * 31 * 1000; //10k 30k 31分频
  70. break;
  71. case ADC_Tempture:
  72. real_value = Get_ADCChannelValue(&hadc1, ADC_CHANNEL_16);
  73. real_value = ( ( real_value * 3.3f / 4096 - 0.76) / 0.0025 + 25 );
  74. break;
  75. default:
  76. break;
  77. }
  78. return real_value;
  79. }