☰
ADS122U04+STM32F746ZG:工业级高精度温度采集与控制系统设计
2026/11/5 3:11:40 网站建设 项目流程

做工业温度测量的人,应该都经历过这种尴尬:控制柜里变频器一启动,触摸屏上的温度直接跳了 2°C;热电偶线一接长,示波器上看到的不是温度,而是典型的 50Hz 工频干扰波形。我这次把 ADS122U04IPWR 和 STM32F746ZG 搭在一起做了一套温度采集与控制系统,目的就是把这些老问题一个个摁住。ADS122U04 是一颗 24 位 delta-sigma ADC,自带可编程增益放大器(PGA)、内部温度传感器、双路激励电流源,而且通信接口走的是 UART;STM32F746ZG 则是整套系统的大脑,负责 PID 调节、Modbus 通信和人机界面。这套组合的价值在于:ADC 专门管好微伏级信号,MCU 专心做系统,两者用最简单的串口连接,隔离也好做。下面我把从选型逻辑、硬件布局、寄存器配置、通信实现到标定验证的完整链路写一遍,给正在做工业或 HVAC 温控产品的工程师一个可以照抄的样板。

1. 这套方案的出现,是因为工业温度测量远比想象中麻烦

1.1 传感器信号小到让人想骂人

先说信号的量级。热电偶是最典型的例子:K 型热电偶灵敏度大约 41µV/°C,也就是说温度每变化 1°C,输出才变化 40 多个微伏。要分辨 0.1°C,就得能稳定检测 4µV 量级的电压变化;测到 1000°C 时,满量程输出也才 41mV 左右。哪怕是传感器原始信号大一些的 PT100 铂电阻,也不过是每 °C 变化 0.385Ω,用 1mA 激励电流驱动时,对应电压变化只有 0.385mV/°C。

而工业现场的环境噪声呢?变频器 IGBT 开关带来几百伏/微秒的 dv/dt,接触器吸合时电弧放电,继电器线圈断电瞬间的反电动势,还有 24V 交流变压器漏磁在空间里形成工频磁场。这些噪声叠加在微伏级的传感器信号上,想用单片机自带的 12 位 ADC 做高精度测温,基本就是拿漏勺舀水。

所以工业温度测量的第一条铁律是:信号链的前端必须由一个真正的精密模拟前端来承担,MCU 内置 ADC 在噪声、参考电压稳定性和分辨率上都撑不住这个场面。

1.2 为什么要把 ADC 从 MCU 里“拆”出来

STM32F746ZG 的内核是 Cortex-M7,主频跑到 216MHz,有 1MB Flash 和 320KB RAM,本身资源非常充裕,内部也确实带 ADC。但我在这个项目里坚决没用它的内部 ADC,原因有三条:

第一,内置 ADC 的分辨率和线性度有限。12 位分辨率配合过采样勉强能到 14~16 位有效位数,但噪声和 INL 摆在那里,K 型热电偶在整个量程上要求万分之几的精度时,内置 ADC 的线性度就先卡住了。

第二,参考电压的温漂不好控。内置 ADC 通常直接拿 VREF 引脚上的电压当参考,而这个电压往往就是板上的 3.3V 电源,温度一变、负载一变,它跟着漂,最后换算成温度就是好几度的误差。

第三,隔离和布局的问题。工业应用里模拟前端要和高压、强电区域隔离,ADC 必须尽量靠近传感器端子,而 MCU 往往要放在控制板的核心位置。两者分开,用一颗独立的 ADC 芯片,物理上的主动性就握在自己手里。

选择独立 ADC 之后,剩下的问题就是选哪颗。ADS122U04 这种自带 PGA、内部参考、双电流源的 24 位 delta-sigma ADC,相当于把一个完整的模拟前端打包成一颗 TSSOP-16 的小芯片,属于“专业人干专业事”的典型。

1.3 UART 接口不是退化,是工业场景的加分项

ADS122U04 最有意思的地方是它的通信接口不是 SPI 也不是 I2C,而是 UART。很多人第一反应是“这芯片怎么连个 SPI 都没有”,但放在工业场景里,这恰恰是它最值钱的特性。

