久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 項目開發中STM32G030 讀取 NTC溫度 值的啟示 [打印本頁]

作者: lanxichang    時間: 2023-6-6 12:14
標題: 項目開發中STM32G030 讀取 NTC溫度 值的啟示
本貼拾取項目中部分代碼(因項目正在進行中,尚無法完全公開原碼,請多多包涵)
以下為功能函數 temp.c文件
  1. ///*********************************************************
  2. //Copyright(C), Gao Zhan Optoelectronic Technology Co. LTD       
  3. //Author:             lanxichang                       
  4. //Version :     V0.0                       
  5. //Date :     2023-05-09  17:28:29
  6. //Date :     2023-05-27  09:10:10  
  7. //History :                                             
  8. //**********************************************************/

  9. #include "temp.h"
  10. #include "stm32g0xx_hal.h"
  11. #include "stdbool.h"
  12. #include "math.h"
  13. //#ifdef HAL_ADC_MODULE_ENABLED
  14. extern ADC_HandleTypeDef hadc1;
  15. int ADC_Value;
  16. extern float ADC_gather(void);
  17. #define NUM 30
  18. int        ave_temp1[NUM+1];
  19. uint8_t tableNum;




  20. /***********************************************************************
  21. 備注說明:NTC就是隨溫度變化阻值變化的傳感器,所以在硬件上只要計算出他現在是什么阻值就能得到他的溫度,阻值隨溫度變化對照表
  22. 功  能:查表函數
  23. 參  數:
  24. 返回值:NTCTABNum 查表對應 溫度值  (什么阻值對應什么溫度)-50-125
  25. *************************************************************************/
  26. #define NTCTABNum 100
  27. static float NTCTAB_2[NTCTABNum] = {
  28.         32.6142,30.9966,29.4688,28.0251,26.6606,25.3704,24.1501,22.9955,21.9028,20.8682,//0   -  9
  29.         19.8884,18.9602,18.0806,17.2467,16.4561,15.7061,14.9945,14.3191,13.6779,13.0690,//10  -  19
  30.         12.4905,11.9409,11.4184,10.9217,10.4494,10.0000,9.5724,9.1654,8.7779 ,8.4089 ,//20  -  29
  31.         8.0574 ,7.7225 ,7.4033 ,7.099 ,6.8088 ,6.5321 ,6.268 ,6.016 ,5.7755 ,5.5459 ,                         //30  -  39               
  32.            
  33.         5.3266 ,5.1171 ,4.9169 ,4.7257 ,4.5428 ,4.368 ,4.2008 ,4.0409 ,3.8878 ,3.7414 ,                                //40  -  49               
  34.         3.6012 ,3.467 ,        3.3385 ,3.2154 ,3.0975 ,2.9845 ,2.8762 ,2.7723 ,2.6727 ,2.5772 ,                        //50  -  59               
  35.         2.4856 ,2.3977 ,2.3134 ,2.2324 ,2.1547 ,2.0801 ,2.0084 ,1.9396 ,1.8734 ,1.8098 ,                                        //60  -  69       
  36.         1.7487 ,1.69 ,1.6335 ,1.5792 ,1.5269 ,1.4767 ,1.4283 ,1.3818 ,1.3369 ,1.2938 ,                                                //70  -  79       
  37.         1.2523 ,1.2123 ,1.1737 ,1.1366 ,1.1008 ,1.0663 ,1.0331 ,1.0011 ,0.9702 ,0.9404 ,                                //80  -  89       
  38.         0.9116,0.8839,0.8572,0.8314 ,0.8064,0.7824,0.7592,0.7367,0.7151,0.6942,                                //90  -  99

  39. };






  40. /***********************************************************************
  41. 功  能:Tem_init初始化函數
  42. 參  數:
  43. 返回值:
  44. *************************************************************************/
  45. void Temp_init(void)
  46. {
  47.        
  48.         GetResValue();
  49.        
  50.         GetADCTemperature(&NTCTAB_2[NTCTABNum],tableNum);       
  51.        
  52.         GetMedian_Temperature();
  53.        
  54. }






  55. /***********************************************************************
  56. 功  能:將ADC采到的值轉換成電阻
  57. 參  數:channel:指定的ADC通道
  58. 返回值:res 電阻值
  59. *************************************************************************/
  60. float GetResValue(void)
  61. {
  62.         float         adc_v,res;
  63. //        //ADC_Value=ADC_gather();
  64. //        HAL_ADC_Start(&hadc1); //此開始函數必須放入for,若不是則采集第一次的ADC通道,即PA2
  65. //        HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC_Value, 1);
  66. //        HAL_ADCEx_Calibration_Start(&hadc1);  
  67. //  HAL_ADC_PollForConversion(&hadc1,50);
  68.        
  69.        

  70.         HAL_ADC_Start(&hadc1);

  71.         HAL_ADC_PollForConversion(&hadc1, 50);

  72.         ADC_Value = HAL_ADC_GetValue(&hadc1);
  73.      
  74.         adc_v         = (float)(ADC_Value&0xFFF)/4096*3.3;  //將采集到值轉換成電壓   2^12=4096
  75.          
  76.         res        = 10 /( 4.096/adc_v-1);        //電壓轉換成電阻
  77.        
  78.         return res ;
  79. }

  80. /******************************a*****************************************
  81. 功  能:查表函數
  82. 參  數:1.tableNum :表格的元素的個數  
  83.                 2.*p:表格
  84. 返回值:tem 當前阻值下的溫度值
  85. *************************************************************************/

  86. float GetADCTemperature(float *p,uint8_t tableNum)
  87. {
  88.         uint8_t        i,index        = 0;
  89.         float v1,v2,v3;
  90.         float tem;
  91.         float resdata;
  92.         resdata = GetResValue();  //電阻值,電阻測量函數返回值加載到 resdata
  93.     /*查表*/
  94.         for(i=0;i<(tableNum-1);i++)  
  95.         {
  96.                 if((resdata<p[i]) && (resdata>p[i+1]))
  97.                         index = i;       
  98.         }
  99.         v1         = p[index] - resdata;
  100.         v2         = p[index] - p[index+1];
  101.         v3         = v1/v2;
  102.         tem = v3+index;

  103.         return tem;
  104. }




  105. /***********************************************************************

  106. 功  能:掐頭去尾取平均值
  107. 參  數:無  
  108. 返回值:ave_temp  平均值

  109. *************************************************************************/



  110. float GetMedian_Temperature(void)
  111. {
  112.         int i,j;
  113.         float tmp;
  114.   float  ave_temp;
  115.         float    sum1=0;
  116.         for(i=0;i<NUM;i++)
  117.         {
  118.                 ave_temp1[i] = GetADCTemperature(NTCTAB_2,NTCTABNum);      //將測得的溫度值放大10倍存在int型數組中,方便后面上傳有人云
  119.                 //HAL_Delay(1);
  120.         }

  121.         for(i=0;i<NUM-1;i++)                //排序
  122.         {
  123.                 for(j=0;j<(NUM)-i;j++)
  124.                 {
  125.                         if(ave_temp1[j]<ave_temp1[j+1])
  126.                         {
  127.                                 tmp                         = ave_temp1[j];
  128.                                 ave_temp1[j]         = ave_temp1[j+1];
  129.                                 ave_temp1[j+1]         = tmp;
  130.                         }
  131.                 }
  132.         }

  133.         for(i=5;i<NUM-5;i++)        //掐頭去尾取平均值
  134.         {
  135.                 sum1 += ave_temp1[i];
  136.         }
  137.         ave_temp = sum1/(NUM-10);  //減掉掐頭去尾各5個數,求平均值
  138.        

  139.        
  140.         return ave_temp-9.2;     // 因電阻值取值不一樣,-9.2是為了臨時校正溫度值,后期全面校準才更改表格。
復制代碼
以下為功能函數adc.c文件
  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. /* USER CODE END 0 */

  24. ADC_HandleTypeDef hadc1;

  25. /* ADC1 init function */
  26. void MX_ADC1_Init(void)
  27. {

  28.   /* USER CODE BEGIN ADC1_Init 0 */

  29.   /* USER CODE END ADC1_Init 0 */

  30.   ADC_ChannelConfTypeDef sConfig = {0};

  31.   /* USER CODE BEGIN ADC1_Init 1 */

  32.   /* USER CODE END ADC1_Init 1 */

  33.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  34.   */
  35.   hadc1.Instance = ADC1;
  36.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  37.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  38.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  39.   hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  40.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  41.   hadc1.Init.LowPowerAutoWait = DISABLE;
  42.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
  43.   hadc1.Init.ContinuousConvMode = ENABLE;
  44.   hadc1.Init.NbrOfConversion = 1;
  45.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  46.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  47.   hadc1.Init.DMAContinuousRequests = DISABLE;
  48.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  49.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
  50.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
  51.   hadc1.Init.OversamplingMode = DISABLE;
  52.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
  53.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  54.   {
  55.     Error_Handler();
  56.   }

  57.   /** Configure Regular Channel
  58.   */
  59.   sConfig.Channel = ADC_CHANNEL_11;
  60.   sConfig.Rank = ADC_REGULAR_RANK_1;
  61.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
  62.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  63.   {
  64.     Error_Handler();
  65.   }
  66.   /* USER CODE BEGIN ADC1_Init 2 */

  67.   /* USER CODE END ADC1_Init 2 */

  68. }

  69. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  70. {

  71.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  72.   if(adcHandle->Instance==ADC1)
  73.   {
  74.   /* USER CODE BEGIN ADC1_MspInit 0 */

  75.   /* USER CODE END ADC1_MspInit 0 */
  76.     /* ADC1 clock enable */
  77.     __HAL_RCC_ADC_CLK_ENABLE();

  78.     __HAL_RCC_GPIOB_CLK_ENABLE();
  79.     /**ADC1 GPIO Configuration
  80.     PB10     ------> ADC1_IN11
  81.     */
  82.     GPIO_InitStruct.Pin = GPIO_PIN_10;
  83.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  84.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  85.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  86.   /* USER CODE BEGIN ADC1_MspInit 1 */

  87.   /* USER CODE END ADC1_MspInit 1 */
  88.   }
  89. }

  90. void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
  91. {

  92.   if(adcHandle->Instance==ADC1)
  93.   {
  94.   /* USER CODE BEGIN ADC1_MspDeInit 0 */

  95.   /* USER CODE END ADC1_MspDeInit 0 */
  96.     /* Peripheral clock disable */
  97.     __HAL_RCC_ADC_CLK_DISABLE();

  98.     /**ADC1 GPIO Configuration
  99.     PB10     ------> ADC1_IN11
  100.     */
  101.     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10);

  102.   /* USER CODE BEGIN ADC1_MspDeInit 1 */

  103.   /* USER CODE END ADC1_MspDeInit 1 */
  104.   }
  105. }

  106. /* USER CODE BEGIN 1 */

  107. /* USER CODE END 1 */
