adc.c 5.2 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. /* USER CODE END ADC1_Init 2 */
  70. }
  71. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  72. {
  73. GPIO_InitTypeDef GPIO_InitStruct = {0};
  74. if(adcHandle->Instance==ADC1)
  75. {
  76. /* USER CODE BEGIN ADC1_MspInit 0 */
  77. /* USER CODE END ADC1_MspInit 0 */
  78. /* ADC1 clock enable */
  79. __HAL_RCC_ADC1_CLK_ENABLE();
  80. __HAL_RCC_GPIOC_CLK_ENABLE();
  81. /**ADC1 GPIO Configuration
  82. PC2 ------> ADC1_IN12
  83. PC3 ------> ADC1_IN13
  84. */
  85. GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  86. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  87. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  88. /* ADC1 DMA Init */
  89. /* ADC1 Init */
  90. hdma_adc1.Instance = DMA1_Channel1;
  91. hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  92. hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  93. hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  94. hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  95. hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  96. hdma_adc1.Init.Mode = DMA_CIRCULAR;
  97. hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
  98. if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  99. {
  100. Error_Handler();
  101. }
  102. __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
  103. /* USER CODE BEGIN ADC1_MspInit 1 */
  104. /* USER CODE END ADC1_MspInit 1 */
  105. }
  106. }
  107. void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
  108. {
  109. if(adcHandle->Instance==ADC1)
  110. {
  111. /* USER CODE BEGIN ADC1_MspDeInit 0 */
  112. /* USER CODE END ADC1_MspDeInit 0 */
  113. /* Peripheral clock disable */
  114. __HAL_RCC_ADC1_CLK_DISABLE();
  115. /**ADC1 GPIO Configuration
  116. PC2 ------> ADC1_IN12
  117. PC3 ------> ADC1_IN13
  118. */
  119. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_2|GPIO_PIN_3);
  120. /* ADC1 DMA DeInit */
  121. HAL_DMA_DeInit(adcHandle->DMA_Handle);
  122. /* USER CODE BEGIN ADC1_MspDeInit 1 */
  123. /* USER CODE END ADC1_MspDeInit 1 */
  124. }
  125. }
  126. /* USER CODE BEGIN 1 */
  127. void ADC_Inner_start(void)
  128. {
  129. HAL_ADC_Stop_DMA(&hadc1);
  130. HAL_Delay(10);
  131. HAL_StatusTypeDef ret;
  132. ret = HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1_Converted_Value, ADC1_CHANNEL_COUNT * ADC_SAMPLING_TIMES);
  133. if(ret)
  134. {
  135. Error_Handler();
  136. }
  137. }
  138. float getADC_Chanel_value(unsigned int ch){
  139. unsigned int max;
  140. unsigned int min;
  141. unsigned int sum;
  142. if(ch < ADC1_CHANNEL_COUNT){
  143. max = ADC1_Converted_Value[0];
  144. min = ADC1_Converted_Value[0];
  145. sum = ADC1_Converted_Value[0];
  146. for(unsigned int i=1;i<ADC_SAMPLING_TIMES;i++){
  147. if(max < ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch])max=ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch];
  148. if(min > ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch])min=ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch];
  149. sum += ADC1_Converted_Value[i*ADC1_CHANNEL_COUNT+ch];
  150. }
  151. }
  152. sum -= min;
  153. sum -= max;
  154. sum = sum/(ADC_SAMPLING_TIMES - 2);
  155. float Rt=0; //NTC电阻
  156. float R=10000; //10K固定阻值电阻
  157. float T0=273.15+25; //转换为开尔文温度
  158. float B=3980; //B值 >50°
  159. float Ka=273.15; //K值
  160. float temp;
  161. float VR=0; //电压值
  162. float NTCVoltage=0; //电压值
  163. NTCVoltage=(sum*3300/4096);
  164. VR=NTCVoltage/1000.00;
  165. Rt=10000*VR/(3.3-VR);
  166. temp=1/(1/T0+log(Rt/R)/B)-Ka; //计算温度
  167. return temp;
  168. }
  169. /* USER CODE END 1 */