adc.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  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) 2023 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. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "adc.h"
  22. /* USER CODE BEGIN 0 */
  23. float CalculateTemperature(uint16_t adc_value, float vref);
  24. /* USER CODE END 0 */
  25. ADC_HandleTypeDef hadc1;
  26. DMA_HandleTypeDef hdma_adc1;
  27. /* ADC1 init function */
  28. void MX_ADC1_Init(void)
  29. {
  30. /* USER CODE BEGIN ADC1_Init 0 */
  31. /* USER CODE END ADC1_Init 0 */
  32. ADC_ChannelConfTypeDef sConfig = {0};
  33. /* USER CODE BEGIN ADC1_Init 1 */
  34. /* USER CODE END ADC1_Init 1 */
  35. /** Common config
  36. */
  37. hadc1.Instance = ADC1;
  38. hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  39. hadc1.Init.ContinuousConvMode = DISABLE;
  40. hadc1.Init.DiscontinuousConvMode = ENABLE;
  41. hadc1.Init.NbrOfDiscConversion = 1;
  42. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  43. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  44. hadc1.Init.NbrOfConversion = 3;
  45. if (HAL_ADC_Init(&hadc1) != HAL_OK)
  46. {
  47. Error_Handler();
  48. }
  49. /** Configure Regular Channel
  50. */
  51. sConfig.Channel = ADC_CHANNEL_10;
  52. sConfig.Rank = ADC_REGULAR_RANK_1;
  53. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  54. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  55. {
  56. Error_Handler();
  57. }
  58. /** Configure Regular Channel
  59. */
  60. sConfig.Channel = ADC_CHANNEL_11;
  61. sConfig.Rank = ADC_REGULAR_RANK_2;
  62. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  63. {
  64. Error_Handler();
  65. }
  66. /** Configure Regular Channel
  67. */
  68. sConfig.Channel = ADC_CHANNEL_12;
  69. sConfig.Rank = ADC_REGULAR_RANK_3;
  70. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  71. {
  72. Error_Handler();
  73. }
  74. /* USER CODE BEGIN ADC1_Init 2 */
  75. /* USER CODE END ADC1_Init 2 */
  76. }
  77. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  78. {
  79. GPIO_InitTypeDef GPIO_InitStruct = {0};
  80. if(adcHandle->Instance==ADC1)
  81. {
  82. /* USER CODE BEGIN ADC1_MspInit 0 */
  83. /* USER CODE END ADC1_MspInit 0 */
  84. /* ADC1 clock enable */
  85. __HAL_RCC_ADC1_CLK_ENABLE();
  86. __HAL_RCC_GPIOC_CLK_ENABLE();
  87. /**ADC1 GPIO Configuration
  88. PC0 ------> ADC1_IN10
  89. PC1 ------> ADC1_IN11
  90. PC2 ------> ADC1_IN12
  91. */
  92. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  93. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  94. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  95. /* ADC1 DMA Init */
  96. /* ADC1 Init */
  97. hdma_adc1.Instance = DMA1_Channel1;
  98. hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  99. hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  100. hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  101. hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  102. hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  103. hdma_adc1.Init.Mode = DMA_CIRCULAR;
  104. hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
  105. if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  106. {
  107. Error_Handler();
  108. }
  109. __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
  110. /* ADC1 interrupt Init */
  111. HAL_NVIC_SetPriority(ADC1_2_IRQn, 5, 0);
  112. HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
  113. /* USER CODE BEGIN ADC1_MspInit 1 */
  114. /* USER CODE END ADC1_MspInit 1 */
  115. }
  116. }
  117. void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
  118. {
  119. if(adcHandle->Instance==ADC1)
  120. {
  121. /* USER CODE BEGIN ADC1_MspDeInit 0 */
  122. /* USER CODE END ADC1_MspDeInit 0 */
  123. /* Peripheral clock disable */
  124. __HAL_RCC_ADC1_CLK_DISABLE();
  125. /**ADC1 GPIO Configuration
  126. PC0 ------> ADC1_IN10
  127. PC1 ------> ADC1_IN11
  128. PC2 ------> ADC1_IN12
  129. */
  130. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
  131. /* ADC1 DMA DeInit */
  132. HAL_DMA_DeInit(adcHandle->DMA_Handle);
  133. /* ADC1 interrupt Deinit */
  134. HAL_NVIC_DisableIRQ(ADC1_2_IRQn);
  135. /* USER CODE BEGIN ADC1_MspDeInit 1 */
  136. /* USER CODE END ADC1_MspDeInit 1 */
  137. }
  138. }
  139. /* USER CODE BEGIN 1 */
  140. uint8_t adc1_byte1 = 0;
  141. uint8_t adc2_byte1 = 0; // 定义一个字节变量用于存储转换结果
  142. uint8_t adc3_byte1 = 0;
  143. uint8_t adc1_byte2 = 0;
  144. uint8_t adc2_byte2 = 0; // 定义一个字节变量用于存储转换结果
  145. uint8_t adc3_byte2 = 0;
  146. uint16_t Value_old_addr2;
  147. uint16_t Value_old_addr3;
  148. uint16_t adc1_filtered = 0;
  149. uint16_t adc2_filtered = 0;
  150. uint16_t adc3_filtered = 0;
  151. uint16_t adc1_raw_buffer[FILTER_LENGTH] = {0};
  152. uint16_t adc2_raw_buffer[FILTER_LENGTH] = {0};
  153. uint16_t adc3_raw_buffer[FILTER_LENGTH] = {0};
  154. uint8_t adc1_raw_buffer_index = 0;
  155. uint8_t adc2_raw_buffer_index = 0;
  156. uint8_t adc3_raw_buffer_index = 0;
  157. uint16_t adc2_rawValue = 0;
  158. uint16_t adc3_rawValue = 0;
  159. void AdcCalibration_init(void)
  160. {
  161. Value_old_addr2 = read_flash_16(ADDR_FLASH_PAGE_124);
  162. Value_old_addr3 = read_flash_16(ADDR_FLASH_PAGE_134);
  163. Adc2_CalibrationValue = Value_old_addr2 != 0xFFFF ? Value_old_addr2 : Adc2_CalibrationValue;
  164. Adc3_CalibrationValue = Value_old_addr3 != 0xFFFF ? Value_old_addr3 : Adc3_CalibrationValue;
  165. Adc2_CalibrationValue &= 0x7FFF;
  166. Adc3_CalibrationValue &= 0x7FFF;
  167. }
  168. void ApplyFilter(uint16_t raw_data, uint16_t* filtered_data, uint16_t* raw_data_buffer, uint8_t* buffer_index)
  169. {
  170. raw_data_buffer[*buffer_index] = raw_data;
  171. uint32_t sum = 0;
  172. for (uint8_t i = 0; i < FILTER_LENGTH; i++) {
  173. sum += raw_data_buffer[i];
  174. }
  175. *filtered_data = (uint16_t)(sum / FILTER_LENGTH);
  176. *buffer_index = (*buffer_index + 1) % FILTER_LENGTH; //指向最旧的
  177. }
  178. //#define R_NOMINAL 10000.0f // 注册时NTC热敏电阻的阻值
  179. //#define T_NOMINAL 298.15f // 注册时NTC热敏电阻的温度值,转化为开尔文温标
  180. //#define B_FACTOR 3950.0f // NTC热敏电阻的B参数
  181. //float CalculateTemperature(uint16_t adc_value, float vref)
  182. //{
  183. // float voltage = adc_value * vref / 4096.0f; // 根据ADC值计算输入电压
  184. // float resistance = R_NOMINAL * (voltage / (vref - voltage)); // 根据电压计算NTC热敏电阻阻值
  185. //
  186. // float steinhart = log(resistance / R_NOMINAL) / B_FACTOR + 1.0f / T_NOMINAL; // 根据瑞利恒式计算温度
  187. // float temperature = 1.0f / steinhart - 273.15f; // 转换为摄氏温度
  188. // return temperature;
  189. //}
  190. float array1[] = {-40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30,
  191. -29, -28, -27, -26, -25, -24, -23, -22, -21, -20,
  192. -19, -18, -17, -16, -15, -14, -13, -12, -11, -10,
  193. -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3,
  194. 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  195. 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
  196. 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  197. 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
  198. 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
  199. 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
  200. 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
  201. 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
  202. 101, 102, 103, 104, 105};
  203. float array2[] = {340.9281f, 318.8772f, 298.3978f, 279.3683f, 261.6769f,
  204. 245.2212f, 229.9072f, 215.6488f, 202.3666f, 189.9878f,
  205. 178.4456f, 167.6783f, 157.6292f, 148.2460f, 139.4807f,
  206. 131.2888f, 123.6294f, 116.4648f, 109.7600f, 103.4829f,
  207. 97.6037f, 92.0947f, 86.9305f, 82.0877f, 77.5442f, 73.2798f,
  208. 69.2759f, 65.5149f, 61.9809f, 58.6587f, 55.5345f, 52.5954f,
  209. 49.8294f, 47.2253f, 44.7727f, 42.4620f, 40.2841f, 38.2307f,
  210. 36.2940f, 34.4668f, 32.7421f, 31.1138f, 29.5759f, 28.1229f,
  211. 26.7496f, 25.4513f, 24.2234f, 23.0618f, 21.9625f, 20.9218f,
  212. 19.9364f, 19.0029f, 18.1184f, 17.2800f, 16.4852f, 15.7313f,
  213. 15.0161f, 14.3375f, 13.6932f, 13.0815f, 12.5005f, 11.9485f,
  214. 11.4239f, 10.9252f, 10.4510f, 10.0000f, 9.5709f, 9.1626f,
  215. 8.7738f, 8.4037f, 8.0512f, 7.7154f, 7.3954f, 7.0904f, 6.7996f,
  216. 6.5223f, 6.2577f, 6.0053f, 5.7645f, 5.5345f, 5.3150f, 5.1053f,
  217. 4.9050f, 4.7136f, 4.5307f, 4.3558f, 4.1887f, 4.0287f, 3.8758f,
  218. 3.7294f, 3.5893f, 3.4553f, 3.3269f, 3.2039f, 3.0862f, 2.9733f,
  219. 2.8652f, 2.7616f, 2.6622f, 2.5669f, 2.4755f, 2.3879f, 2.3038f,
  220. 2.2231f, 2.1456f, 2.0712f, 1.9998f, 1.9312f, 1.8653f, 1.8019f,
  221. 1.7411f, 1.6826f, 1.6264f, 1.5723f, 1.5203f, 1.4703f, 1.4222f,
  222. 1.3759f, 1.3313f, 1.2884f, 1.2471f, 1.2073f, 1.1690f, 1.1321f,
  223. 1.0965f, 1.0623f, 1.0293f, 0.9974f, 0.9667f, 0.9372f, 0.9086f,
  224. 0.8811f, 0.8545f, 0.8289f, 0.8042f, 0.7803f, 0.7572f, 0.7350f,
  225. 0.7135f, 0.6927f, 0.6727f, 0.6533f, 0.6346f, 0.6165f, 0.5990f,
  226. 0.5821f};
  227. float resArr[10];
  228. float tempArr[10];
  229. uint16_t temperature1 = 0;
  230. uint8_t temp = 0;
  231. void findIndexAndTemp(float resistance, float array1[], float array2[], int index2, int index1){
  232. float resRange = (array2[index2] - array2[index2+1]) / 10.0f;
  233. for(int i=0; i<10; i++){
  234. resArr[i] = array2[index2+1] + i * resRange;
  235. }
  236. int index = -1;
  237. float minDiff = 1000.0f;
  238. for(int i=0; i<10; i++){
  239. float diff = fabs(resistance - resArr[i]);
  240. if(diff < minDiff){
  241. minDiff = diff;
  242. index = i;
  243. }
  244. }
  245. for(int i = 0; i < 10; i++){
  246. tempArr[i] = array1[index1] + i * 0.1;
  247. }
  248. temperature1 = tempArr[index];
  249. if( resArr[index] < 0){
  250. temp = fabs(tempArr[index]);
  251. temperature1 = temp | 0x8000;
  252. }
  253. temperature1 *=10;
  254. }
  255. #define R_NOMINAL 10.0f // 注册时NTC热敏电阻的阻值
  256. #define T_NOMINAL 298.15f // 注册时NTC热敏电阻的温度值,转化为开尔文温标
  257. #define B_FACTOR 3950.0f // NTC热敏电阻的B参数
  258. float CalculateTemperature(uint16_t adc_value, float vref)
  259. {
  260. float voltage = adc_value * vref / 4096.0f; // 根据ADC值计算输入电压
  261. float resistance = R_NOMINAL * (voltage / (vref - voltage)); // 根据电压计算NTC热敏电阻阻值
  262. // printf("%.3f\n",resistance);
  263. // HAL_Delay(500);
  264. // printf("%.4f\n",array2[0]);
  265. // printf("%.4f\n",array2[0]);
  266. for (int i = 0; i < sizeof(array2) - 1; i++) {
  267. if (resistance >= array2[i+1] && resistance < array2[i]) {
  268. findIndexAndTemp(resistance, array1, array2, i, i);
  269. break;
  270. }
  271. }
  272. // printf("%.3u\n",temperature1);//十进制
  273. // printf("%4x\n",temperature1);//十六进制
  274. return temperature1;
  275. }
  276. void GetADCResults(ADC_HandleTypeDef* hadc)
  277. {
  278. HAL_ADC_Start(&hadc1);
  279. HAL_ADC_PollForConversion(&hadc1, 100);
  280. uint16_t adc1_raw = HAL_ADC_GetValue(&hadc1);
  281. uint16_t temperature = CalculateTemperature(adc1_raw, 3.3);
  282. ApplyFilter((uint16_t)temperature, &adc1_filtered, adc1_raw_buffer, &adc1_raw_buffer_index);
  283. HAL_ADC_Start(&hadc1);
  284. HAL_ADC_PollForConversion(&hadc1, 100);
  285. uint16_t adc2_raw = HAL_ADC_GetValue(&hadc1);
  286. adc2_rawValue = adc2_raw;
  287. if (adc2_raw != 0) {
  288. adc2_raw += (Value_old_addr2 & 0x8000) ? Adc2_CalibrationValue : -Adc2_CalibrationValue;
  289. }
  290. ApplyFilter(adc2_raw, &adc2_filtered, adc2_raw_buffer, &adc2_raw_buffer_index);
  291. HAL_ADC_Start(&hadc1);
  292. HAL_ADC_PollForConversion(&hadc1, 100);
  293. uint16_t adc3_raw = HAL_ADC_GetValue(&hadc1);
  294. adc3_rawValue = adc3_raw;
  295. if (adc3_raw != 0) {
  296. adc3_raw += (Value_old_addr3 & 0x8000) ? Adc3_CalibrationValue : -Adc3_CalibrationValue;
  297. }
  298. ApplyFilter(adc3_raw, &adc3_filtered, adc3_raw_buffer, &adc3_raw_buffer_index);
  299. adc1_byte1 = (uint8_t)(adc1_filtered >> 8);
  300. adc1_byte2 = (uint8_t)(adc1_filtered);
  301. adc2_byte1 = (uint8_t)(adc2_filtered >> 8);
  302. adc2_byte2 = (uint8_t)(adc2_filtered);
  303. adc3_byte1 = (uint8_t)(adc3_filtered >> 8);
  304. adc3_byte2 = (uint8_t)(adc3_filtered);
  305. }
  306. /* USER CODE END 1 */