復制代碼
電路溫度采集圖片中為3個10K電阻,一個10K_NTC
原代碼150M 太大了也上傳不了,其它DMA及SPI為常規配置,main各位博友可以自行開發功能。謝謝大家,有問題可以共同交流,歡迎留言!


8888.jpg (575.91 KB, 下載次數: 89)

正常顯示室溫

正常顯示室溫

999.jpg (628.97 KB, 下載次數: 80)

NTC電阻

NTC電阻

作者: li64331218    時間: 2023-6-6 17:11
又一個讀取溫度參數的例子。感謝分享!




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一区二区国产精品 | 免费av不卡 | 四虎在线视频 | 三级黄色在线观看 | 视频爱爱免费视频爱爱太爽 | 黄网免费看 | 亚洲91av| 午夜两性 | 91精品在线播放 | 久草视频在线播放 | 欧美精品一二三 | 国产欧美视频在线观看 | av观看免费 | 亚洲免费成人 | 成人看片免费 | 国产黄色在线 | 成人黄色免费视频 | 国产一级在线视频 | 九九九免费视频 | 婷婷四房综合激情五月 | 日韩av一区二区在线观看 | 久久精品视频国产 | 久久精品久久久精品美女 | 精品国产一二三区 | 麻豆精品在线播放 | 免费在线a | 中文字幕99 | 中文字幕在线免费视频 | 欧美色综合网 | 成年人免费观看 | 97色在线| 国产精品久久午夜夜伦鲁鲁 | 亚洲在线免费观看 | 亚洲 欧美 日韩 在线 | 日韩午夜在线观看 | 国产91精品在线观看 | 欧美国产一区二区 | 国产成人综合网 | 国产日韩欧美亚洲 | 四虎精品视频 | 久久亚洲一区二区 |