ESP8266加热台读温不准先查双量程采样

2026-10-203
AI 快速预览详细 收起
本文介绍了如何通过QF-HP物联网加热台实现稳定的温度闭环控制。首先,文章将系统分为三条线:市电功率线、低压控制线和测量线。接着,详细讲解了每条线的连接关系和排错方法。特别强调了NTC采样的正确方法和PID参数整定的重要性。通过这些步骤,可以确保加热台的温度控制更加稳定。

加热板已经烫了,屏幕上的温度却还像没睡醒;好不容易进入高温段,数字又开始一格一格地跳。遇到这类现象,直接拧 PID 参数,很可能只是在替采样电路收拾残局。

把温控链拆开看,会遇到两个容易混淆的量。一个是给 NTC 分压供电的 3.3 V,另一个是 ESP8266 ADC 约 1 V 的有效输入满量程。它们在同一张图里,却不能在公式里互相替代。再加上一颗模拟开关,单路温度输入其实有两种增益。

加热台外观,显示加热板、旋钮与面板布局

图1 加热台的结构外观。探头测到的是安装位置的温度,屏幕数字与板面温度之间还隔着热接触、量程与校准。

先沿着探头把两条路找出来

V1.4工程条目的电源、功率与温度采样电路

图2 从嘉立创 EDA 导出的电路区。工程条目名为 V1.4,图纸内部标题栏标为 REV 1.1,两者分别记录,不混称为同一个版本号。

NTC 接在 J1,标称 25℃时 100 kΩ、B 值3950。R12 为130 kΩ,上端接3.3 V,下端与NTC组成分压节点。温度升高,NTC阻值下降,节点电压也跟着下降。

NTC分压、LM358跟随与21倍放大电路

图3 U7 的 A 路构成跟随器,输出经 R13 到 ADC0;B 路由 R14、R16 设定增益,输出经 R17 到 ADC1。

这里不能把 LM358 简写成“缓冲一下送 ADC”。A 路输出反馈到反相端,形成近似1倍跟随。B 路同相输入接前级输出,反馈电阻为20 kΩ,对地电阻为1 kΩ,因此理想闭环增益是:

G = 1 + R14 / R16
  = 1 + 20k / 1k = 21

ADC0 和 ADC1 也不是两颗 ADC 的输入。它们分别接到 U15(SGM3157)的 B0、B1,公共端 A 才接到 ESP-12F 的 ADC 引脚。选择端 SWITCH 接 GPIO16。软件需要同时知道读数和所选通道,只保存一个整数不够。

SGM3157把ADC0和ADC1切换到公共ADC网络

图4 两条模拟路径共用一个 ADC。通道切换后必须留出经过验证的建立时间,切换瞬间的读数不能混入温度滤波。

25℃这个点已经越过有效量程

按 ESP8266 官方接口说明,TOUT 外部采样的单位为1/1023 V,对应10位、标称约1 V量程。官方硬件问答也明确说明,输入大于1 V可能得到异常结果。不能把带外部分压的开发板 A0 规格直接套到 ESP-12F。

在理想器件条件下,25℃时的分压节点电压为:

Vntc = 3.3 × 100k / (130k + 100k)
     ≈ 1.435 V

1.435 V 已超出有效测量范围。这不是把软件参考电压改成3.3 V就能解决的问题,也不能把满量程读数硬算成一个“正常室温”。图中可选的3.3 V稳压管并不是1 V量程限制器。

两个采样通道的理想电压曲线及1V量程边界

图5 依据130 kΩ、100 kΩ/B3950计算的理想模型,非实测曲线。红色区域只表示超出ADC有效量程,不能理解成运放实际仍能线性输出那么高的电压。

按同一模型,ADC0 约在38.4℃以上才降到1 V以内;ADC1 则要到约152.2℃以上才进入1 V以内。这解释了双量程的用途:低温时使用跟随通道,高温时分压电压很小,放大后能多占一些 ADC 码位。

NTC温度 分压电压 ADC0理想码值 ADC1理想码值
25℃ 1.435 V 超出有效量程 超出有效量程
60℃ 0.530 V 约542 超出有效量程
160℃ 0.04036 V 约41 约867
200℃ 0.01879 V 约19 约404
250℃ 0.00849 V 约9 约182

表格只是理想量化结果,不是精度承诺。高温段如果一直走 ADC0,200℃附近只剩约19个码位,读数跳动很容易被温度公式放大。走 ADC1 可以改善量化利用率,同时也会放大运放偏置和增益误差,不能只看“21倍”就宣布测量更准。

冷态超量程也暴露出复现边界:当前连接不能直接提供完整的室温闭环测量。若要覆盖室温到高温,需要重新设计分压/量程或使用适合的外部ADC,并同步校准。本文保留现有电路作分析对象,不提供绕过测量有效性检查的冷态强制加热程序。

先还原分压电压,再反算温度

换算顺序应固定下来:ADC码值 → ADC输入电压 → 除以所选通道增益 → NTC阻值 → 温度。3.3 V只出现在分压反算,1 V才用于ADC码值换算。

Vadc = count / 1023 × 1.0 V
Vntc = Vadc / G
Rntc = 130000 × Vntc / (3.3 - Vntc)
T = 1 / [1/298.15 + ln(Rntc/100000)/3950] - 273.15

附件中的 decode_adc() 按这条链编写。以下是核心实现;完整函数另有通道、数值和分母检查。

if not settled:
    raise ValueError("sample invalid after channel switch")
if type(count) is not int or not 4 <= count <= 1019:
    raise ValueError("invalid, near-rail or overrange ADC code")
