2、温度传感器模型:热敏电阻(NTC/PTC)原理、Steinhart-Hart方程、B值模型、RTD(铂电阻)的Callendar-Van Dusen方程
温度测量,在嵌入式系统里是个老生常谈的话题。但说实话,真正能把温度测准的人,并不多。
我见过太多工程师,随便买个NTC,查个表就往上怼。结果产品一量产,温度飘得亲妈都不认识。为什么?因为你不理解传感器背后的数学模型。
这一章,我们就来啃下温度传感器里最核心的几个模型。热敏电阻(NTC/PTC)、Steinhart-Hart方程、B值模型,还有工业上最可靠的铂电阻RTD,以及它的Callendar-Van Dusen方程。
嗯,内容有点干,但都是硬通货。
2.1 热敏电阻:NTC与PTC的本质区别
热敏电阻,说白了就是电阻值随温度变化的电阻器。但这里有个关键分水岭:
- NTC(负温度系数):温度升高,电阻下降。这是最常用的测温元件。
- PTC(正温度系数):温度升高,电阻上升。通常用于过流保护或加热器。
我个人习惯,做精密测温时首选NTC。为什么?因为NTC的灵敏度高,温度每变化1℃,电阻能变化好几个百分点。而PTC在居里温度点附近电阻会突变,不适合做连续测量。
核心区别一句话:NTC用于测温,PTC用于保护/开关。
我曾经在一个冷链监控项目里,看到有人用PTC做温度采集,结果数据完全没法看。后来换成NTC配合Steinhart-Hart方程,精度直接拉到±0.1℃。选型选错了,后面全是白费功夫。
2.2 Steinhart-Hart方程:NTC的精确模型
NTC的电阻-温度关系不是线性的。你想想看,如果只是查表,那你的MCU得存几百个点,而且查表还有插值误差。
Steinhart-Hart方程就是用来解决这个问题的。它是一个对数形式的经验公式:
1/T = A + B·ln(R) + C·[ln(R)]³
其中:
- T 是绝对温度(单位:开尔文)
- R 是热敏电阻在温度T下的阻值
- A、B、C 是三个系数,由传感器厂商提供或通过标定得到
这个方程厉害在哪?它能在很宽的温度范围内(通常-50℃到+150℃)保持高精度。我建议你在做高精度测温时,优先用这个模型。
我的经验:如果厂商只给了B值和R25,那就只能用B值模型。但如果厂商给了三个温度点的阻值,一定要自己算出A、B、C系数,精度能提升一个数量级。
实际代码实现时,我一般这样写:
// Steinhart-Hart 方程计算温度
// 输入:NTC当前阻值 R
// 输出:温度值(摄氏度)
float NTC_SteinhartHart(float R) {
float T;
float lnR = log(R);
float invT = A + B * lnR + C * lnR * lnR * lnR;
T = 1.0 / invT - 273.15; // 开尔文转摄氏度
return T;
}
注意,这里的A、B、C需要提前标定好。我习惯在-10℃、25℃、80℃三个点做标定,这样覆盖了大部分应用场景。
2.3 B值模型:简化但够用
B值模型是Steinhart-Hart方程的简化版。很多厂商只给两个参数:R25(25℃时的阻值)和B值(材料常数)。
公式长这样:
R = R25 · exp( B · (1/T - 1/T25) )
反过来,已知电阻求温度:
T = 1 / ( (1/T25) + (1/B) · ln(R/R25) )
这个模型精度不如Steinhart-Hart,但胜在简单。我一般在消费类产品里用B值模型,因为成本敏感,而且温度范围窄(0℃到70℃),够用了。
避坑指南:我曾经在一个工业项目里偷懒用了B值模型,结果在-20℃环境下误差达到了3℃。后来老老实实换回Steinhart-Hart,问题才解决。记住:B值模型只适合窄温度范围,宽范围必须用三参数模型。
B值的典型范围:
| 材料类型 | B值范围(K) | 典型应用 |
|---|---|---|
| 低温NTC | 2000 ~ 3000 | 冰箱、冷柜 |
| 通用NTC | 3000 ~ 4000 | 家电、消费电子 |
| 高温NTC | 4000 ~ 5000 | 汽车、工业 |
2.4 RTD铂电阻与Callendar-Van Dusen方程
如果你需要工业级的精度,NTC就不够看了。这时候得上RTD,尤其是铂电阻(Pt100、Pt1000)。
铂电阻的优点是线性度好、稳定性高、重复性好。但注意,它也不是完全线性的。Callendar-Van Dusen方程就是用来修正这个非线性的。
方程分两段:
温度高于0℃时:
R(t) = R0 · (1 + A·t + B·t²)
温度低于0℃时:
R(t) = R0 · [1 + A·t + B·t² + C·(t-100)·t³]
其中:
- R0 是0℃时的电阻值(Pt100为100Ω,Pt1000为1000Ω)
- t 是温度(单位:℃)
- A、B、C 是常数:A=3.9083×10⁻³,B=-5.775×10⁻⁷,C=-4.183×10⁻¹²(低于0℃时使用)
这个方程是IEC 60751标准里规定的。我建议你直接抄标准里的系数,不要自己标定,除非你有高精度恒温槽。
重要提醒:C系数只在0℃以下使用。很多工程师在负温时忘了加C项,结果-40℃时误差能到0.5℃以上。这在工业现场是不可接受的。
代码实现:
// Callendar-Van Dusen 方程:电阻转温度
// 输入:RTD当前阻值 R,0℃阻值 R0
// 输出:温度值(摄氏度)
float RTD_CVD(float R, float R0) {
float t;
float ratio = R / R0;
// 先按正温公式计算
float delta = A*A - 4*B*(1 - ratio);
t = (-A + sqrt(delta)) / (2*B);
// 如果结果小于0,用负温公式重新计算
if (t < 0) {
// 这里需要迭代求解,因为负温公式是四次方程
// 实际工程中常用牛顿迭代法
// 简化写法,实际需要迭代循环
t = iterative_CVD_solve(R, R0);
}
return t;
}
嗯,这里要注意,负温公式是个四次方程,没法直接求解。我一般用牛顿迭代法,迭代3到4次就能收敛到0.001℃以内。
2.5 知识体系总览
说了这么多,我们来画个图,把整个温度传感器模型的知识体系串起来。这样你脑子里就有个清晰的框架了。
这张图把整个知识体系分成了四层。从上到下,从传感器类型到数学模型,再到具体公式,最后是精度和适用场景。你以后做选型时,直接对着这张图走,基本不会跑偏。
我的建议:初学者先从B值模型入手,快速上手。等遇到精度瓶颈了,再切换到Steinhart-Hart或RTD。一口吃不成胖子,但每一步都要走得扎实。
好了,温度传感器的核心模型就讲到这里。记住,模型只是工具,真正重要的是理解每个模型的适用边界。选对了模型,你的温度数据才可信。