找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 852|回复: 1
收起左侧

项目开发中STM32G030 读取 NTC温度 值的启示

[复制链接]
ID:95059 发表于 2023-6-6 12:14 | 显示全部楼层 |阅读模式
本贴拾取项目中部分代码(因项目正在进行中,尚无法完全公开原码,请多多包涵)
以下为功能函数 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各位博友可以自行开发功能。谢谢大家,有问题可以共同交流,欢迎留言!


正常显示室温

正常显示室温

NTC电阻

NTC电阻

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:291668 发表于 2023-6-6 17:11 | 显示全部楼层
又一个读取温度参数的例子。感谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表