soft_adc.c 3.1 KB

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