原因在于隔离。模拟前端和 MCU 之间一旦需要做电气隔离,SPI 就要过 4 根信号线——SCLK、MOSI、MISO、CS。光耦也好、数字隔离器也好,都有传输延迟,SPI 时钟一旦拉到 10MHz 以上,时钟沿和数据的到达时间就容易错位,隔离之后 SPI 高速通信就成了一个专门找麻烦的环节。而 UART 只有 TX、RX 两根线,9600 波特率下每个位宽约 104µs,光耦的延迟只有几百纳秒,对信号时序毫无影响。两条隔离通道就能搞定全部通信,成本和可靠性都更友好。

再加上温度测量这件事本身数据量就小:20SPS 的采样率下,每秒钟不到 60 个字节,9600 波特率都嫌浪费。所以在这个场景里,UART 不是降级,是用最简单的方式解决了最麻烦的隔离问题。

2. 硬件设计:把精度和噪声问题挡在源头

2.1 电源树:先解决 ADC 的“脚下”问题

ADC 的电源纹波会直接耦合进测量结果,所以模拟供电必须单独处理。我的设计是:24V 或 5V 输入先经过一级 DC-DC 降到 3.8V 左右,再用一颗低噪声 LDO 稳压到 3.3V 给 AVDD 和 DVDD 供电,DC-DC 后面不直接进 ADC。

AVDD 和 DVDD 之间用一颗磁珠隔开,模拟电源引脚旁边放 0.1µF 的陶瓷电容加 10µF 的钽电容做低频去耦。关键的一点是:去耦电容要尽量靠近引脚,走线先过电容再到引脚,不要为了布线美观绕一大圈。我自己第一次画板就吃过这个亏,电容离引脚远了,纹波全灌进参考源,读数一直在抖。

地平面的处理上,我采用的是统一的完整地平面,没有把模拟地切割成孤岛,只是把 ADC 的模拟地引脚用一条短粗走线直接连回主地平面的星点,然后在这个星点上把所有模拟电路的电流汇入。切割地平面在多层板里反而容易制造回流环路,现代设计更推荐“整地 + 合理布局”的思路。

2.2 参考电压:能用比率测量就别用绝对电压

ADS122U04 内部有一个 2.048V 基准源,测热电偶时直接用内部基准就够了,因为热电偶信号本身很小,PGA 放大之后对基准电压的绝对精度要求可以通过标定来校正。但测 RTD 铂电阻时,我强烈建议走比率测量方案,不要依赖内部基准。

比率测量的原理很简单:用 ADC 的一个 IDAC 电流源同时驱动 RTD 和一个精密参考电阻,参考电阻上的压降作为 ADC 的参考电压 Vref,RTD 上的压降作为输入信号。因为同一个电流流过两者,电流的任何漂移在信号和参考上同步出现,最后转换结果里的电流项被完全抵消。最终测量精度只取决于参考电阻本身的精度和温漂。

我选的是 2.05kΩ、0.1% 精度、25ppm/°C 温漂的精密电阻。配上 1mA 的 IDAC 电流,参考电压约 2.05V,满量程输入范围在 PGA 增益为 4 时约 ±512mV,而 PT100 从 0°C 到 850°C 的电压变化也只有 0 到 391mV,裕量足够,分辨率还很高。

激励电流不是越大越好。PT100 在 1mA 下的自热功率是 I²R,也就是 0.1mW,对封装良好的探头引入的自热误差大约在 0.02~0.05°C 量级;如果环境温度要求苛刻,把电流降到 0.25mA,自热功率直接降 16 倍,但信号电压也同步变小,需要把 PGA 增益升高来补偿。

2.3 输入滤波:RC 参数不是拍脑袋定的

ADC 输入端必须加 RC 滤波,这既是滤除带外噪声,也是给 delta-sigma 调制器提供一个稳定的源阻抗。RTD 通道我用的差分滤波是每根走线串 100Ω,两条线之间并一颗 100nF 电容,等效差分截止频率约 8kHz,足够让高频 EMI 挡在 ADC 门外。

