分享一個NTC熱敏電阻測溫曲線擬合算法!
單片機源程序如下:
- #include "ntc.h"
- #include "stdio.h"
- #include "service.h"
- #include "datastorage.h"
- #include "math.h"
- #include "adc.h"
- #include "Battery.h"
- float ResCalibValue = 0.0;//校準后的電阻值
- float Value_Res = 0.0;//電阻值,單位為KΩ
- float const R[]= //NTC碼表
- {
- 177.00,166.40,156.60,147.20,138.50,130.40,122.90,115.80,109.10,102.90,
- 97.120,91.660,86.540,81.720,77.220,72.980,69.000,65.260,61.760,58.460,
- 55.340,52.420,49.660,47.080,44.640,42.340,40.160,38.120,36.200,34.380,
- 32.660,31.040,29.500,28.060,26.680,25.400,24.180,23.020,21.920,20.880,
- 19.900,18.970,18.290,17.260,16.460,15.710,15.000,14.320,13.680,13.070,
- 12.490,11.940,11.420,10.920,10.450,10.000,9.574, 9.166, 8.778, 8.480,
- 8.058, 7.724, 7.404, 7.098, 6.808, 6.532, 6.268, 6.015, 5.776, 5.546,
- 5.326, 5.118, 4.918, 4.726, 4.544, 4.368, 4.202, 4.042, 3.888, 3.742,
- 3.602, 3.468, 3.340, 3.216, 3.098, 2.986, 2.878, 2.774, 2.674, 2.580,
- 2.488, 2.400, 2.316, 2.234, 2.158, 2.082, 2.012, 1.942, 1.876, 1.813,
- 1.751, 1.693, 1.637, 1.582, 1.530, 1.480, 1.432, 1.385, 1.341, 1.298,
- 1.256, 1.216, 1.178, 1.141, 1.105, 1.071, 1.038, 1.006, 0.975, 0.945,
- 0.916, 0.888, 0.862, 0.836, 0.811, 0.787, 0.764, 0.741, 0.720, 0.699,
- 0.679, 0.659, 0.640, 0.622, 0.605, 0.588, 0.571, 0.556, 0.540, 0.525,
- 0.511, 0.497, 0.483, 0.470, 0.457, 0.445, 0.433, 0.422, 0.411, 0.400,
- 0.389, 0.379, 0.369, 0.360, 0.351, 0.342, 0.333, 0.324, 0.316, 0.308,
- 0.300, 0.293, 0.286
- };
- //***********************************************
- //函數功能:求電阻值函數
- //入口參數:無
- //出口參數:無
- //備 注:
- //************************************************
- void ResCalculate(void)
- {
- u16 i;
- u32 ResSumCode = 0;
- float AverageCode = 0;
- for(i=0;i<2000;i++)
- ResSumCode=ResSumCode+ADC_Buff[i][2];
- AverageCode = ResSumCode/2000.0;
- if(AverageCode < 4095.0) //防止死機
- Value_Res = 15.0*AverageCode/(4095.0-AverageCode); //換算電阻值,限流電阻15K
- else
- Value_Res = 260.0;
- if(Value_Res>260.0)
- Value_Res = 260.0;
- }
- //***********************************************
- //函數功能:求溫度值函數
- //入口參數:無
- //出口參數:無
- //備 注:
- //************************************************
- void TempCalculate(void)
- {
- float TempValue,NTC_add;
- ResCalculate();//求電阻值函數
-
- if(SysData.Flag_Adj == 0xAA55)//校準調試模式
- ResCalibValue = Value_Res;
- else
- ResCalibValue = ( Value_Res - SysData.ResZero/1000.0) * SysData.ResGain/1000.0;//電阻值零點和增益補償
- if(ResCalibValue < 0.0)ResCalibValue = 0.0;
- SysData.ResValue = (u32)(ResCalibValue * 100); //電阻值,歐姆
-
- if(ResCalibValue >250.0)//斷線
- {
- TempValue= -30.0;//斷線上報最小溫度
- }
- else if(ResCalibValue < 2.4)//短路,測溫范圍-30~60℃
- {
- TempValue= 60.0;//斷線上報最大溫度
- }
- else
- {
- if((ResCalibValue>R[2])&&(ResCalibValue<=R[0])) //溫度修正
- NTC_add = 2.1;
- else if((ResCalibValue>R[4])&&(ResCalibValue<=R[2]))
- NTC_add = 2.0;
- else if((ResCalibValue>R[6])&&(ResCalibValue<=R[4]))
- NTC_add = 1.9;
- else if((ResCalibValue>R[8])&&(ResCalibValue<=R[6]))
- NTC_add = 1.8;
- else if((ResCalibValue>R[10])&&(ResCalibValue<=R[8]))
- NTC_add = 1.7;
- else if((ResCalibValue>R[12])&&(ResCalibValue<=R[10]))
- NTC_add = 1.6;
- else if((ResCalibValue>R[14])&&(ResCalibValue<=R[12]))
- NTC_add = 1.5;
- else if((ResCalibValue>R[16])&&(ResCalibValue<=R[14]))
- NTC_add = 1.4;
- else if((ResCalibValue>R[18])&&(ResCalibValue<=R[16]))
- NTC_add = 1.3;
- else if((ResCalibValue>R[20])&&(ResCalibValue<=R[18]))
- NTC_add = 1.2;
- else if((ResCalibValue>R[22])&&(ResCalibValue<=R[20]))
- NTC_add = 1.1;
- else if((ResCalibValue>R[24])&&(ResCalibValue<=R[22]))
- NTC_add = 1.0;
- else if((ResCalibValue>R[26])&&(ResCalibValue<=R[24]))
- NTC_add = 0.9;
- else if((ResCalibValue>R[28])&&(ResCalibValue<=R[26]))
- NTC_add = 0.8;
- else if((ResCalibValue>R[31])&&(ResCalibValue<=R[28]))
- NTC_add = 0.7;
- else if((ResCalibValue>R[35])&&(ResCalibValue<=R[31]))
- NTC_add = 0.6;
- else if((ResCalibValue>R[39])&&(ResCalibValue<=R[35]))
- NTC_add = 0.5;
- else if((ResCalibValue>R[42])&&(ResCalibValue<=R[39]))
- NTC_add = 0.4;
- else if((ResCalibValue>R[48])&&(ResCalibValue<=R[42]))
- NTC_add = 0.2;
- else if((ResCalibValue>R[52])&&(ResCalibValue<=R[48]))
- NTC_add = 0.1;
- else if((ResCalibValue>R[59])&&(ResCalibValue<=R[52]))
- NTC_add = 0.0;
- else if((ResCalibValue>R[109])&&(ResCalibValue<=R[59]))
- NTC_add = -0.2;
- else if((ResCalibValue>R[115])&&(ResCalibValue<=R[109]))
- NTC_add = -0.1;
- else if((ResCalibValue>R[120])&&(ResCalibValue<=R[115]))
- NTC_add = 0.0;
- else if((ResCalibValue>R[124])&&(ResCalibValue<=R[120]))
- NTC_add = 0.1;
- else if((ResCalibValue>R[129])&&(ResCalibValue<=R[124]))
- NTC_add = 0.2;
- else if((ResCalibValue>R[132])&&(ResCalibValue<=R[129]))
- NTC_add = 0.3;
- else if((ResCalibValue>R[137])&&(ResCalibValue<=R[132]))
- NTC_add = 0.4;
- else if((ResCalibValue>R[141])&&(ResCalibValue<=R[137]))
- NTC_add = 0.5;
- else if((ResCalibValue>R[144])&&(ResCalibValue<=R[141]))
- NTC_add = 0.6;
- else if((ResCalibValue>R[147])&&(ResCalibValue<=R[144]))
- NTC_add = 0.7;
- else if((ResCalibValue>R[150])&&(ResCalibValue<=R[147]))
- NTC_add = 0.8;
- else if((ResCalibValue>R[153])&&(ResCalibValue<=R[150]))
- NTC_add = 0.9;
- else if((ResCalibValue>R[156])&&(ResCalibValue<=R[153]))
- NTC_add = 1.0;
- else if((ResCalibValue>R[158])&&(ResCalibValue<=R[156]))
- NTC_add = 1.1;
- else if((ResCalibValue>R[160])&&(ResCalibValue<=R[158]))
- NTC_add = 1.2;
- else if((ResCalibValue>R[162])&&(ResCalibValue<=R[160]))
- NTC_add = 1.3;
-
- TempValue = B*logexp*T25/(T25*log10(ResCalibValue)+B*logexp-T25)-T0-NTC_add; //溫度換算
- }
- UserData.Temp = TempValue;//換算成0.1℃的整形
- SysData.fTemperValue = 100*TempValue ;
- }
復制代碼
所有資料51hei提供下載:
NTC測溫算法.rar
(2.13 KB, 下載次數: 200)
2018-4-12 21:02 上傳
點擊文件名下載附件
|