两个主要的步骤:
- 设计分压器电路来测量NTC(负温度系数热敏电阻)的阻值。
- 编写C语言函数来使用测量的阻值和NTC参数计算温度。
首先,让我们设计分压器电路。
分压器电路设计
您需要一个已知阻值的参考电阻,通常推荐与NTC在预期工作温度附近阻值相当的电阻,比如10KΩ。
Vcc||Rref (10KΩ)|+---> Vout (测量的电压)|NTC (10KΩ at 25°C)|GND
在这个电路中,Vcc
可能是你的微控制器的模拟参考电压(例如3.3V或5V),Rref
是参考电阻,NTC是热敏电阻。Vout
是两个电阻之间的电压,我们将用ADC(模数转换器)读取该电压。
C语言函数设计
温度计算依据以下公式来计算:
T = 1 / ( 1 / T 25 + ( 1 / B ) ∗ l o g ( R n t c / R 25 ) ) T = 1 / (1/T_{25} + (1/B) * log(R_{ntc}/R_{25})) T=1/(1/T25+(1/B)∗log(Rntc/R25))
其中:
T
是绝对温度(Kelvin)。T_{25}
是25°C时的温度(Kelvin),即 298.15K。B
是热敏电阻的B值,例如3950。R_{ntc}
是NTC的实际阻值。R_{25}
是NTC在25°C下的阻值(10KΩ)。
要计算这个,您需要从ADC测量值转换为阻值:
R n t c = R r e f ∗ V c c − V o u t V o u t R_{ntc} = R_{ref} * \frac{V_{cc} - V_{out}}{V_{out}} Rntc=Rref∗VoutVcc−Vout
然后使用以上公式计算温度。
这里是一个C语言函数的例子,假设您能够获得Vout
:
#include <math.h>#define Rref 10000.0f // 参考电阻的阻值,10KΩ
#define R25 10000.0f // NTC在25°C下的阻值,10KΩ
#define B 3950.0f // B值
#define Vcc 5.0f // 电源电压
#define ADC_max_value 1023.0f // 假设您的ADC是10位的// 将ADC原始值转换为电压值的函数
float ADC_to_voltage(int ADC_value) {return (float)ADC_value * (Vcc / ADC_max_value);
}// 函数传入Vout,返回摄氏温度
float NTC_temp_C(float Vout) {// 计算NTC的阻值float Rntc = Rref * ((Vcc / Vout) - 1.0f);// 计算NTC的温度(Kelvin)float T = 1.0f / ((1.0f / 298.15f) + (1.0f / B) * logf(Rntc / R25));// 转换为摄氏温度float tempC = T - 273.15f;return tempC;
}// 然后您的代码在获取ADC的原始值并计算温度时可能如下所示:
// int ADC_value = ADC_Read(); // 假设这是您用于读取ADC原始值的函数
// float voltage = ADC_to_voltage(ADC_value);
// float temperature = NTC_temp_C(voltage);
请注意,您的微控制器需要具有模数转换器来读取Vout
电压,公式中使用的数值可能需要根据您实际使用的硬件进行调整。 ADC读取到的数字可能需要转换为实际的电压值,这取决于您的微控制器的分辨率(如10位、12位等)和参考电压。这部分代码需要根据您微控制器的实际编程手册来实现。
如果您的开发环境不包含 math.h
头文件,您还可以使用泰勒级数展开或查找表来实现自然对数函数。对于热敏电阻的温度计算,精确度不需要非常高,所以您可以采用一个简化的对数函数实现。
以下是一个使用泰勒级数展开的简化对数(自然对数)近似函数:
float ln_approx(float x) {if (x <= 0.0f) {return 0.0f; // 对数未定义或无效输入值}float y, y_old, t;y = 0;t = (x - 1) / (x + 1);// 计算前几项y = 2 * t;t = t * t * t; // t^3y += (2 * t) / 3;t *= t * t; // t^5y += (2 * t) / 5;return y;
}
请注意,上述代码的精度依赖于泰勒级数中考虑的项数。上述实现只考虑了展开的前五项,根据您的应用需求,您可能需要更多项以提高精度。
然后您可以在没有 math.h
的情况下重写 NTC_temp_C
函数:
float NTC_temp_C(float Vout) {if (Vout <= 0.0f) {return -273.15f; // 无效数据}// 计算NTC阻值float Rntc = Rref * ((Vcc / Vout) - 1.0f);// 温度计算float T = 1.0f / ((1.0f / 298.15f) + (1.0f / B) * ln_approx(Rntc / R25));// 转为摄氏度float tempC = T - 273.15f;return tempC;
}
请记住,您可能需要根据实际应用调整泰勒级数展开的项数,以平衡执行时间和计算精度。
另一种方法是使用查找表。根据您测量温度范围内的阻值和温度之间的关系,您可以创建一个对应的查找表。这种方法占用的内存会比较多,但是可以在不引入数学库的情况下达到很好的准确性和快速响应。