解释:电阻阻值的转换
resistance = (float)(10000 * adc_value) / (4096 - adc_value);是根据电压分压原理和ADC的转换公式来的。假设温度传感器和一个10k欧姆的电阻串联,两端接5V电源,那么温度传感器的电阻值和输出电压之间有如下关系:
其中,Vout是输出电压,Rntc是温度传感器的电阻值,Rref是参考电阻的电阻值,Vcc是电源电压。假设Rref=10000Ω,Vcc=5V,那么可以得到:
另一方面,ADC的转换公式是:
其中,adc_value是ADC的转换值,n是ADC的位数,Vref是ADC的参考电压。假设n=12,Vref=5V,那么可以得到:
将上式代入前面的公式,可以得到:
化简后得到:
这就是代码中的公式。为了提高精度,将结果转换为浮点数。
如果Vcc等于3.3v,那么电压分压原理和ADC的转换公式不变,只是Vcc和Vref的值都变为3.3v。那么可以得到:
化简后得到:
解释:电阻值转化为温度值
根据NTC3950 100k 1%温度传感器的特性曲线,可以得到以下公式:
其中,T是温度传感器的绝对温度(开尔文),T0是参考温度(25摄氏度),B是传感器的B值(3950),R是温度传感器的电阻值,R0是参考电阻(100k欧姆)。
接着,将上式变形,得到:
最后,将上式中的各个参数代入,并将绝对温度转换为摄氏温度,得到最终结果。
这个公式是根据NTC温度传感器的特性曲线来的。NTC温度传感器的电阻值和温度之间有一个非线性的对数关系,可以用下面的公式表示
其中,T是绝对温度(开尔文),R是电阻值(欧姆),A、B、C是传感器的特定系数,可以通过实验测量得到。这个公式叫做Steinhart-Hart方程
如果忽略C项,那么可以得到一个简化的公式:
其中,T0是参考温度(一般取25摄氏度),R0是参考电阻(一般取100k欧姆),B是传感器的B值(一般取3950)。这个公式叫做B参数方程
NTC Thermistor - Steinhart and Hart Equation | Ametherm
NTC3950_Temp函数就是用的B参数方程来计算温度值的。
文章转自:https://blog.csdn.net/qq_41422009/article/details/130884309
ADC_data[5] += Get_Adc_Average(ADC_CHANNEL_5,1)*3300/4096;
ntc_R = 50 * (float)ADC_data[5]*0.001 / (5 - (float)ADC_data[5]*0.001); //单位:KΩ
/*热敏电阻(B值:3950)温度对照数组 (-30℃ ~ 240℃) 一行10℃*/
float Thermistor[]={
200.2039, 187.3164, 175.3536, 164.2428, 153.9176, 144.3169, 135.3851, 127.071, 119.3276, 112.112,
105.3847, 99.1093, 93.2524, 87.7834, 82.674, 77.8981, 73.4319, 69.2531, 65.3415, 61.6781,
58.2457, 55.0282, 52.0106, 49.1794, 46.5218, 44.026, 41.6813, 39.4773, 37.4049, 35.4554,
33.6206, 31.8931, 30.266, 28.7328, 27.2875, 25.9246, 24.6387, 23.4251, 22.2793, 21.1971,
20.1746, 19.208, 18.2941, 17.4296, 16.6115, 15.8371, 15.1039, 14.4092, 13.751, 13.127,
12.5353, 11.9741, 11.4415, 10.936, 10.4559, 10, 9.5668, 9.1551, 8.7636, 8.3913,
8.0371, 7.7001, 7.3793, 7.0738, 6.7828, 6.5055, 6.2413, 5.9894, 5.7492, 5.5201,
5.3015, 5.0928, 4.8936, 4.7034, 4.5217, 4.3481, 4.1822, 4.0236, 3.872, 3.7269,
3.5882, 3.4554, 3.3283, 3.2066, 3.0901, 2.9784, 2.8715, 2.769, 2.6707, 2.5765,
2.4862, 2.3995, 2.3163, 2.2365, 2.1599, 2.0864, 2.0157, 1.9479, 1.8827, 1.8201,
1.7598, 1.7019, 1.6463, 1.5927, 1.5412, 1.4917, 1.444, 1.3981, 1.3539, 1.3113,
1.2703, 1.2308, 1.1928, 1.1561, 1.1208, 1.0867, 1.0538, 1.0221, 0.9915, 0.962,
0.9336, 0.9061, 0.8796, 0.854, 0.8292, 0.8054, 0.7823, 0.76, 0.7385, 0.7176,
0.6975, 0.6781, 0.6592, 0.641, 0.6234, 0.6064, 0.5899, 0.574, 0.5586, 0.5436,
0.5291, 0.5151, 0.5016, 0.4884, 0.4757, 0.4633, 0.4514, 0.4398, 0.4285, 0.4177,
0.4071, 0.3968, 0.3869, 0.3773, 0.3679, 0.3588, 0.35, 0.3415, 0.3332, 0.3251,
0.3173, 0.3097, 0.3023, 0.2951, 0.2882, 0.2814, 0.2748, 0.2684, 0.2622, 0.2562,
0.2503, 0.2446, 0.239, 0.2336, 0.2284, 0.2233, 0.2183, 0.2134, 0.2087, 0.2041,
0.1997, 0.1953, 0.1911, 0.187, 0.183, 0.1791, 0.1753, 0.1715, 0.1679, 0.1644,
0.161, 0.1576, 0.1544, 0.1512, 0.1481, 0.1451, 0.1421, 0.1392, 0.1364, 0.1337,
0.131, 0.1284, 0.1259, 0.1234, 0.121, 0.1186, 0.1163, 0.1141, 0.1119, 0.1097,
0.1076, 0.1056, 0.1036, 0.1016, 0.0997, 0.0979, 0.096, 0.0943, 0.0925, 0.0908,
0.0892, 0.0875, 0.086, 0.0844, 0.0829, 0.0814, 0.08, 0.0785, 0.0771, 0.0758,
0.0745, 0.0732, 0.0719, 0.0706, 0.0694, 0.0682, 0.0671, 0.0659, 0.0648, 0.0637,
0.0626, 0.0616, 0.0606, 0.0596, 0.0586, 0.0576, 0.0567, 0.0557, 0.0548, 0.0539,
0.0531, 0.0522, 0.0514, 0.0506, 0.0498, 0.049, 0.0482, 0.0474, 0.0467, 0.046,
0.0453, 0.0446, 0.0439, 0.0432, 0.0425, 0.0419, 0.0413, 0.0406, 0.04, 0.0394,
0.0388
};
temperature = ((recurbinary(Thermistor, ntc_R, 0, 270) - 30)*100 - 100); //单位:100 * ℃