热电偶通道我会把串联电阻加大到 1kΩ,再在两条输入线上分别对地加 1nF 的共模电容,这样能把空间耦合进来的共模干扰压下去。但这里有个容易忽略的坑:输入串联电阻必须保持两条支路完全对称,否则 ADC 的输入偏置电流流过不对称电阻时会产生差分失调电压,直接变成温度误差。我见过有人只在正输入端串电阻做保护,结果 20°C 的室温下读数漂了 1.3°C,排查了半天才找到这根“独臂电阻”。

传感器的接口保护也别忘了。热电偶是外露器件,现场插拔、误接线都有可能发生,我在两个输入端对地和对电源轨各接了一对 BAT54S 肖特基二极管做钳位,ESD 浪涌脉冲进来时先把能量泄放掉,ADC 的损坏率明显下降。

2.4 长线缆与接口电平

HVAC 现场的温度探头经常要拉很长的线,三五十米很常见,工业现场上百米也不稀奇。长线缆的核心处理手段就两条:屏蔽双绞线 + 单端接地。屏蔽层应该只在一端接地,通常接控制柜侧的系统地;如果两端都接地,地电位差会在屏蔽层上形成电流,反而把噪声耦合进信号。双绞线保证两根芯线受到的电磁感应尽量相等,配合 ADC 的差分输入正好把共模干扰抵消。

信号线和动力线在工程上必须分槽走,这一点没什么商量余地。实在避免不了平行走线时,要保证 20cm 以上的间距,交叉时垂直穿越。

3. 寄存器配置:一次把 ADS122U04 吃透

3.1 寄存器总览与上电初始化顺序

ADS122U04 的配置面非常集中,一共就 4 个配置寄存器,地址从 00h 到 03h:00h 是 CONFIG 寄存器,管 PGA 增益、工作模式、参考源选择和采样率;01h 是 MUX 寄存器,管通道选择和 IDAC 电流源的输出引脚;02h 是 SYS 寄存器,管内部温度传感器、转换模式和 CRC 功能;03h 是 IDAC 寄存器,管两路电流源的电流档位。另外还有一个数据寄存器用来读取 24 位转换结果。

上电初始化顺序我建议这样走:先给 DVDD/AVDD 上电,等 2ms 让电源稳定,然后直接向 4 个配置寄存器写入目标值。写完以后做一次读回校验,把读出来的字节和写进去的比对,不一致就重新初始化。不要小看这一步,UART 一旦有过一帧错位,后续所有寄存器都可能被写进错误数据,读回校验是最便宜的防线。

有一点值得注意:芯片上电后的默认配置是连续转换模式、20SPS、PGA=1,不初始化它也能流数据。但如果不按自己的目标值重配一遍,后面改变通道或者增益时就会出现“你以为配了其实没配上”的幻觉。我的习惯是初始化代码里显式把四个寄存器全部写一遍,不接受默认值。

3.2 通道选择与 PGA 增益:先算满量程,再谈精度

配置 PGA 增益之前,先做一道非常简单的算术:ADC 的差分满量程输入范围约为 ±(Vref / Gain)。比如内部基准 2.048V,增益为 4 时满量程 ±512mV,增益为 128 时只剩 ±16mV。信号幅度不能超过这个范围,否则直接削波;信号幅度又最好占满量程的 50% 以上,否则分辨率浪费。

传感器类型信号范围推荐增益满量程输入范围
热电偶 K 型,-50~150°C约 -1.9~6.1mV64±32mV
热电偶 K 型,0~1000°C0~41mV32±64mV
PT100,-50~200°C,1mA 激励80~175mV4±512mV
PT1000,-50~200°C,0.25mA 激励21~55mV16±128mV

热电偶用高增益的原因是信号实在太小,增益 64 在这个场景下能把有效位数“撑”大很多。但别盲目追求最高增益:增益越高,满量程越窄,一旦共模干扰或者传感器老化导致信号漂移超限,就会规律性地削波。留 30% 左右的头部余量是工程上的稳妥做法。

