805.2°C 却已顶格:热电偶温度计量程审查
屏幕上是 805.2°C,下面一行却写着 RAW: 32767。对于有符号 16 位 ADC,32767 正是最大正码。它告诉我们的首先是“输入到顶了”,而不是“热端恰好为 805.2°C”。

图 1:原项目实物照片的局部裁剪。这里把数字作为诊断线索,不能把照片当作温度校准或 800°C 精度实测。
这台便携仪表用 SSP1120 采集 K 型热电偶,STM32G030 负责换算和显示,电池、升降压电源及蓝牙模块都在同一块板上。仪表能显示数字与“这次读数可信”是两回事。先把量程算清楚,后面的滤波、标定才有意义。

图 2:原项目已组装的外观。本文没有重做整机,也不把原项目的实物照片当成下面核算代码的实测结果。
信号从哪里来
从登录后的嘉立创 EDA 工程重新取的原理图可以顺着这条链路看:热电偶接在 U5,经过 R21/R20 两只 1 kΩ 电阻送入 SSP1120 的 AIN0/AIN1;C16 是跨差分输入的 100 nF,C17/C18 分别到地;R23/R22 各为 2 MΩ,给浮置热电偶提供输入偏置路径。SSP1120 的串行输出再到 STM32G030,屏幕显示结果。电容和电阻的存在只能说明设计意图,不能单凭原理图认定抗干扰指标已经达成。

图 3:同一项目的 EDA 原理图全图,工程图框标注 V1.0、2026-09-11。全图适合找功能块;手机上看元件值请结合下一张局部图。

图 4:U5、R20/R21、R22/R23、C16/C17/C18 与 U1 的连接局部。丝印中的 AIN0/AIN1 是需要和固件输入选择核对的关键网名。
PCB 顶面能看到 U5 到 U1 的模拟前端区域;底面也有走线。它们是布线检查的起点,不能替代噪声、温度梯度或冷端补偿的实测。尤其是冷端温度应该代表热电偶接线端温度;芯片内部传感器测到的是芯片本体附近温度,二者在充电、屏幕背光或外壳受热时可能不同。

图 5:PCB 顶面,U5 接线端和 U1 的位置可辨。这里只确认对应版图布局,不推断热梯度大小。

图 6:同版 PCB 底面。顶、底面均由 EDA 工程重新截取,未使用项目文章中的低清设计图。
32 mV 是硬边界
固件给 SSP1120 配的是内部 2.048 V 基准和 64 倍增益。按芯片手册,差分输入的正向满量程为 Vref / gain = 2048 mV / 64 = 32 mV。有符号 16 位输出的最大正码为 32767。到达这个码时,超过满量程的不同输入都可能给出同一个顶格结果,温度信息已经丢失。
K 型热电偶不能只用一个固定的“每摄氏度多少毫伏”覆盖整个温区。按 NIST ITS-90 的 K 型表,以 0°C 为参考,800°C 对应约 33.275 mV,冷端 25°C 对应约 1.000 mV。ADC 实际要接收的差分电势是两者相减,即 32.275 mV。它比 64 倍增益的 32 mV 上限多 0.275 mV。反推冷端固定 25°C 时,理论上约 793.3°C 就触及正向量程边界;这还没留增益误差、偏移或环境变化余量。

图 7:基于 NIST ITS-90 系数计算的示意曲线,冷端假定 25°C。蓝线不是实测曲线,红线是 64 倍增益时的 32 mV 输入边界。
原固件把输入微伏数按固定斜率 0.04127 mV/°C 换成温差,再加冷端温度;冷端只在启动时读一次。这样一来,32767 仍会得到一个看似具体的温度。照片中的 805.2°C 与该计算过程相容,但它不能反推出热端真值。线性近似还会引入非线性误差,启动后冷端变化则会继续带入旧值。
把“超量程”显示出来
本次做的是一份独立的主机端量程审计工具,不改动或声称已经烧录原板。工具使用 NIST 0~1372°C 正温区系数,先核对目标温差所需的电势,再选择有余量的增益;读到正、负轨码时返回状态,而不是温度。负温区需要另一套系数和验证,不能由这份代码外推。
from thermocouple_range import (
audit_code, differential_mv, full_scale_mv, highest_gain_with_margin,
)
need_mv = differential_mv(800, 25)
print(round(need_mv, 3)) # 32.275 mV
print(full_scale_mv(64)) # 32.0 mV
print(highest_gain_with_margin(800, 25)) # 32
print(audit_code(32767, 25, 64).status) # rail
建议固件方案是把增益从 64 改为 32,让 800°C/25°C 的 32.275 mV 输入落在 ±64 mV 范围内,再给增益、偏移和冷端差异留实测余量。改配置时,原固件中的软件增益值也必须同步改为 32;只改寄存器、不改换算分母,会得到约一半的温差。这个选择提高量程但缩小每个 ADC 码对应的输入分辨率,最终精度仍要靠校准和噪声测试确定。
另一个关键是数据状态。下列代码并未把顶格码换算成温度;near_rail 只提示余量不足,不能直接当成“已饱和”。冷端样本超过设定的新鲜度窗口也单独拒绝,避免开机时的一次读数被无限期使用。
result = audit_code(raw_code=32767, cold_c=25, gain=64)
if result.status == "rail":
print("超量程:不要显示温度值")
elif result.status != "ok":
print(result.status, result.detail)
else:
print(f"模型换算值:{result.hot_c:.1f}°C")
主机端已检查 NIST 参考点、正温区反算、800°C 所需电势、顶格拒绝、有效码换算和冷端超时,共 7 项。运行 python -m unittest -v test_thermocouple_range.py 可复核;python thermocouple_range.py --hot 800 --cold 25 --gain 64 --raw 32767 会报告 rail。这些是文件和数学模型测试,没有进行 STM32 目标编译、板上测温、冷端温差测试或 800°C 标定。下一步真正改机时,应先核对引脚与基准配置,再用已知温度点、冷端扰动和断偶/短偶状态逐项验证,不能把本次静态核算当成整机合格证明。
资料与复用说明:原项目为“国产 SSP1120(16 位 ADC)做的热偶温度计”,项目页账号 colin988,完整地址 https://oshwhub.com/colin988/project_dnsnbkoz ,页面标注 GPL-3.0。原项目实物照片与嘉立创 EDA V1.0 工程图仅用于此处说明和审查;照片做了局部裁剪、轻微对比度与锐度处理,EDA 图从登录后的工程以 4000×2600 像素重新截取并裁除界面,无人工补画线路或数字。原固件附件为项目页 Thermometer.zip,本地核验 SHA-256:272973A3E66A45FDC9D4B6FC89832615859241C6806712F469D060E765120E11,未随本文重新分发。计算依据为上海矽朋《SSP1120》V1.01 数据手册和 NIST 温标数据库 SRD 60 的 ITS-90 K 型表及参考函数;本文独立编写的量程审计脚本和测试以 thermocouple-range-audit.zip 附件提供,按 MIT 许可使用。实际修改仅限独立审计工具,未更改原板硬件或烧录原固件。
技术交流,欢迎关注微信公众号:美男子玩编程。



