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 知识体系总览

说了这么多,我们来画个图,把整个温度传感器模型的知识体系串起来。这样你脑子里就有个清晰的框架了。

温度传感器模型知识体系 热敏电阻 (NTC/PTC) RTD 铂电阻 (Pt100/Pt1000) Steinhart-Hart B值模型 Callendar-Van Dusen 1/T = A + B·ln(R) + C·[ln(R)]³ R = R25·exp( B·(1/T-1/T25)) R(t)=R0·(1+A·t +B·t²+C·(t-100)·t³) 精度:±0.01℃ 宽温域:-50~+150℃ 精度:±0.5℃ 窄温域:0~70℃ 精度:±0.001℃ 工业级:-200~+850℃ 选型原则:精度要求高→RTD | 成本敏感→NTC+B值 | 高精度宽温→NTC+Steinhart-Hart

这张图把整个知识体系分成了四层。从上到下,从传感器类型到数学模型,再到具体公式,最后是精度和适用场景。你以后做选型时,直接对着这张图走,基本不会跑偏。

我的建议:初学者先从B值模型入手,快速上手。等遇到精度瓶颈了,再切换到Steinhart-Hart或RTD。一口吃不成胖子,但每一步都要走得扎实。

好了,温度传感器的核心模型就讲到这里。记住,模型只是工具,真正重要的是理解每个模型的适用边界。选对了模型,你的温度数据才可信。

可可精品资料库