3.3 数据速率与工频抑制

ADS122U04 的可选数据速率从 20SPS 一直到 330SPS。在 50Hz 工频噪声环境里,20SPS 是默认最优解,因为此时数字滤波器的陷波特性对 50Hz 和 60Hz 都有很强的抑制,手册上的典型值在 85dB 以上,就是说 220V 交流带来的差模干扰会被衰减到几乎不可见。

如果你为了加快巡检速度把速率拉到 175SPS 或者 330SPS,滤波器的陷波位置就变了,工频干扰会重新冒出来。所以我的设计原则是:每个通道固定用 20SPS 或 45SPS,不做动态切换。SPS 切换本身会引入一个滤波器重新收敛的过渡期,在这个过渡期里读到的数据是不可信的,做控制逻辑的人根本没法处理这种“突然抖一下”的数据。

另外一个容易被忽略的点是:每次切换通道或者改变 PGA 增益之后,滤波器需要几个周期的建立时间。实测下来,前 2~4 个转换结果直接丢弃,从第 5 个开始采集,能有效避免软件读出毛刺。反正 20SPS 下多等 200ms 在暖通空调这种慢变系统里完全无感,换来的是数据干净。

3.4 IDAC 电流源与 RTD 比率测量

ADS122U04 内部有两个 IDAC 电流源,电流档位从 50µA 到 1500µA 分档可调,并且可以分别路由到不同的模拟输入引脚。做 3 线制 PT100 时,标准接法是:一路 IDAC 从正输入端灌入,电流流过 RTD 后再从两条返回支路分别走回地,其中一条返回支路接到负输入端,另一条直接回地。这种接法的好处是两条引线的电阻如果相等,它们在差分输入上的压降刚好抵消,引线电阻的误差就消失了。

比率测量的精妙之处前面说过,信号和参考来自同一个电流,电流漂移自动抵消。这意味着现场环境下电源缓慢变化、温度缓慢变化都不会直接影响测量结果,长期稳定性非常有保证。做 HVAC 这种要连续跑几年的产品,这种“天生的抗漂移”特性比任何事后校准都可靠。

4. STM32F746ZG 的 UART 通信实现

4.1 帧结构:命令、数据、校验

ADS122U04 的通信协议本身不复杂,它就是典型的寄存器读写模型:主机通过 RXD 线发送命令字节,命令字节里编码了读写方向、寄存器地址和后续数据长度;芯片收到后通过 TXD 线把响应发回来。读数据寄存器时,芯片会返回 24 位转换结果,按 3 个字节输出,高位在前。

UART 参数是标准的 8 数据位、无校验、1 停止位。上电默认波特率 9600,这个波特率下跑 20SPS 的数据流绰绰有余。要注意的是每一次读操作都要有一个明确的事务边界,我的做法是在 STM32 侧启用 USART 的 IDLE 中断,也就是总线上空闲超过一个字节时间就认为一帧结束,这样可以自动应对芯片返回数据长度变化的情况。

实际应用中我不建议完全裸调命令字节,而是在 MCU 侧再包一层简单的软件协议:一个周期性的管理任务每隔 500ms 主动发一次 NOP 命令探测链路状态,如果连续三次没有响应,就判定通信故障并触发重初始化流程。这个心跳机制看起来笨,但在工业现场非常管用,很多莫名其妙的“温度卡死”其实都是通信链路悄然断开导致的。

4.2 波特率切换:从 9600 起步

这芯片有个非常独特的波特率配置方式:不需要写寄存器,只要在新的波特率下发送一个单字节的 0x00,芯片就会自动检测并对齐新波特率。我实测从 9600 切到 115200 是稳定的,切换完成后正常读写都没有问题。

