
前阵子给一块水温采集的小板子调程序NTC 10k B3950串了个10k电阻直接进单片机ADC。室温段读数还挺正常放到冰箱里一测显示温度比水银温度计低了快3°C转头丢进热水杯又高出2°C多。最开始我以为是传感器坏了换了一颗还是这个德行。后来才反应过来问题出在NTC热敏电阻天生非线性这件事上——阻值和温度是指数关系你要是直接拿ADC读数当线性信号换算两头飘是必然的。这篇文章就把NTC Thermistor Linearization这件事从头到尾捋一遍从物理原理到硬件补偿再到软件拟合和标定实操最后附上我踩过的坑。适合正在用NTC做温度采集的嵌入式工程师、电子爱好者和仪表开发者尤其是那些发现读数“中间准、两头歪”的人。1. NTC的非线性到底有多严重——先算一笔账1.1 Beta公式和它背后的物理原因NTCNegative Temperature Coefficient热敏电阻阻值随温度升高而下降。它的数学模型通常用Beta公式描述R(T) R0 * exp(B * (1/T - 1/T0))其中R0是参考温度T0通常25°C即298.15K下的阻值B是材料常数典型值在3000到5000之间。这个公式来源于半导体导电机制NTC主要由金属氧化物半导体材料制成温度升高时晶格振动增强激发更多载流子参与导电电阻率呈指数下降。注意这个“指数下降”就是非线性的根源——指数函数求导以后还是指数函数灵敏度随温度剧烈变化。很多初学者看到Beta公式觉得很简单套公式算就是了。但真正的问题在于你手上那颗NTC的B值并不是固定的。B值本身随温度缓慢变化厂家给的是两个温度点之间的“平均B值”比如B(25/50)代表25°C到50°C区间的等效B值。你把25/50的B值拿去算-20°C的阻值算出来可能和实测差好几个百分点换算成温度就是一两度的误差。这是后话先按下不表。1.2 同样1°CADC码值差了3倍光说“非线性”太抽象直接上数字。我拿最常见的10k NTC、B3950来算串联10k分压电阻3.3V供电12位ADC满量程4095各温度点的ADC读数如下温度NTC阻值分压输出电压ADC读数-20°C105.5kΩ3.014V3741-10°C58.33kΩ2.817V34960°C33.66kΩ2.544V315710°C20.20kΩ2.208V273925°C10.00kΩ1.650V204835°C6.515kΩ