刚拿到“NTC 热敏电阻温度检测电路”这个命题时,很多人第一反应是简单:一个分压电阻、一个 NTC、一个 ADC 引脚,三行代码就能出温度。我也曾这么干过,结果第一版样机常温读数比水银温度计高了将近 3℃,排查了整整两个晚上。问题既不是 NTC 标称阻值标错,也不是 ADC 坏了,而是分压电阻的容差、参考电压的基准漂移以及换算公式的适用范围叠加在一起造成的偏差。这篇文章就围绕 NTC 温度检测电路从原理到实战的完整链路展开,把器件选型、分压计算、温度换算、校准方法和典型坑全部过一遍,适合刚接触嵌入式测温的开发者,也适合正在调试 NTC 采样精度问题的工程师参考。
1. NTC 的阻温特性:测温的物理基础到底藏在哪里
1.1 负温度系数的本质
NTC 的全称是 Negative Temperature Coefficient,也就是负温度系数。它的阻值会随着温度升高而下降,而且下降幅度不是线性的,而是近似指数关系。原因出在材料本身:NTC 热敏电阻通常由锰、镍、铜、钴等过渡金属氧化物经过高温烧结制成,属于多晶半导体陶瓷。在常温下,导电主要靠载流子在晶粒间的热激发跳跃,温度越高,参与导电的载流子越多,电阻就越低。
这个指数特性既是优点也是缺点:优点是灵敏度高,温度每变化 1℃,阻值变化率可以做到百分之几,比 PT100 这类金属热电阻高出一个数量级;缺点是非线性太强,如果直接用线性公式去换算温度,误差会非常难看。理解这一点,你就明白为什么后面所有换算方法都在跟非线性较劲。
1.2 标称阻值、B 值和精度等级怎么读
NTC 器件上最常见的三个参数是:标称阻值、B 值和耗散系数。标称阻值通常指 25℃ 时的电阻值,写成 R25,常见有 10K、100K、5K 等。B 值是材料常数,反映阻温曲线陡峭程度,单位是开尔文,常见有 3380、3435、3950、4100 等。B 值越大,曲线越陡,相同温度变化引起的阻值变化越大,但代价是测量范围变窄、非线性更强。
还有一个容易忽略的参数是 B 值的定义温区。同一颗 NTC,厂商给的 B 值可能是在 25℃/50℃ 下标定的,也可能是在 25℃/85℃ 下标定的。你用 25/50 的 B 值去算高温段,误差会明显增大。选型时最好让 B 值定义范围覆盖你的目标测温区间。
阻值偏差也要关注。普通级 NTC 在 25℃ 的阻值容差是 ±5% 甚至 ±10%,换算成温度误差可以达到 1~3℃。如果项目要求较高的绝对精度,要么选精密级(通常 ±1% 或 ±0.5%),要么在装配后做单点校准,靠软件修正系统偏差,这是成本最低的办法。
1.3 常见封装与形态选择
封装形态决定了响应速度和适用环境。玻封 MF52 型是最常见的,内部是半导体陶瓷片加两根引线,封装在玻璃管里,特点是化学稳定性好、能在 200℃ 以上长期工作,但空气热响应时间一般在 5~15 秒,贴片封装如 0603、0805 热质量小,响应快,适合做板载温度监测,但不适合直接接触腐蚀性环境;防水探头型(常见为不锈钢管加环氧灌封)用在液体、潮湿场合,时间常数会进一步拉大。选型时要清楚:你要测的是环境空气温度、板卡表面温度还是液体温度,这决定了传感器形态,而不仅仅是阻值。
1.4 一组直观的阻值变化数据
以 10K、B=3950 的常见器件为例,我先给出几个典型温度点的理论阻值,后面算分压电路会反复用到:
| 温度 | 理论阻值(约) |
|---|---|
| 0℃ | 33.7K |
| 25℃ | 10.0K |
| 37℃ | 6.2K |
| 50℃ | 3.59K |
| 85℃ | 1.45K |
| 100℃ | 0.70K |
从 25℃ 到 100℃,阻值从 10K 掉到 0.7K,跨度超过 14 倍。这个跨度直接把“用线性公式拟合”的路堵死了,也决定了你必须在电路和算法上做补偿。
2. 分压电路设计:串阻阻值、接法和参考电压的选择逻辑
2.1 为什么非要用分压电路
单片机的 ADC 只能测量电压,不能直接测电阻。NTC 的阻值变化必须通过一个固定电阻转换成电压变化,再用 ADC 采样回来做反推。这个固定电阻就是分压电阻,也叫串阻、平衡电阻。分压电路最简单的形式就是串阻与 NTC 串联,中间节点接 ADC,两端接参考电压和地。
2.2 串阻阻值到底怎么选
很多人随手选一个和 R25 相等的 10K 串阻,理由只是“这样常温分压恰好正中”,但这不一定最优。分压电阻的选择标准应当是:在目标测温区间内让输出电压变化量尽量大,且曲线不至于太偏。工程上常用经验是让串阻阻值等于目标区间中点温度对应的 NTC 阻值。
举一个例子,假设你要测 25℃ 到 50℃ 的温度区间,参考电压 3.3V,那么区间中点大约是 37℃,而 37℃ 时 NTC 阻值约 6.2K。用 6.2K 做串阻,我会得到这样的分压结果:
- 25℃:Vout ≈ 3.3 × 10 / (10 + 6.2) ≈ 2.04V
- 37℃:Vout ≈ 3.3 × 6.2 / (6.2 + 6.2) ≈ 1.65V
- 50℃:Vout ≈ 3.3 × 3.59 / (3.59 + 6.2) ≈ 1.21V
25℃ 到 50℃ 的电压跨度是 0.83V。如果换成 10K 串阻,跨度会缩到约 0.78V。差别不算夸张,但方向是对的。用 3.3K 串阻呢?25℃ 时 Vout ≈ 2.54V,50℃ 时 ≈ 1.72V,跨度 0.82V,看上去差不多,但高温段更陡、低温段更缓,区间占比不均匀。所以“区间中点匹配法”可以让灵敏度在整个温区里尽可能均衡。
提示:如果你的测温范围跨度很大,比如 -20℃ 到 120℃,一个串阻很难兼顾整个区间。这时候要么把测量范围拆成多段切换串阻,要么换用阻值更高的 NTC 弱化自热影响,要么干脆考虑其他传感器方案。后面章节会单独说。
2.3 NTC 放高端还是放低端
分压电路有两种接法:NTC 放在高端(NTC 接 VCC,串阻接地,ADC 节点在 NTC 和串阻之间)时,温度升高,节点电压也升高;NTC 放在低端(串阻接 VCC,NTC 接地,ADC 节点取二者中间)时,温度升高,节点电压下降。
两种接法电路上完全等价,但实际选型有讲究。如果你的 MCU ADC 输入范围有限,或者你希望用“采样电压越高代表温度越高”这样的直觉逻辑,就选 NTC 高端;如果希望温度越高电压越低,以便通过电压上限判断传感器断路,就选 NTC 低端。还有一个细节:如果 NTC 引线容易接触外部干扰,可以把 NTC 低端直接接模拟地,让走线更短,减少天线效应。我自己的习惯是选用 NTC 低端接法,即 VCC 到串阻到节点再到 NTC 再到 GND。因为在这种接法下,如果 NTC 短路,节点电压接近 0,如果 NTC 断路,节点电压接近 VCC,故障特征很容易在代码里识别。
2.4 参考电压的选择和滤波电容布置
分压电路的顶端接的 VCC 如果是直接取自 MCU 的 3.3V LDO,那么这个 LDO 的输出误差和温漂会直接映射到测温结果上。严谨的做法有两种:一是用 ADC 的参考电压 VREF+ 作为分压顶端电源,这样基准同一、误差抵消;二是使用独立的高精度基准源芯片给 ADC 和分压电路共用一个参考电平。
滤波也不可少。因为 NTC 是高阻元件,节点阻抗通常在数千欧姆级别,ADC 采样时的开关电容会从引脚抽取瞬态电流,导致测到的电压偏低。解决办法是在 ADC 引脚和 GND 之间放一个 0.1uF 的电容,形成电荷池,同时可以在分压节点和 ADC 引脚之间串一个 1K 电阻,构成一阶低通滤波,滤掉高频噪声。注意串阻不能选太大,否则 ADC 输入电流在串阻上产生明显压降,反而引入误差。
3. 从电压到温度:三条换算路线与实测误差对比
拿到 ADC 码值之后,先还原出 NTC 的阻值,才能得到温度。以 NTC 低端接法为例,设串阻为 Rs,参考电压为 Vref,ADC 采样电压为 Vout,那么 NTC 阻值 Rntc 由下面这个公式得到:
Rntc = Rs × Vout / (Vref − Vout)
算出阻值后,温度换算有查表、B 值公式、Steinhart-Hart 方程三条路线。我刚入门时只会第二招,后来才开始比较它们的适用边界。
3.1 B 值公式:简单但别超范围
B 值公式是工程上用得最多的近似式:
1/T = 1/T0 + (1/B) × ln(Rntc / R0)
其中 T0 是 298.15K(即 25℃),R0 是 25℃ 时的标称阻值。算出来 T 是开尔文,减去 273.15 得到摄氏度。公式原理是把 NTC 的阻温关系近似成单指数模型,B 值就是这个指数模型的一个拟合参数。
这个公式在 B 值标定温区附近(比如 25~50℃)精度尚可,误差一般在 0.3~1℃ 之间,但一旦超出标定区间,比如用 25/50 的 B 值去算 100℃,误差会迅速放大到 2℃ 以上。如果项目对精度要求不高、测温范围窄,B 值公式完全够用。对应的 C 代码片段很简单:
float ntc_r_from_adc(uint16_t adc, float rs, float vref) { float vout = (float)adc * vref / 4095.0f; return rs * vout / (vref - vout); } float temp_c_from_r(float rntc, float r25, float b) { float t = 1.0f / (1.0f / 298.15f + logf(rntc / r25) / b); return t - 273.15f; }3.2 Steinhart-Hart 方程:三参数拟合的精度担当
Steinhart-Hart 方程是更精确的经验公式:
1/T = A + B×ln(Rntc) + C×(ln(Rntc))^3
三个系数 A、B、C 可以通过三个温度点的标定阻值解方程组得到。厂商数据手册偶尔会直接给出三个系数,如果没有,你可以用标称参数表里选三个点自己算。相比 B 值公式,Steinhart-Hart 能同时兼顾低温段和高温段的曲率变化,在 -20℃ 到 100℃ 范围内,如果系数取得好,误差可以控制在 0.1℃ 量级。代价是需要浮点运算,以及三个点的标定数据要可靠。
3.3 查表法加线性插值:MCU 资源紧张时的好出路
如果你的单片机没有硬件浮点单元,跑对数函数又太费劲,可以用查表法。做法是把目标温度范围内每隔 1℃ 的 NTC 阻值预先生成一张表,运行时先用二分查找找到采样阻值落在哪两个相邻表中条目之间,再做线性插值。查表法的误差取决于表分辨率,1℃ 间隔配合线性插值,中间点的误差通常不超过 0.1℃;0.5℃ 间隔误差更小,但表格翻倍。表格占用 FLASH 量可控,几百个浮点或整型数据对现代 MCU 来说都不是问题。
3.4 三种方法的横向对比
| 换算方法 | 实现难度 | 精度潜力 | 适用场景 |
|---|---|---|---|
| B 值公式 | 最低,一个对数 | 窄温区 0.3~1℃ | 常温附近、快速原型、低端 MCU |
| Steinhart-Hart | 中等,需三系数 | 宽温区 0.1℃ 量级 | 对精度有要求、温区跨度大的场合 |
| 查表+线性插值 | 中等,需建表和二分查找 | 取决于表密度 | MCU 无浮点单元、需要稳定耗时 |
我个人最常用的组合是:主功能跑查表法保证响应速度,校准阶段用 Steinhart-Hart 方程做离线标定,生成标定表再烧进代码。这样既能享受公式法的精度,又不占用运行时的算力。
4. 精度被吃掉的地方:自热、线阻、ADC 参考源和校准
4.1 自热效应,先算算 NTC 自己热了多少
分压电路一旦通电,电流流过 NTC 就会产生焦耳热。NTC 自身温度升高,测出来的温度就不是真实环境温度了。自热温升的公式是:
ΔT = P / δ
P 是 NTC 消耗的功率,δ 是耗散系数,单位是 mW/℃,该系数在数据手册里有,通常在空气中是 1~3 mW/℃,在水中是十几到几十 mW/℃。
以 10K NTC、10K 串阻、VCC = 3.3V 为例,常温下回路电流约 0.165mA,NTC 上的功率等于 I² × R,约 0.27mW。在空气中的耗散系数按 2 mW/℃ 算,自热温升只有 0.14℃ 左右,完全可接受。但如果你把串阻改成 1K,电流跳到 1.5mA,NTC 功率变成 22.5mW,空气下自热超过 10℃,这就在测“自己的体温”了。
所以选串阻时除了考虑灵敏度,还要验算一次自热。低功耗设计里的常见做法是使用 100K NTC,因为同电压下电流小一个数量级,自热几乎可以忽略。或者采用“间歇供电”,每次采样前先给分压电路通电,比如延时 10ms 等电压稳定,然后立即采样,采样完成后立刻断电。这样子热只有采样瞬间产生,平均值非常低。
4.2 导线电阻:长线测温最容易忽略的误差
NTC 本身阻值从几百欧到几十千欧,如果传感器通过长导线连接到电路板,导线电阻会串进测量回路里,被当成 NTC 的阻值参与计算。导线电阻对测温的影响不是固定的,它与 NTC 当前阻值强相关。阻值越高时影响越小,阻值越低时影响越大。
以铜导线为例,2 米长的普通排线回路电阻可能就有 0.2~0.5Ω。对 10K NTC 来说,这点阻值在常温下几乎可以忽略,但当温度到 100℃ 时 NTC 阻值只有 700Ω,0.5Ω 线阻会造成约 0.05℃ 偏差,十米线就会到零点几度。如果线再细一点或者接头氧化,误差会更明显。
应对方式有三种:一是尽可能用短而粗的导线;二是做双线或三线制补偿,在传感器端额外引一根线测量线阻,软件里减掉;三是干脆不直接用电压差来算阻值,而是在靠近传感器的地方做电压-频率转换或者转成数字总线,彻底绕开线阻问题。对绝大多数板级应用,两线制加合理布线就足够了。
4.3 ADC 参考电压和管理
ADC 的参考电压稳定性直接决定测量上限。假设你的 VREF 实际是 3.25V 而不是代码里写的 3.30V,那么分压节点电压的绝对测量本身就带约 1.5% 误差,在 10K NTC 常温附近这会转化成约 0.4℃ 的读数偏差。如果参考电压还随时间温漂,误差就更难追。
解决手段比较成熟:一是使用 MCU 内部的高精度参考电压源,前提是它确实够准;二是在量产标定环节把实际 VREF 值测出来写进每台设备的 EEPROM;三是外部基准芯片,成本高一点,适合对精度较真的产品。我自己做过一个中等精度的项目,用的就是第二种方法,产测软件读出 ADC 满量程对应的真实电压,换算公式里直接用这个标定值,效果立竿见影。
4.4 校准操作:一点校准还是两点校准
器件出厂容差再大,也可以通过校准扳回来。一点校准时,把传感器放到你已知的稳定温度环境(比如冰水混合物接近 0℃,或者恒温箱里的 25℃),读一组实际采样值,计算偏移量,之后在软件里把测温结果整体平移。这个方法能修正阻值容差、参考电压偏差等比例误差中的一部分,但对增益误差无能为力。
两点校准则是在两个温度点分别读采样值,比如 0℃ 和 100℃,然后按线性映射修正。因为 NTC 曲线本身是非线性,两点校准不是全域精确,但在两点的区间内可以明显压缩误差。实际操作中更稳妥的做法是采集多个标准温度点,对 ADC 值与温度的关系做分段校准或者拟合校准曲线。产测成本高,但传感器一致性差的项目只能靠这个兜底。
4.5 采样时序与滤波
NTC 属于较大时间常数器件,但 ADC 采样是瞬时的。建议每次读取前做连续多次采样,例如采集 16 次,去掉最大最小值后取平均,可以有效滤除工频干扰和随机噪声。另外注意多通道 ADC 切换时,前一次采样的残余电荷会影响下一次读数,解决方法是每次切换通道后做一次“废弃采样”再正式采样。
5. 串扰排查和实际调试中的真实场景
5.1 面包板转成品板后读数变化 2℃,先查什么
从面包板移植到 PCB 后读数变化,是高频问题。常见原因有几个:地线布局导致 ADC 参考地电位偏移;分压电路离功率器件太近,被 PCB 局部温度加热;滤波电容没有贴近 ADC 引脚,数字噪声耦合。我的排查顺序是先看 VCC 波形,确认没有高频纹波叠加在分压电源上;再看 ADC 采样值稳定性,连续采 100 次看跳动幅度;最后用热成像或点温枪确认 NTC 本体温度是否被周围器件烤热。
5.2 看似“零点漂移”其实是参考电压温漂
某次调试中我发现设备从开机到运行 1 小时,温度读数慢慢偏了 0.8℃,一开始以为 NTC 附近温度真的上升了,后来发现是主芯片发热导致板载 LDO 输出电压变化,ADC 参考也跟着变。加一个采样通道专门测量参考电压,代码里用实时参考电压参与换算,问题立刻消失。这个技巧适用于所有对精度有要求的设计,成本为零,只是很多人一开始想不到。
5.3 自热效应的实测验证手段
如果你怀疑自热,可以把给分压电路的供电电压调低,或者用间歇采样方式,对比连续通电和瞬间通电之间的读数差。差值是纯自热导致的温升,可以定量判断到底有多严重。同理,把传感器从空气中放进水中,读数跳变也说明自热在起作用。我自己习惯在新设计里预留一个 GPIO 控制分压供电,平时断开,采样前开启,这样不仅能降低自热,还能省电,一举两得。
6. 选型边界:什么时候应该换掉 NTC
NTC 不是万能的。超过 150℃ 的场合,大多数 NTC 的阻值已经降到几百欧甚至几十欧,分压输出信号跳变小,自热误差占比升高,稳定性也会下降。此时金属热电阻 PT100/PT1000 更合适,虽然线性度和灵敏度都没 NTC 亮眼,但在高温段可靠得多。
另外如果系统对传感器互换性要求很高,比如今天换上 A 厂商的 NTC、明天换 B 厂商的,又不希望在代码里做标定,那 NTC 天然吃亏。数字单总线方案(比如 18B20 系列)虽然响应速度慢、测温上限受限,但免标定、输出直接是数字量,在暖通和家用场景里反而省事。几种方案的粗略对比见下表:
| 指标 | NTC | PT100/PT1000 | 数字温度芯片 |
|---|---|---|---|
| 单价 | 最低 | 中高 | 低 |
| 灵敏度 | 高 | 低 | 中 |
| 线性度 | 差 | 好 | 好 |
| 测温上限 | 通常 150℃ | 数百℃ | 通常 125℃ |
| 互换性 | 差,需校准 | 好 | 好 |
| 电路复杂度 | 需要分压和换算 | 需要调理电路 | 最少 |
结论是:如果你需要在低成本和宽温区之间找一个平衡点,用 NTC;如果你追求长期稳定性和弱标定,上铂电阻;如果你只是要一个“大概准确”的板载温度,数字芯片最省心。
7. 最后再分享一个调试小技巧
调试 NTC 电路时,我的习惯是先不解焊 NTC,而是把串阻换成可调电阻箱,手动改变阻值,用已知的阻值去反推采样值是否准确。这一步可以把“传感器误差”和“电路误差”彻底分开。如果可调电阻箱设定在 10.000K,ADC 读数反算出来的阻值是 10.42K,说明问题出在分压电路或换算代码,而不是 NTC 本身。
另外,量产阶段的设备如果 NTC 阻值容差是 ±5%,你不必追求每台都做两点校准。可以先统计一批设备的采样值分布,用单个偏移校准把 5% 容差收敛到 1% 以内。这个做法在很多项目里已经够用,省下来的产测时间非常可观。
温度检测电路说到底就是一个“电阻-电压-数字-温度”的链路,每一环都会叠加误差。你不需要每一环都是顶级精度,但至少要做到心里有数:误差是从哪来的,量级有多大,哪些环节值得花钱去改善,哪些环节靠软件就能兜住。把这套链路想清楚,NTC 电路就不再是“能出数就行”的试验品,而是一个真正可以交付的产品单元。