但这里藏着一个工程陷阱。芯片内部的时钟是基于内部 RC 振荡器校准的,默认 9600 波特率在校准点附近非常准,但如果环境温度跑到 85°C 或 -20°C,内部 RC 的漂移可能达到百分之几。115200 波特率下位宽只有 8.7µs,接收端的采样点稍偏就会出现偶发帧错误;9600 波特率下位宽 104µs,同样的漂移占比只有十分之一,完全压得住。我的板子在高温箱里 115200 出现过偶发通信失败,换成 19200 之后满温区跑了两天零误码。所以正式产品如果要在宽温区长期工作,我建议波特率最高只用到 19200,别为了省那点传输时间给自己埋雷。

4.3 通信容错:CRC 与重同步

ADS122U04 支持在通信帧上附加 CRC 校验字节,建议在系统寄存器里直接打开。校验失败就整帧丢弃,等下一帧。但光有 CRC 还不够,因为没有校验帧重发机制,丢一帧就少一帧,连续丢帧时控制回路就会缺数据。

我做了两件事来兜底。第一件是 NOP 重同步:一旦检测到状态机不对、接收超时或者连续校验失败,就向芯片连续发送 3~5 个 0x00 字节。这招实测几乎每次都能把串口状态机拉回正常,比直接断电复位温和得多,也不会打断正在进行中的转换。第二件是软看门狗:给 ADC 通信设一个 1 秒的窗口,如果窗口内没有任何有效数据,就通过一个 GPIO 控制 AD 芯片的复位脚做一次硬复位,再重新执行完整初始化序列。

STM32F746ZG 的 USART 本身带有 FIFO,这个必须打开。在 330SPS 和 115200 波特率的高负荷组合下,FIFO 能显著降低溢出风险;即使只是 20SPS 的慢速场景,开了 FIFO 也能让中断响应时间变得宽松,不容易出现“中断还没进来数据被覆盖”的情况。

4.4 中断还是 DMA

20SPS 这种低速场景,用中断收数据就行。中断里只做一件事:把收到的一个字节填进环形缓冲区,然后把所有解析工作放到主循环或者低优先级任务里。这样可以避免在中断上下文里做浮点换算和滤波,把中断花销压到最低。

如果未来要跑 330SPS 的高速率,我建议切换到 DMA + IDLE 中断的收数方式:DMA 负责把串口数据直接搬进内存环形队列,IDLE 中断负责在帧间空隙标记一帧的边界,CPU 只在整帧到达后才被唤醒处理一次。STM32F746 的 USART 和 DMA 配合得很顺,这个方案可以在几乎没有 CPU 占用的情况下把串口数据流全部接住。

伪代码大概长这样:

