简介:这是一份面向硬件工程师、电子设计人员及温度测量系统开发者的NTC热敏电阻参数速查表,汇总了5kΩ、10kΩ、50kΩ和100kΩ四种标称阻值在-20℃至130℃范围内的阻值变化数据。每个温度点均给出最大、正常、最小阻值三组参考值,并标注±1%电阻公差、3470K B值及±1% B值公差,方便设计者依据具体应用环境快速查表选型。资源为单个PDF文档,约783KB,内容精简可直接打印查阅。文件已收录完整温度-阻值对照表,覆盖从低温到高温的宽区间,适用于恒温器、传感器电路、电源管理系统等温度敏感场景。已有4352人学习下载,对于需要评估NTC热敏电阻温度特性、进行电路设计或故障排查的工程师具有实用参考价值。
1. NTC热敏电阻阻值与温度对应:为什么选型差一步就翻车
手里拿到一份标注“NTC热敏电阻 5k、10k、50k、100k 阻值与温度对应”的PDF文档时,第一反应往往是把里面那几列数字当成真理,照着表格查阻值、读温度。但实际用过几次就会碰上同一个尴尬:同一份表格放在不同电路里,测出来的温度对不上。不是PDF错了,而是这张表背后藏着B值、材料曲线、自热功耗和测量电路四个变量,任何一环没对齐,阻值读数就会偏出好几度。
这篇笔记要解决的就是这个问题:NTC热敏电阻的阻值与温度对应关系到底怎么读、怎么算、怎么用,以及5k、10k、50k、100k这四种常用规格在实际选型和测量中各有什么坑。适合正在做温度采集、电池保护、环境监测或设备热管理的开发者,也适合刚拿到一份阻温对照表却不知道该怎么落地的硬件新手。重点放在能复现的步骤上,读完你就能自己生成对照表、搭好测量电路,并把那份PDF真正变成能用的工程数据。
2. 阻温关系与选型逻辑:5k、10k、50k、100k 的差异不在阻值本身
2.1 NTC 的阻温数学模型:B值公式和 Steinhart-Hart 方程怎么选
NTC 热敏电阻的核心特性是阻值随温度上升而指数下降,这个下降关系不是线性的,工程上通常用两种数学形式来描述。
B值公式是最常见的工程近似:
R_T = R_25 * exp(B * (1/T - 1/T_25))其中 R_25 是 25℃ 时的标称阻值,T 和 T_25 是开尔文温度,B 是材料常数,典型值在 3000K 到 5000K 之间。这个公式的好处是只有一个参数 B,手算和写代码都很方便,但它的精度有限,尤其在温度范围拉宽到 -40℃ 到 125℃ 时,误差可能到 2℃ 以上。
Steinhart-Hart 方程是三参数模型,精度明显更高:
1/T = A + B * ln(R) + C * (ln(R))^3三个系数 A、B、C 需要通过三个已知温度点的实测阻值来拟合。如果你手里的 PDF 文档只给了 B 值而没给三参数,那就先按 B 值公式算,等有条件做标定再换三参数模型。选型时有个容易忽略的点:B 值是在 25℃/50℃ 两点之间测出来的,有的厂商写 B25/50,有的写 B25/85,温度区间不同,数值不能直接横向比较。
2.2 5k、10k、50k、100k 选型逻辑:信号链和功耗决定规格
很多开发者以为选 NTC 就是选一个阻值,其实阻值大小直接决定了测量电路的功耗和噪声表现。5k 和 10k 的 NTC 在常温下阻值较低,用分压电路测量时流过电阻的电流更大,自身发热也更明显,适合对响应速度要求高、对功耗不敏感的场合。50k 和 100k 的 NTC 阻值高得多,功耗可以压到微瓦级别,特别适合电池供电的便携设备。
举一个实际对比:3.3V 供电下,用 10k NTC 配 10k 分压电阻,常温下电路电流约 165 微安,NTC 上的自热功率约 0.27 毫瓦。换成 100k NTC 配 100k 分压电阻,电流降到约 16.5 微安,自热功率只有 0.027 毫瓦,差了整整一个数量级。对于测温精度要求 0.5℃ 以内的场景,这个自热差异可能就是准不准的分水岭。
功耗之外还要看 ADC 的输入阻抗。100k 规格的 NTC 阻抗偏高,如果 ADC 的采样电容充电时间不够,会直接拉低读数。这种情况下要么降低分压电阻值,要么加一级电压跟随器做缓冲,否则测出来的阻值会系统性偏低。选型时把这三件事放在一起权衡:信号链功耗、ADC 输入阻抗、温度测量范围。
2.3 阻值-温度对照表怎么读:精度、温度范围和分辨率
拿到一份阻值与温度对应的 PDF,先别急着录入代码,把表格的三个属性确认清楚。第一是温度范围,常见的有 -40℃ 到 125℃、0℃ 到 70℃、25℃ 到 85℃ 几档,超出标定区间的数据可信度会下降。第二是温度步进,有的表每 1℃ 给一个阻值,有的每 5℃ 给一个,步进越细查表误差越小,但需要的存储空间也越大。第三是阻值精度,表格里的数字是标称值还是实测值,一般文档里会有说明,标称值在同批次里也有 ±1% 到 ±5% 的离散度。
还有一个常见误读:对照表里的阻值是在零功耗条件下测出来的,实际电路里只要有电流流过 NTC,它自身就会微微发热,导致阻值偏小、读数偏高。单独的表格不会告诉你这件事,但做测量方案时必须自己补上这个修正量。下面这张表是四种规格在 25℃ 附近的典型参数对比,实际以你手里的 PDF 为准:
| 规格 | 25℃ 标称阻值 | 常用 B 值范围 | 典型测温范围 | 自热敏感度 |
|---|---|---|---|---|
| 5k | 5 kΩ ±1% | 3370–3470K | -40~125℃ | 较高 |
| 10k | 10 kΩ ±1% | 3380–3435K | -40~125℃ | 中等 |
| 50k | 50 kΩ ±1% | 3950–4100K | -40~150℃ | 较低 |
| 100k | 100 kΩ ±1% | 4250–4500K | -40~150℃ | 很低 |
注意 50k 和 100k 的 B 值通常比 5k、10k 高,这意味它们在同样的温度变化下阻值变化更陡峭,分辨率更好,但 ADC 采样的动态范围压力也更大。下一篇讲怎么把这些参数落到脚本里生成对照表。
3. 用脚本生成阻值与温度对照表:查表法和公式法两条路线
3.1 用 Python 按 B 值生成 5k 到 100k 的阻温对照表
最常见的做法是拿到 B 值和 R25 之后,用脚本一次性生成整张阻温表。这里用一个 Python 脚本,按 B 值公式计算指定温度点的阻值,并输出成表格。
import math def ntc_resistance(r25, b_value, temp_c): # temp_c: 摄氏温度 t_kelvin = temp_c + 273.15 t25_kelvin = 298.15 return r25 * math.exp(b_value * (1.0 / t_kelvin - 1.0 / t25_kelvin)) # 配置参数:常用 10k NTC,B=3435K r25 = 10000.0 b = 3435.0 # 生成 -20℃ 到 100℃,步进 5℃ 的对照表 for temp in range(-20, 101, 5): r = ntc_resistance(r25, b, temp) print(f"{temp:4d} {r:10.1f}")这个脚本的核心就是那条指数公式。每次循环把摄氏温度转成开尔文,代入公式算出阻值。步进取 5℃ 是平衡精度和输出长度,如果你需要 1℃ 步进,把range(-20, 101, 5)改成range(-20, 101)就行。B 值的来源很关键,优先用 PDF 文档里标注的 B25/85 值,如果文档只给了 B25/50,算出的高温段阻值会明显偏差。
输出结果可以直接和 PDF 里的表对照,正常情况下偏差应该在 1% 以内。如果对不上,先确认 R25 和 B 值是否取对了,再看文档表格的温度步进是不是从 0℃ 而不是 -20℃ 开始的。参数改起来就三处:r25、b、温度范围和步进。
3.2 Steinhart-Hart 三参数拟合:精度不够时的补救
B 值公式在宽温度范围内误差偏大,特别是低温段。如果你手里的 PDF 表格精度标到了 ±0.5℃,或者测温范围横跨 -40℃ 到 125℃,建议换成 Steinhart-Hart 方程。
import math def steinhart_temp(resistance, a, b, c): # 输入阻值,返回摄氏温度 ln_r = math.log(resistance) temp_k = 1.0 / (a + b * ln_r + c * ln_r**3) return temp_k - 273.15 # 示例系数:某 10k NTC 的三参数拟合结果 a = 1.129241e-3 b = 2.341077e-4 c = 8.767411e-8 # 计算 10k 阻值对应的温度 print(steinhart_temp(10000.0, a, b, c))三参数模型用ln(R)的三次多项式描述温度倒数,理论上比 B 值公式更贴近真实热敏材料特性。代价是你需要三个校准点的实测数据,常见做法是取冰水混合物 0℃、常温 25℃、沸水 100℃ 三个点,测量阻值后用非线性拟合算出 a、b、c。如果你只有 PDF 表格而没有实测条件,也可以从表格里挑三个温度点的阻值来做拟合。
拟合时有个注意点:三个点的温度跨度要尽量拉开,最好覆盖你要用的整个量程。如果三个点挤在 20℃ 到 30℃ 之间,拟合出的系数在外推时误差会迅速放大。这一点和差分 GPS 的定位逻辑类似,基准点越分散,覆盖范围才越大。
3.3 对照表落地成 C 数组:嵌入式查表的格式化输出
生成对照表的最终目的大多是烧进单片机里做查表,而不是在 PC 上算完就扔。下面这段把 Python 生成的阻值表直接输出成 C 语言数组,省去手工抄录的麻烦。
import math r25 = 100000.0 # 100k NTC b = 4250.0 print("// 100k NTC 阻温对照表, -40℃ ~ 125℃, 步进 1℃") print("const uint16_t ntc_table[] = {") for temp in range(-40, 126): t_k = temp + 273.15 r = r25 * math.exp(b * (1.0 / t_k - 1.0 / 298.15)) # 阻值换算成 ADC 读数, 这里假设 12bit ADC, 参考电压 3.3V, 分压电阻 100k adc_raw = int(4095 * r / (100000.0 + r)) print(f" {adc_raw},") print("};")这段代码把阻值直接换算成了 ADC 读数而不是阻值本身。这么做的原因是嵌入式查表最终要的是温度与 ADC 码值的映射,提前换算省掉运行时浮点运算。分压电阻取 100k 是为了和 NTC 的常温阻值匹配,让 25℃ 附近 ADC 读数落在中间区域,分辨率最优。如果 NTC 换成 10k,这里的100000.0也要改成10000.0。
ADC 读数按整数存成uint16_t就够用,12bit 分辨率下满量程是 4095。查表时用二分法定位温度区间,再用线性插值求中间温度,这块代码在最后一章给出。注意数组顺序要和温度顺序一致,一般从低温排到高温,查表时才不会把逻辑搞反。
4. 从 PDF 到实物:搭建测量电路并标定 NTC
4.1 分压电路与 ADC 采样:参数怎么设才不白搭
NTC 测温度最常用的电路是电阻分压。一个固定电阻和一个 NTC 串联,中间点接 ADC 采样,通过 ADC 读数反推 NTC 阻值,再查表或算公式得到温度。
// Arduino/STM32 风格伪代码, 演示 ADC 读数换算温度流程 float read_temperature() { int adc_raw = analogRead(NTC_PIN); // 读取 ADC 原始值, 12bit // 换算 NTC 当前阻值 // Vout = Vref * Rntc / (Rfix + Rntc) // 所以 Rntc = Rfix * Vout / (Vref - Vout) float vout = (float)adc_raw / 4095.0 * 3.3; float rntc = R_FIXED * vout / (3.3 - vout); // 用 B 值公式反算温度 float t_kelvin = 1.0 / (1.0 / 298.15 + log(rntc / R25) / B_VALUE); return t_kelvin - 273.15; }分压电阻 R_FIXED 的取值直接影响测量分辨率。最理想的情况是让 NTC 在你要测的温度范围中点附近阻值等于 R_FIXED,这样分压点电压在 Vref/2 附近,ADC 的分辨率利用率最高。拿 100k NTC 配 100k 分压电阻来说,测 0℃ 时 NTC 阻值约 250k 以上,Vout 接近 2.36V,测 50℃ 时阻值掉到约 30k,Vout 只有 0.66V,整个区间跨度刚好覆盖 ADC 量程的三分之二。
这个伪代码里的关键参数是 R_FIXED 和 B_VALUE,换 NTC 规格时先改这两个。另外 3.3 伏参考电压必须是实际测量值,如果 ADC 的 Vref 引脚接到基准芯片,就以基准芯片输出为准,不要盲目用 3.3V。
4.2 标定流程:恒温槽、冰水混合物、沸水三步走
PDF 里的表格再准也是厂商的标称数据,同一批次里的个体差异、引脚焊接带来的热应力、老化漂移,都会让实际阻值偏离表格。有条件的话,上机前做一次三点标定,尤其是对精度要求高于 ±1℃ 的场景。
标定流程不复杂,核心是三个温度点:冰水混合物接近 0℃、室内恒温环境接近 25℃、沸水接近 100℃。把 NTC 探头放进对应的介质里,等读数稳定后记录 ADC 原始值。每个点等 5 分钟以上,让探头和介质充分热平衡,否则读数还会缓慢漂移。沸水标定的高度依赖当地大气压,海拔高的地方沸点可能只有 96℃ 甚至更低,这时候最好用温度计实测水温,而不是假设 100℃。
实际操作时建议用保温杯做冰水混合物,水温可以稳定在 0.1℃ 左右,是三个点里最可靠的。沸水的漂移大一些,放在最后测。每个点记录至少 50 次 ADC 读数取平均,消除电源纹波和采样噪声的影响。
4.3 数据拟合与误差评估:把测量结果回填到对照表
标定得到的三个温度点对应三个阻值,可以用它们重新拟合 Steinhart-Hart 系数,把结果回填到你的温度算法里。
import numpy as np # 标定点: (温度℃, 阻值Ω) cal_points = [(0.2, 27370.0), (25.1, 100200.0), (99.6, 5800.0)] # 构造方程组: 1/T = a + b*ln(R) + c*(ln(R))^3 A = [] b_vec = [] for temp_c, resistance in cal_points: t_k = temp_c + 273.15 ln_r = np.log(resistance) A.append([1.0, ln_r, ln_r**3]) b_vec.append(1.0 / t_k) # 最小二乘求解 coeffs, *_ = np.linalg.lstsq(A, b_vec, rcond=None) a, b, c = coeffs print(f"a={a:.6e}, b={b:.6e}, c={c:.6e}")这段用三个标定点构造三行方程组,再用最小二乘解出 Steinhart-Hart 系数。lstsq在这里解的是超定方程组,三组数据、三个未知数,理论上能精确求解,但用最小二乘是为了在数据有噪声时给出统计最优解。拟合完成后可以用未参与拟合的温度点做验证,算出的温度和实测温度误差应该在 ±0.3℃ 以内。
如果拟合误差偏大,先检查标定过程,最常见的原因是冰水混合物没搅拌均匀,探头局部接触到未融化的冰块,读到的温度比 0℃ 低不少。重新标定比修改算法参数管用得多。
5. NTC 使用避坑:自热、引线电阻、采样噪声与 B 值偏差
5.1 自热效应:25℃ 标称阻值不是让你直接通电用的
现象:NTC 测出来的温度总是比实际环境温度高 0.5℃ 到 2℃,而且供电电压越高,偏高越明显。
原因:电流流过 NTC 时产生焦耳热,阻值降低,系统按降低后的阻值反推温度,自然偏高。自热功率等于流过 NTC 的电流平方乘以阻值,负载越重偏差越大。
解决:先算自热功率是否超标。一般玻璃封装 NTC 的耗散系数在 1 到 2 mW/℃,意思是每毫瓦自热会带来约 0.5℃ 到 1℃ 的温升。用 3.3V 供电、10k NTC 配 10k 分压电阻,自热功率约 0.27mW,造成的温升约 0.2℃,勉强可接受。换成 100k NTC 配 100k 分压电阻,自热功率降到 0.027mW,温升可以忽略。如果不得不用低阻值 NTC,就把供电电压降下来,或者用脉冲供电方式,只在采样瞬间给分压电路通电。
5.2 引线电阻和接触电阻:100k 规格最容易被这个坑
现象:同一批 NTC 用短引线测试正常,换成长引线后阻值偏大,温度读数偏低,而且引线越长偏差越大。
原因:NTC 引线和 PCB 走线本身有电阻,与 NTC 串联后被当成 NTC 阻值的一部分。对 5k、10k 的 NTC 来说,几十毫欧的引线电阻可以忽略,但对 100k 规格在高温段的阻值只有几 kΩ 时,引线电阻的占比会被放大。
解决:短引线直接焊接最省事。必须用长引线时用三线制或四线制接法,把引线电阻从测量回路里剔除。另外 PCB 上 NTC 焊盘附近不要走大电流线,铜箔的温升会通过引脚传导给 NTC,造成读数虚高。这个坑在电池保护板里很常见,充放电大电流回路和 NTC 靠得太近,温度读数会偏离真实值好几度。
5.3 ADC 参考电压与偏置电阻:采样值跳动的根源
现象:ADC 读数在同一个温度下不停跳动,末位几位长期不稳定,换算出来的温度波动 ±1℃ 以上。
原因:分压电路的电源带了纹波,或者 ADC 的参考电压不稳。NTC 分压输出是模拟量,任何叠加在 Vref 或 VDD 上的噪声都会直接进到采样结果里。另一个常见原因是分压电阻阻值太大,ADC 内部采样电容充电时间不足,每次采样的电压还没稳定就被锁存了。
解决:分压电路电源用 LDO 单独供电,不要和继电器、电机驱动共用电源。ADC 采样前先做软件滤波,连续采 8 次去掉最大值最小值再取平均,能压掉大部分随机噪声。如果用的是高阻值 NTC 加高阻值分压电阻,把 ADC 采样周期拉长,或者加一个 100nF 电容并在 ADC 引脚到地之间,给采样电容预充电。
5.4 B 值偏差导致的高温段误差:换算法前先确认 B 值来源
现象:用 B 值公式算温度,低温段和 25℃ 附近都准,到了 80℃ 以上误差越来越大,最高能偏到 3℃ 以上。
原因:B 值本身是温度依赖的,厂商标称的 B25/50 只保证 25℃ 到 50℃ 这个区间内的拟合精度,外推到 100℃ 时材料特性偏离单指数模型。另外不同厂商对 B 值的定义有差异,有的写在 25℃/85℃ 条件下测得,有的在 25℃/50℃ 条件下测得,直接拿过来用就会在高温段翻车。
解决:确认 PDF 文档里 B 值对应的温度区间,优先用区间覆盖你工作范围的 B 值。如果你常测 60℃ 到 100℃ 的高温环境,直接选 B25/85 规格的 NTC,而不是 B25/50 的。更稳妥的办法是干脆放弃 B 值公式,用三参数 Steinhart-Hart 模型加标定数据。B 值公式只是工程近似,不是物理定律。
6. 进阶:用最小二乘反推 B 值并在 MCU 上做二分查表
最后一个阶段解决两个常见诉求:手里只有散乱的阻温数据没有 B 值,以及把对照表落到 MCU 上做快速查表。先说反推 B 值,再看 MCU 侧实现。
从一组实测阻温数据反推 B 值和 R25,本质是对 B 值公式两边取对数做线性回归。把公式R = R25 * exp(B * (1/T - 1/298.15))取对数后变成ln(R) = ln(R25) + B * (1/T - 1/298.15),这是一条以(1/T - 1/298.15)为自变量、ln(R)为因变量的直线,斜率就是 B,截距就是 ln(R25)。
import numpy as np # 实测数据: (温度℃, 阻值Ω) data = [(0, 27370), (25, 100200), (50, 39200), (75, 16500), (100, 5800)] x_vals = [] y_vals = [] for temp_c, r in data: t_k = temp_c + 273.15 x_vals.append(1.0 / t_k - 1.0 / 298.15) y_vals.append(np.log(r)) # 一元线性回归 slope, intercept = np.polyfit(x_vals, y_vals, 1) b_value = slope r25 = np.exp(intercept) print(f"B={b_value:.1f}K, R25={r25:.1f}Ω")np.polyfit在这里做一次多项式拟合,次数设为 1 就是线性回归。输出结果可以直接作为第二节脚本的参数。注意参与拟合的温度点要覆盖尽量宽的范围,否则反推的 B 值只在窄区间内可靠。
MCU 侧查表推荐二分法加线性插值,不推荐运行时调pow()算指数,浮点开销太大,在低主频单片机上可能占掉好几毫秒。用第三章生成的 ADC 码值表,按二分查找定位区间,再插值出温度:
// 二分查表 + 线性插值, 返回温度(单位 0.1℃) int16_t ntc_lookup(uint16_t adc_raw, const uint16_t *table, int16_t *temp_table, int len) { int low = 0, high = len - 1; while (high - low > 1) { int mid = (low + high) / 2; if (table[mid] <= adc_raw) low = mid; else high = mid; } // 线性插值 int32_t t_low = temp_table[low]; int32_t t_high = temp_table[high]; int32_t r_low = table[low]; int32_t r_high = table[high]; int32_t t_out = t_low + (int32_t)(adc_raw - r_low) * (t_high - t_low) / (r_high - r_low); return (int16_t)t_out; }这个实现假设表格是从低温到高温排列,ADC 读数随温度单调变化。NTC 是负温度系数,温度越高阻值越低,在分压电路里 ADC 读数也越低,所以表格顺序和 ADC 码值方向一致。插值用整数运算,避免浮点,在 Cortex-M0 级别的芯片上单次查询耗时不到 10 微秒。
经过这几轮折腾,我自己形成的一个习惯是:每次拿到新的 NTC 型号,先花半小时跑一遍标定脚本生成专属对照表,而不是直接信 PDF 里的出厂数据。标定完的表格存成 C 数组烧进固件,之后换批次或换供应商,重跑一次标定就行。这样虽然多花半小时,但省掉了后续整机调温度偏差的几天时间。希望帮到你。
本文还有配套的精品资源,点击获取