soft_adc.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include "adc.h"
  2. #include "soft_adc.h"
  3. uint16_t ADC_value = 0;
  4. float aver_value = 0;
  5. uint8_t adc_cnt = 0;
  6. uint32_t ADC_flag = 0;
  7. /*********************AD中断回调*******************/
  8. void HAL_ADC_ConvCpltCallback( ADC_HandleTypeDef *hadc )
  9. {
  10. ADC_flag = 1;
  11. }
  12. /**
  13. * @file buf_sort
  14. * @brief 冒泡 从小到大
  15. * @param arr, length
  16. * @details
  17. * @author Zhang Sir
  18. **/
  19. void buf_sort( float *arr, uint32_t length )
  20. {
  21. if ( length < 2 )
  22. {
  23. return;
  24. }
  25. uint32_t num = 0, num1 = 0;
  26. float tmp = 0;
  27. for ( num = length - 1; num >= 1; num-- )
  28. {
  29. for ( num1 = 0; num1 <= num - 1; num1++ )
  30. {
  31. if ( *( arr + num1 ) > *( arr + num1 + 1 ) )
  32. {
  33. tmp = *( arr + num1 );
  34. *( arr + num1 ) = *( arr + num1 + 1 );
  35. *( arr + num1 + 1 ) = tmp;
  36. }
  37. }
  38. }
  39. }
  40. /**
  41. * @file Get_ADCChannelValue
  42. * @brief 获取不同通道ad采集
  43. * @param None
  44. * @details
  45. * @author Zhang Sir
  46. **/
  47. uint16_t Get_ADCChannelValue(ADC_HandleTypeDef *hadc, uint32_t channel)
  48. {
  49. uint16_t temp_adc = 0;
  50. ADC_ChannelConfTypeDef ADC_ChanConf;
  51. ADC_ChanConf.Channel = channel;
  52. ADC_ChanConf.Rank = ADC_REGULAR_RANK_1;
  53. ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
  54. if (HAL_ADC_ConfigChannel(hadc, &ADC_ChanConf) != HAL_OK)
  55. {
  56. Error_Handler();
  57. }
  58. HAL_ADC_Start_IT(hadc);
  59. HAL_ADC_PollForConversion(hadc, 1);
  60. temp_adc = HAL_ADC_GetValue(hadc);
  61. return temp_adc;
  62. }
  63. /**
  64. * @file adc_gather_hz
  65. * @brief AD电压采集
  66. * @param None
  67. * @details
  68. * @author Zhang Sir
  69. **/
  70. static float ADC_buf[20];
  71. float ADC_temp = 0.0f;
  72. void adc_gather_hz()
  73. {
  74. static uint32_t adc_time = 0;
  75. if ( HAL_GetTick() - adc_time > 20 )
  76. {
  77. ADC_buf[adc_cnt] = Get_ADCChannelValue(&hadc1, ADC_CHANNEL_0);
  78. HAL_ADC_Stop(&hadc1);
  79. adc_cnt++;
  80. if ( adc_cnt >= 20 )
  81. {
  82. adc_cnt = 0;
  83. }
  84. adc_time = HAL_GetTick();
  85. }
  86. }
  87. /**
  88. * @file ADC_gather
  89. * @brief AD采集转换成电压
  90. * @param None
  91. * @details
  92. * @author Zhang Sir
  93. **/
  94. float ADC_gather( void )
  95. {
  96. float real_value = 0;
  97. if ( ADC_flag == 1 )
  98. {
  99. ADC_flag = 0;
  100. buf_sort( ADC_buf, 20 );
  101. for ( uint8_t ib = 1; ib < 19; ib++ )
  102. {
  103. real_value += ADC_buf[ib];
  104. }
  105. //aver_value = real_value / 4096 * 3.3f / 18 * 28 * 1000; //Mv 4096*3 真实电压 , 取18个值 , pmu28分频
  106. //12bit 4095 超过94V 28分频不够
  107. aver_value = real_value / 4096 * 3.226f / 18 * 31 * 1000; //Mv 4096*3 真实电压 , 取18个值 , pmu31分频
  108. }
  109. return aver_value;
  110. }
  111. /**
  112. * @file ADC_read_temptrue
  113. * @brief ad温度采集
  114. * @param None
  115. * @details
  116. * @author Zhang Sir
  117. **/
  118. uint16_t ADC_read_temptrue()
  119. {
  120. uint16_t mcu_temp = 0;
  121. float mcu_temp1 = 0;
  122. mcu_temp = Get_ADCChannelValue(&hadctemp, ADC_CHANNEL_16);
  123. HAL_ADC_Stop(&hadctemp);
  124. mcu_temp1 = ( int )( ( 1.43f - mcu_temp * 3.3f / 4096 ) / 0.00043f + 250 ) / 10.0f;
  125. return mcu_temp1;
  126. }