adc.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file adc.c
  5. * @brief This file provides code for the configuration
  6. * of the ADC instances.
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * Copyright (c) 2026 STMicroelectronics.
  11. * All rights reserved.
  12. *
  13. * This software is licensed under terms that can be found in the LICENSE file
  14. * in the root directory of this software component.
  15. * If no LICENSE file comes with this software, it is provided AS-IS.
  16. *
  17. ******************************************************************************
  18. */
  19. #include "math.h"
  20. /* USER CODE END Header */
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "adc.h"
  23. /* USER CODE BEGIN 0 */
  24. #define ADC1_CHANNEL_COUNT 2 //
  25. #define ADC_SAMPLING_TIMES 10 //
  26. uint16_t ADC1_Converted_Value[ADC1_CHANNEL_COUNT * ADC_SAMPLING_TIMES];
  27. /* USER CODE END 0 */
  28. ADC_HandleTypeDef hadc1;
  29. DMA_HandleTypeDef hdma_adc1;
  30. /* ADC1 init function */
  31. void MX_ADC1_Init(void)
  32. {
  33. /* USER CODE BEGIN ADC1_Init 0 */
  34. /* USER CODE END ADC1_Init 0 */
  35. ADC_ChannelConfTypeDef sConfig = {0};
  36. /* USER CODE BEGIN ADC1_Init 1 */
  37. /* USER CODE END ADC1_Init 1 */
  38. /** Common config
  39. */
  40. hadc1.Instance = ADC1;
  41. hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  42. hadc1.Init.ContinuousConvMode = ENABLE;
  43. hadc1.Init.DiscontinuousConvMode = DISABLE;
  44. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  45. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  46. hadc1.Init.NbrOfConversion = 2;
  47. if (HAL_ADC_Init(&hadc1) != HAL_OK)
  48. {
  49. Error_Handler();
  50. }
  51. /** Configure Regular Channel
  52. */
  53. sConfig.Channel = ADC_CHANNEL_12;
  54. sConfig.Rank = ADC_REGULAR_RANK_1;
  55. sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
  56. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  57. {
  58. Error_Handler();
  59. }
  60. /** Configure Regular Channel
  61. */
  62. sConfig.Channel = ADC_CHANNEL_13;
  63. sConfig.Rank = ADC_REGULAR_RANK_2;
  64. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  65. {
  66. Error_Handler();
  67. }
  68. /* USER CODE BEGIN ADC1_Init 2 */
  69. HAL_ADC_Stop_DMA(&hadc1);
  70. /* USER CODE END ADC1_Init 2 */
  71. }
  72. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  73. {
  74. GPIO_InitTypeDef GPIO_InitStruct = {0};
  75. if(adcHandle->Instance==ADC1)
  76. {
  77. /* USER CODE BEGIN ADC1_MspInit 0 */
  78. /* USER CODE END ADC1_MspInit 0 */
  79. /* ADC1 clock enable */
  80. __HAL_RCC_ADC1_CLK_ENABLE();
  81. __HAL_RCC_GPIOC_CLK_ENABLE();
  82. /**ADC1 GPIO Configuration
  83. PC2 ------> ADC1_IN12
  84. PC3 ------> ADC1_IN13
  85. */
  86. GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  87. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  88. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  89. /* ADC1 DMA Init */
  90. /* ADC1 Init */
  91. hdma_adc1.Instance = DMA1_Channel1;
  92. hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  93. hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  94. hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  95. hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  96. hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  97. hdma_adc1.Init.Mode = DMA_CIRCULAR;
  98. hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
  99. if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  100. {
  101. Error_Handler();
  102. }
  103. __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
  104. /* USER CODE BEGIN ADC1_MspInit 1 */
  105. /* USER CODE END ADC1_MspInit 1 */
  106. }
  107. }
  108. void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
  109. {
  110. if(adcHandle->Instance==ADC1)
  111. {
  112. /* USER CODE BEGIN ADC1_MspDeInit 0 */
  113. /* USER CODE END ADC1_MspDeInit 0 */
  114. /* Peripheral clock disable */
  115. __HAL_RCC_ADC1_CLK_DISABLE();
  116. /**ADC1 GPIO Configuration
  117. PC2 ------> ADC1_IN12
  118. PC3 ------> ADC1_IN13
  119. */
  120. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_2|GPIO_PIN_3);
  121. /* ADC1 DMA DeInit */
  122. HAL_DMA_DeInit(adcHandle->DMA_Handle);
  123. /* USER CODE BEGIN ADC1_MspDeInit 1 */
  124. /* USER CODE END ADC1_MspDeInit 1 */
  125. }
  126. }
  127. /* USER CODE BEGIN 1 */
  128. void ADC_Inner_start(void)
  129. {
  130. HAL_ADC_Stop_DMA(&hadc1);
  131. HAL_Delay(10);
  132. HAL_StatusTypeDef ret;
  133. ret = HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1_Converted_Value, ADC1_CHANNEL_COUNT * ADC_SAMPLING_TIMES);
  134. if(ret)
  135. {
  136. Error_Handler();
  137. }
  138. }
  139. float getADC_Chanel_value(unsigned int ch){
  140. unsigned int max;
  141. unsigned int min;
  142. unsigned int sum;
  143. if(ch < ADC1_CHANNEL_COUNT){
  144. max = ADC1_Converted_Value[0];
  145. min = ADC1_Converted_Value[0];
  146. sum = ADC1_Converted_Value[0];
  147. for(unsigned int i=1;i<ADC_SAMPLING_TIMES;i++){
  148. if(max < ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch])max=ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch];
  149. if(min > ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch])min=ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch];
  150. sum += ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch];
  151. }
  152. }
  153. sum -= min;
  154. sum -= max;
  155. sum = sum/(ADC_SAMPLING_TIMES - 2);
  156. float Rt=0; //NTC电阻
  157. float R=10000; //10K固定阻值电阻
  158. float T0=273.15+25; //转换为开尔文温度
  159. float B=3980; //B值 >50°
  160. float Ka=273.15; //K值
  161. float temp;
  162. float VR=0; //电压值
  163. float NTCVoltage=0; //电压值
  164. NTCVoltage=(sum*3300/4096);
  165. VR=NTCVoltage/1000.00;
  166. Rt=10000*VR/(3.3-VR);
  167. temp=1/(1/T0+log(Rt/R)/B)-Ka; //计算温度
  168. return temp;
  169. }
  170. /* USER CODE END 1 */