sensor_v = count / 1023.0 * full_scale_v / channel.value
r = 130_000.0 * sensor_v / (3.3 - sensor_v)
inverse_k = 1 / 298.15 + log(r / 100_000.0) / 3950.0
return 1 / inverse_k - 273.15

例如,选择 ADC1、读到404,理想模型得到约199.97℃。若误按 ADC0 解释,同一个整数会被换算成另一段温区。通道状态丢失,滤波算法再复杂也救不回来。

from qfhp_control import Channel, decode_adc

t = decode_adc(404, Channel.ADC1, settled=True)
print(f"{t:.2f} C")  # 理想向量约 199.97 C

4~1019是示例留下的近轨保护区,并非器件规定的故障阈值。接近0或满量程应先判无效,但单凭这一个数字,不能断言一定是断线、短路还是越量程。还需要结合通道、前端电压和硬件诊断。

量程切换也应有回差。例如在高增益输出留有余量时才切入,接近其上限时退出;阈值需用实际增益、偏置与噪声确定。切换后先等待建立,再收集有效样本,最后更新滤波器,避免把两个量程的原始码值直接平均。

失效读数不能继续沿用旧功率

探头掉线以后,最糟糕的行为是界面停在最后一次正常温度,功率输出继续保持。离线示例用 FaultLatch 演示另一种处理:未使能、采样无效、样本超时或超温时命令归零,故障被锁存;后来出现正常读数也不会自动解除。

from qfhp_control import Channel, FaultLatch

guard = FaultLatch()  # 初始不使能
guard.reset()         # 离线演示人工使能动作
ok = guard.command(0.4, 404, Channel.ADC1,
                   settled=True, age_s=0.1)
bad = guard.command(0.4, 404, Channel.ADC1,
                    settled=False, age_s=0.1)
print(ok, bad, guard.tripped)  # 0.4 0.0 True

示例默认0.5秒超时、260℃阈值,仅用于验证分支,不是加热台的安全定值。实际工程还需限制复位条件,独立处理探头脱离热源、功率器件短路等软件无法可靠识别或切断的故障。把功率上限设为95%,也不能代替保护。

MOC3041决定了调功不能随便套PWM

MOC3041、BT138与市电输入回路

图6 MOC3041SR2M 是过零型光耦可控硅驱动器。BT138负责负载电流,光耦承担触发接口,两者的额定值不能互相替代。

过零型驱动会在合适的电压过零区域触发。可控硅导通后也不会因为GPIO立刻变低就马上关断,而要等负载电流降到维持电流以下。因此,通用高频PWM的占空比不能直接当成这里的负载功率,任意相位触发的算法也不能原样套用。

对于热惯性较大的电阻性负载,可以研究较慢时间窗的通断比例。若采用整周分配,还要保证正负半周配对,并核实同步和触发时序。当前图纸未显示送给MCU的零点检测输入,下面只生成离线分配表,不是可直接输出GPIO的驱动。

from qfhp_control import cycle_plan

plan = cycle_plan(0.25, cycles=100)
print(len(plan), sum(plan))  # 100个整周位置,25个安排为开

在50 Hz下,100个整周是2秒。这个计算说明时间比例的含义,并不保证真实负载恰好得到25%功率;电网电压、负载特性、触发延迟及散热仍需验证。先把测量和执行量的含义校准,再讨论PID参数,调参才有可靠对象。

顶底面一起查采样的邻居

V1.4 PCB顶面完整导出图

图7 同一工程的PCB顶面。功率区、运放和ESP-12F位置需与原理图一起检查。

V1.4 PCB底面完整导出图

图8 PCB底面。顶面看似绕开的回路,底面仍可能靠近采样通道。

温度噪声排查可以从三个邻居入手:可控硅的大电流回路、ESP8266的供电瞬态、风扇启停回流。分别记录静态输入、网络活动和风扇动作下的ADC数据,才容易区分热变化与电气干扰。量程、时间戳与原始码值应一起记录,便于重算。

EDA数据的只读解析得到129条TRACK、106个VIA、8个安装孔和1条板框轨迹,能追踪到 L、N、SW、ADC0、ADC1等网络。这些是连接关系依据,不能代替ERC/DRC,更不能从截图像素直接推导爬电距离。F1、光耦、可控硅、接口及外壳的实际额定值仍需单独核实。

加热板与底座之间的层叠装配关系

图9 结构层叠关系。照片显示加热板、间隔层与底座的位置,不能据此确认探头接触质量;这仍需实物核对。

不接加热负载也能先验证什么

解压文末 qfhp-control-v1.1.0.zip,在Python 3.12下运行 python validate_qfhp.py。无需第三方库,也不会访问GPIO或驱动硬件。

固定向量验证结果如下:ADC0的542回算约60.00℃;ADC1的867、404、182分别回算约160.01℃、199.97℃、250.14℃。脚本同时检查冷态超量程、非法码值、未建立样本、超时、超温和非有限数输入,验证故障锁存不会被下一次正常读数自动清除。

这些结果证明的是模型和软件分支一致,不代表实体温度精度。实际校准仍需覆盖所用温区,并分别识别运放增益/偏置、NTC参数与安装造成的误差。室温越量程问题未解决以前,不应据此宣称完成全温区闭环设计。

温控调试最值得先做的工作,是让每一个温度数字都能回答三个问题:来自哪条通道、是否处在有效量程、距现在过去了多久。这三件事确定以后,PID才有机会把温度调稳。

资料与验证范围

技术交流,欢迎关注微信公众号:美男子玩编程。

创作许可协议

本项目采用 CC BY-NC-SA(署名-非商业性使用-相同方式共享) 进行许可。

评论(0)
- 没有更多了 -