找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8792|回复: 8
打印 上一主题 下一主题
收起左侧

单片机NTC测温曲线拟合算法源码

  [复制链接]
跳转到指定楼层
楼主
分享一个NTC热敏电阻测温曲线拟合算法!

单片机源程序如下:
  1. #include "ntc.h"
  2. #include "stdio.h"
  3. #include "service.h"
  4. #include "datastorage.h"
  5. #include "math.h"
  6. #include "adc.h"
  7. #include "Battery.h"

  8. float        ResCalibValue = 0.0;//校准后的电阻值
  9. float        Value_Res = 0.0;//电阻值,单位为KΩ

  10. float const R[]=                                                                 //NTC码表
  11. {
  12.         177.00,166.40,156.60,147.20,138.50,130.40,122.90,115.80,109.10,102.90,
  13.         97.120,91.660,86.540,81.720,77.220,72.980,69.000,65.260,61.760,58.460,
  14.         55.340,52.420,49.660,47.080,44.640,42.340,40.160,38.120,36.200,34.380,
  15.         32.660,31.040,29.500,28.060,26.680,25.400,24.180,23.020,21.920,20.880,
  16.         19.900,18.970,18.290,17.260,16.460,15.710,15.000,14.320,13.680,13.070,
  17.         12.490,11.940,11.420,10.920,10.450,10.000,9.574, 9.166, 8.778, 8.480,
  18.         8.058, 7.724, 7.404, 7.098, 6.808, 6.532, 6.268, 6.015, 5.776, 5.546,
  19.         5.326, 5.118, 4.918, 4.726, 4.544, 4.368, 4.202, 4.042, 3.888, 3.742,
  20.         3.602, 3.468, 3.340, 3.216, 3.098, 2.986, 2.878, 2.774, 2.674, 2.580,
  21.         2.488, 2.400, 2.316, 2.234, 2.158, 2.082, 2.012, 1.942, 1.876, 1.813,
  22.         1.751, 1.693, 1.637, 1.582, 1.530, 1.480, 1.432, 1.385, 1.341, 1.298,
  23.         1.256, 1.216, 1.178, 1.141, 1.105, 1.071, 1.038, 1.006, 0.975, 0.945,
  24.         0.916, 0.888, 0.862, 0.836, 0.811, 0.787, 0.764, 0.741, 0.720, 0.699,
  25.         0.679, 0.659, 0.640, 0.622, 0.605, 0.588, 0.571, 0.556, 0.540, 0.525,
  26.         0.511, 0.497, 0.483, 0.470, 0.457, 0.445, 0.433, 0.422, 0.411, 0.400,
  27.         0.389, 0.379, 0.369, 0.360, 0.351, 0.342, 0.333, 0.324, 0.316, 0.308,
  28.         0.300, 0.293, 0.286
  29. };

  30. //***********************************************
  31. //函数功能:求电阻值函数
  32. //入口参数:无
  33. //出口参数:无
  34. //备    注:
  35. //************************************************
  36. void ResCalculate(void)
  37. {
  38.         u16                 i;
  39.         u32                ResSumCode = 0;
  40.         float        AverageCode = 0;

  41.         for(i=0;i<2000;i++)
  42.                 ResSumCode=ResSumCode+ADC_Buff[i][2];

  43.         AverageCode = ResSumCode/2000.0;

  44.         if(AverageCode < 4095.0) //防止死机
  45.                 Value_Res = 15.0*AverageCode/(4095.0-AverageCode);           //换算电阻值,限流电阻15K       
  46.         else
  47.                 Value_Res = 260.0;       
  48.         if(Value_Res>260.0)
  49.                 Value_Res = 260.0;         
  50. }         
  51. //***********************************************
  52. //函数功能:求温度值函数
  53. //入口参数:无
  54. //出口参数:无
  55. //备    注:
  56. //************************************************
  57. void TempCalculate(void)
  58. {
  59.         float        TempValue,NTC_add;

  60.         ResCalculate();//求电阻值函数       
  61.        
  62.         if(SysData.Flag_Adj == 0xAA55)//校准调试模式
  63.                 ResCalibValue = Value_Res;
  64.         else
  65.                 ResCalibValue = ( Value_Res - SysData.ResZero/1000.0) * SysData.ResGain/1000.0;//电阻值零点和增益补偿

  66.         if(ResCalibValue < 0.0)ResCalibValue = 0.0;
  67.         SysData.ResValue = (u32)(ResCalibValue * 100); //电阻值,欧姆

  68.        
  69.         if(ResCalibValue >250.0)//断线
  70.         {
  71.                 TempValue= -30.0;//断线上报最小温度
  72.         }
  73.         else if(ResCalibValue < 2.4)//短路,测温范围-30~60℃
  74.         {
  75.                 TempValue= 60.0;//断线上报最大温度
  76.         }
  77.         else
  78.         {
  79.                 if((ResCalibValue>R[2])&&(ResCalibValue<=R[0])) //温度修正
  80.                         NTC_add = 2.1;
  81.                 else if((ResCalibValue>R[4])&&(ResCalibValue<=R[2]))        
  82.                         NTC_add = 2.0;                                                                          
  83.                 else if((ResCalibValue>R[6])&&(ResCalibValue<=R[4]))                         
  84.                         NTC_add = 1.9;                                                                          
  85.                 else if((ResCalibValue>R[8])&&(ResCalibValue<=R[6]))                       
  86.                         NTC_add = 1.8;                                                               
  87.                 else if((ResCalibValue>R[10])&&(ResCalibValue<=R[8]))                         
  88.                         NTC_add = 1.7;                                                                 
  89.                 else if((ResCalibValue>R[12])&&(ResCalibValue<=R[10]))                       
  90.                         NTC_add = 1.6;                         
  91.                 else if((ResCalibValue>R[14])&&(ResCalibValue<=R[12]))                       
  92.                         NTC_add = 1.5;                                                         
  93.                 else if((ResCalibValue>R[16])&&(ResCalibValue<=R[14]))                        
  94.                         NTC_add = 1.4;                                                                                                                                 
  95.                 else if((ResCalibValue>R[18])&&(ResCalibValue<=R[16]))               
  96.                         NTC_add = 1.3;                                                                       
  97.                 else if((ResCalibValue>R[20])&&(ResCalibValue<=R[18]))                       
  98.                         NTC_add = 1.2;                                                                 
  99.                 else if((ResCalibValue>R[22])&&(ResCalibValue<=R[20]))                       
  100.                         NTC_add = 1.1;                                               
  101.                 else if((ResCalibValue>R[24])&&(ResCalibValue<=R[22]))               
  102.                         NTC_add = 1.0;                                
  103.                 else if((ResCalibValue>R[26])&&(ResCalibValue<=R[24]))               
  104.                         NTC_add = 0.9;                                       
  105.                 else if((ResCalibValue>R[28])&&(ResCalibValue<=R[26]))                        
  106.                         NTC_add = 0.8;                 
  107.                 else if((ResCalibValue>R[31])&&(ResCalibValue<=R[28]))                       
  108.                         NTC_add = 0.7;                          
  109.                 else if((ResCalibValue>R[35])&&(ResCalibValue<=R[31]))               
  110.                         NTC_add = 0.6;                               
  111.                 else if((ResCalibValue>R[39])&&(ResCalibValue<=R[35]))                       
  112.                         NTC_add = 0.5;                                         
  113.                 else if((ResCalibValue>R[42])&&(ResCalibValue<=R[39]))               
  114.                         NTC_add = 0.4;                               
  115.                 else if((ResCalibValue>R[48])&&(ResCalibValue<=R[42]))               
  116.                         NTC_add = 0.2;                                 
  117.                 else if((ResCalibValue>R[52])&&(ResCalibValue<=R[48]))               
  118.                         NTC_add = 0.1;                                  
  119.                 else if((ResCalibValue>R[59])&&(ResCalibValue<=R[52]))               
  120.                         NTC_add = 0.0;                                  
  121.                 else if((ResCalibValue>R[109])&&(ResCalibValue<=R[59]))                       
  122.                         NTC_add = -0.2;                                 
  123.                 else if((ResCalibValue>R[115])&&(ResCalibValue<=R[109]))               
  124.                         NTC_add = -0.1;                                               
  125.                 else if((ResCalibValue>R[120])&&(ResCalibValue<=R[115]))               
  126.                         NTC_add = 0.0;                                
  127.                 else if((ResCalibValue>R[124])&&(ResCalibValue<=R[120]))               
  128.                         NTC_add = 0.1;                       
  129.                 else if((ResCalibValue>R[129])&&(ResCalibValue<=R[124]))               
  130.                         NTC_add = 0.2;                       
  131.                 else if((ResCalibValue>R[132])&&(ResCalibValue<=R[129]))               
  132.                         NTC_add = 0.3;                               
  133.                 else if((ResCalibValue>R[137])&&(ResCalibValue<=R[132]))               
  134.                         NTC_add = 0.4;                                  
  135.                 else if((ResCalibValue>R[141])&&(ResCalibValue<=R[137]))               
  136.                         NTC_add = 0.5;                                                         
  137.                 else if((ResCalibValue>R[144])&&(ResCalibValue<=R[141]))               
  138.                         NTC_add = 0.6;                                                                 
  139.                 else if((ResCalibValue>R[147])&&(ResCalibValue<=R[144]))               
  140.                         NTC_add = 0.7;                                                
  141.                 else if((ResCalibValue>R[150])&&(ResCalibValue<=R[147]))               
  142.                         NTC_add = 0.8;                                                                
  143.                 else if((ResCalibValue>R[153])&&(ResCalibValue<=R[150]))               
  144.                         NTC_add = 0.9;                                               
  145.                 else if((ResCalibValue>R[156])&&(ResCalibValue<=R[153]))               
  146.                         NTC_add = 1.0;                                                          
  147.                 else if((ResCalibValue>R[158])&&(ResCalibValue<=R[156]))               
  148.                         NTC_add = 1.1;                                                  
  149.                 else if((ResCalibValue>R[160])&&(ResCalibValue<=R[158]))               
  150.                         NTC_add = 1.2;                                                
  151.                 else if((ResCalibValue>R[162])&&(ResCalibValue<=R[160]))               
  152.                         NTC_add = 1.3;
  153.                
  154.                 TempValue = B*logexp*T25/(T25*log10(ResCalibValue)+B*logexp-T25)-T0-NTC_add;          //温度换算                                    
  155.         }
  156.         UserData.Temp = TempValue;//换算成0.1℃的整形
  157.         SysData.fTemperValue = 100*TempValue ;
  158. }          
复制代码



所有资料51hei提供下载:
NTC测温算法.rar (2.13 KB, 下载次数: 195)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:388074 发表于 2018-8-22 14:52 | 只看该作者
NTC热敏电阻测温曲线拟合算法
回复

使用道具 举报

板凳
ID:15104 发表于 2018-8-22 16:13 | 只看该作者
谢谢大神分享!!!
回复

使用道具 举报

地板
ID:395399 发表于 2018-9-8 16:42 | 只看该作者
很好 下载试试
回复

使用道具 举报

5#
ID:395399 发表于 2018-9-8 16:42 | 只看该作者
很好 需下载 看看 效果如何
回复

使用道具 举报

6#
ID:403859 发表于 2018-9-29 00:22 | 只看该作者
谢谢,有线路原理试试吗。
回复

使用道具 举报

7#
ID:403859 发表于 2018-9-29 00:25 | 只看该作者
谢谢,有线路原理试试吗。NTC非线性按公式直接计数误差大,离散也大。
回复

使用道具 举报

8#
ID:483837 发表于 2019-3-13 20:03 | 只看该作者
没有效果图吗
回复

使用道具 举报

9#
ID:50527 发表于 2019-6-28 16:57 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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