目录
电路图:
代码:输入adc采样值,返回温度值
float NTC3950_Temp(uint16_t adc_value)
{
float resistance; // 电阻值
float temp; // 温度值
resistance = (float)(100000 * adc_value) / (4096 - adc_value); // 根据电压分压原理计算电阻值
temp = log(resistance / 100000); // 计算电阻值对数
temp /= 3950; // 计算B值分数项
temp += 1.0 / (25 + 273.15); // 计算开尔文温度倒数
temp = 273.15 / temp; // 计算开尔文温度值
temp -= 273.15; // 计算摄氏温度值
return temp; // 返回温度值
}
解释:电阻阻值的转换
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参数方程
NTC3950_Temp函数就是用的B参数方程来计算温度值的。