void USART2_IRQHandler(void) { if (LL_USART_IsActiveFlag_IDLE(USART2)) { LL_USART_ClearFlag_IDLE(USART2); frame_ready = 1; // 置位;数据已由 DMA 搬运到 dma_rx_buf } } // 主循环 if (frame_ready) { frame_ready = 0; if (crc_check(dma_rx_buf, received_len)) handle_adc_frame(dma_rx_buf); received_len = 0; LL_DMA_SetCurrentMemoryStart(DMA1, ...); // 重置 DMA 后继续收 }

5. 热电偶冷端补偿与 RTD 线性化的工程实现

5.1 冷端补偿:放在“等温块”上才算数

热电偶测的是热端与冷端的温差,冷端就是热电偶线落在 PCB 端子上的那个位置。ADS122U04 内部自带温度传感器,可以直接读数做冷端补偿,在芯片附近温度等于端子温度的理想情况下,这个方案精度很不错。

但我的实际板子上有个教训:冷端不是芯片,是螺丝端子。芯片和端子之间隔着走线、隔着旁边功率器件散发的热量,如果 MCU 跑高负载时板子温度整体上升 3°C,而内部传感器跟着芯片温度走、端子温度变化更慢,两者之间就会凭空多出一两度的误差。这在追求 ±0.5°C 系统精度的场景里是完全不可接受的。

所以实际项目里我在端子排的等温块区域加了一颗独立的 NTC 或数字温度传感器(比如 TMP117),贴片压在端子正下方,用 STM32 直接读,再拿这个温度做冷端补偿。实测效果立竿见影:内部传感器方案在 MCU 满负载时误差能到 1.2°C,换成端子温度方案后压回了 0.1°C 以内。如果你的设计用的是内部温度传感器,至少要做一个“箱内温度梯度标定”,用最大功耗工况下的偏差做查表修正。

5.2 RTD 线性化查表

PT100 的电阻-温度关系不是线性的,HVAC 常用的 -40~150°C 范围虽然非线性不大,但要做 0.1°C 精度还是必须校正。工程上最实用的做法是查表加线性插值:维护一张每 10°C 一个点的电阻-温度表,实测电阻落在两个表项之间时线性内插。

STM32F746ZG 带硬件 FPU,这种插值运算一秒钟算几万遍都没压力,完全不用纠结性能。高精度数学公式(Callendar-Van Dusen 方程)在 -200~850°C 全量程是标准做法,但对 HVAC 的窄量程来说,查表法的代码更直观、调试更容易,维护的人也看得懂。

我这里具体用的是 -40°C 到 150°C、间隔 10°C 的 20 个表项,用 float 型存电阻和温度,插值公式就是最普通的线性比例。加上前面的增益和失调标定系数,整体温度换算误差能压在 0.05°C 以内,超过仪器本身的重复性极限,足够用了。

5.3 现场标定流程

现场标定我推荐用精密电阻代替恒温槽。恒温槽体积大、升温慢、校准成本高,而精密电阻是即插即用的“温度标准器”。做法是:给 PT100 输入 100.00Ω(对应 0°C)和 138.51Ω(对应 100°C)两个标准电阻,从 ADC 读回原始码值,然后做两点的增益和失调校正:

实际温度 = 标定系数A × 原始计算温度 + 标定系数B

系数 A 和 B 就两个方程解出来,存进 STM32F746ZG 的 Flash 专用扇区或者外部 EEPROM。以后每次上电时读取,如果读不到就回退到默认系数,并打一个标定缺失的告警。热电偶的标定过程类似,但冷端温度必须用你最终方案采用的传感器(比如端子处的 NTC)作为补偿基准,有条件的话再用一个已知温度的参考源验证一遍整链路。

6. HVAC 场景下最容易翻车的几个环节

6.1 与 24V 交流负载共存的隔离策略

HVAC 控制柜的典型环境是:24V 交流驱动电动阀和接触器,可控硅或继电器切换负载,变压器漏磁到处乱飘。如果你的 ADC 和 MCU 直接共用一个地平面,交流负载开关动作产生的尖峰就会顺着地线灌进模拟前端。

我的处理方案是把 ADC 测量部分做成一个独立的小模块,与 MCU 之间用数字隔离器连接。前面说了 UART 做隔离是天然优势,两颗数字隔离器(一路 TX、一路 RX)就完全打通了。隔离器选型注意两点:一是要选双向且带使能控制的型号,防止上电时序混乱时总线锁死;二是隔离器两边的电源要各自独立去耦,隔离电源输出端再加一级 LDO 稳压。

板子布局上,继电器、可控硅、变压器这些强电器件与模拟前端保持至少 10mm 的间距,两者之间的布线不要平行长距离走线。条件允许的情况下,把 ADC 模块放在端子排旁边,把强电驱动放在另一侧,中间用地平面做了隔离缝合孔——这个布局上的退让,比堆任何滤波器件都有效。

6.2 看门狗、通信超时与数据有效性判断

MCU 侧开独立看门狗这是基本操作,不用多说。ADC 通信侧也要有自己的“看门狗”逻辑,和 MCU 看门狗错开:ADC 通道 1 秒无有效数据 → 判定通信故障 → 自动重连;连续 3 次重连失败 → 系统进入降级模式,温度取备份传感器的值,并给上位机报故障码。这种降级逻辑在 HVAC 里尤为重要,因为主控不能因为一路温度丢失就停掉风机和阀门,那会造成更大的设备事故。

数据有效性判断也不可或缺。24 位转换结果如果长期贴着正向满量程,通常是热电偶断线了——输入开路时偏置电流会把输入端拉到接近参考电压的电位。反过来,RTD 读数接近零码值,则是传感器短路。我的代码里对这些异常状态做了专门的位标记,并且要求连续两次采样都异常才上报,避免偶发毛刺触发误报警。

6.3 低功耗/巡检模式下的测量节奏

不少 HVAC 温控器是电池供电或者希望做到极低功耗的。这种场景下让 ADC 连续跑 20SPS 是奢侈的,更好的节奏是 1Hz 巡检:大部分时间让芯片休眠,用 RTC 或者低功耗定时器定时唤醒。

唤醒之后不要急着读数,先等电源和参考电压稳定,然后以 330SPS 连续采 16 个点,做一个算术平均或者中值滤波,一次巡检的总耗时控制在 50ms 左右,剩下的时间让 MCU 回 STOP 模式和 ADC 进入低功耗待机。这样一节锂电池撑一年毫无压力。注意高速率下的数据不要直接用单点,高速意味着数字滤波器的抑制能力弱,单点噪声偏大,取平均之后等效噪声才能拉回 20SPS 的水平。

7. 实测数据与踩坑记录

7.1 一组实测的精度数据

标定完成之后,我用精密电阻箱做了一组 PT100 通道的验证数据(1mA 激励,PGA=4,20SPS,每个点取 100 个样本平均):

标准电阻对应温度实测显示温度误差
0°C(100.00Ω)0.03°C+0.03°C
25°C(109.73Ω)24.97°C-0.03°C
50°C(119.40Ω)50.02°C+0.02°C
100°C(138.51Ω)99.96°C-0.04°C

热电偶通道在 100°C 油浴里用 K 型热电偶测了 10 个循环,冷端补偿用端子 NTC 方案,读数稳定在 99.5~100.3°C 之间,波动主要来自油浴本身的温控振荡。另外在 20SPS 和增益 64 的条件下记录了 1000 个连续样本,峰峰值等效温度噪声约 0.05°C,对于一个 HVAC 现场控制板来说,这个底噪表现已经相当舒服。

7.2 三个让我折腾最久的坑

第一个坑是首次画板时的接地。当时想当然地把模拟地和数字地在 PCB 上分成两片,中间只留一个窄桥,结果 ADC 读数在 50Hz 上规律性跳动。后来重新走线,改成完整地平面加星点回流,输入滤波再配合调整,问题才彻底消失。教训是:模拟电路设计里的经典经验要结合现代多层板工艺重新理解,盲目的“地分割”很可能是噪声源头。

第二个坑就是前面提过的波特率。我在 115200 波特率下做高低温试验,85°C 时出现偶发帧错误,一开始怀疑是隔离器高温性能下降,查了很久才发现是芯片内部 RC 振荡器随温度漂移。换成 19200 波特率之后,-20°C 到 85°C 连续跑了两天,通信零误码。那条“宽温区最高用 19200”的原则,就是被这个坑砸出来的。

第三个坑是冷端补偿的“温度梯度幻觉”。最初用芯片内部温度传感器做补偿,常温调试一切正常,一旦把主控的 LCD 和网络功能全开起来,板子温升 3°C,测量误差直接涨到 1°C 以上。这让我意識到冷端温度不是你“想当然的那个位置”的温度,而是热电偶真正落脚的端子位置的温度。后来改成端子旁 NTC 方案后,这个问题彻底消失。

整套系统做下来,我最大的体会是:ADS122U04 和 STM32F746ZG 这对组合的价值不在于某一颗芯片有多强,而在于把“精密模拟”和“通用计算”这两个矛盾的需求干净地拆开了——模拟前端负责把微伏信号变成可靠的数字量,Cortex-M7 只管在上面做控制逻辑和人机交互。如果你正在做类似的工业或 HVAC 温控项目,建议把本文的电源布局、比率测量、波特率选择和冷端补偿这几条直接抄进你的设计里,能少走很多弯路。最后再分享一个小建议:寄存器配置里留一个通过命令可调的增益和采样率入口,现场传感器类型换来换去的时候,你会发现这个小小的设计能帮你省下好几天重新烧固件的时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询