基于ADS122U04IPWR与STM32F427ZI的工业测温方案设计

1. 工业测温项目的整体设计思路

1.1 为什么选 ADS122U04IPWR 这颗 24 位 ADC

工业现场和 HVAC 场景下的温度测量,跟实验室里拿个万用表戳两下的玩法完全不是一回事。工业环境里电磁干扰大、走线长、地电位漂移严重,再加上 PT100、PT1000、热电偶这些传感器输出的信号本身就非常微弱——PT100 在 0 摄氏度时只有 100 欧姆,满量程变化也就几十毫欧每摄氏度,热电偶更夸张,输出是微伏级别的。这种信号如果直接进 STM32F427ZI 的内部 12 位 ADC,基本等于把有用信号扔进噪声里搅一搅,根本分不出来。

ADS122U04IPWR 是 TI 的一款 24 位、4 通道、带 PGA 的 delta-sigma ADC,内置低噪声可编程增益放大器,增益最高能到 128 倍,还集成了激励电流源、基准电压和温度传感器。这几个特性凑在一起,正好对上工业测温的痛点:小信号直接在前端放大,不用外挂运放;内置 IDAC 可以直接给 RTD 提供激励电流,省掉恒流源电路;24 位分辨率意味着理论 LSB 能到微伏级别,配合 PGA 后有效分辨率依然足够覆盖 0.01 摄氏度的测温精度需求。

选它而不是选 ADS1220 或者 ADS1248,主要考虑是 U04 后缀支持 UART 接口,跟 STM32F427ZI 的 USART 外设对接非常直接,不需要额外占用 SPI 片选和时钟线,在工业现场走线更省心。而且 UART 接口天然支持隔离,后面加个数字隔离器就能把模拟侧和数字侧彻底分开,这对 HVAC 这种经常跟大功率电机、变频器共处的场景特别重要。

1.2 STM32F427ZI 在这个方案里扮演什么角色

STM32F427ZI 是 ST 的 Cortex-M4 系列,主频 180MHz,带 FPU 和 DSP 指令,Flash 最大 2MB,SRAM 256KB。拿它做温度测量的主控,性能是绰绰有余的。但选它不只是因为性能富余,更关键的是它的外设资源匹配度。

首先它有多个 USART,可以一路接 ADS122U04IPWR 做数据采集,另一路接上位机或者 Modbus 总线做数据上报,互不干扰。其次它的定时器资源丰富,可以用一个高级定时器产生精确的采样触发时序,保证采样率稳定。再者它的 DMA 控制器可以配合 USART 做无阻塞收发,CPU 不用一直守着串口等数据,可以腾出来做温度换算、滤波、报警判断这些事。

另外 F427ZI 的供电范围是 1.8V 到 3.6V,跟 ADS122U04IPWR 的数字侧供电可以共用 3.3V 轨,电平匹配不用额外做转换。工业现场如果要用 5V 逻辑,加个电平转换芯片就行,但大多数现代工业设备已经全面 3.3V 化了,直接对接没问题。

1.3 整体信号链是怎么走的

整个方案的信号链可以这样理解:传感器(PT100 或热电偶)把温度转换成微弱的电压或电阻变化,ADS122U04IPWR 通过内置 IDAC 给 RTD 提供激励电流,或者直接读取热电偶的微伏信号,经过 PGA 放大后进入 24 位 delta-sigma 调制器,转换成数字码流,再通过 UART 发给 STM32F427ZI。STM32 收到原始码值后,先做冷端补偿(热电偶场景)或者查表/公式换算(RTD 场景),然后做数字滤波,最后输出温度值。

这个链路里最容易被忽视的是基准电压。ADS122U04IPWR 可以用内部 2.048V 基准,也可以用外部基准。内部基准的温漂是 5ppm/摄氏度典型值,对于 0.01 摄氏度精度的测温来说,如果环境温度变化 20 摄氏度,基准漂移带来的误差大约是 0.0001 摄氏度,完全可以忽略。但如果用外部基准,比如 REF5025,温漂可以做到 3ppm/摄氏度,但成本上去了,而且多一个器件多一份故障率。我的经验是,除非做计量级设备,否则内部基准够用了。

2. 硬件设计里那些容易踩坑的细节

2.1 模拟前端电路的布局要点

ADS122U04IPWR 是 TSSOP-16 封装,引脚间距 0.65mm,手工焊接有点难度,但不算不可逾越。真正难的是布局。模拟输入引脚 AIN0 到 AIN3 的走线必须尽量短,而且要走成差分对,两条线等长、平行、紧挨着。如果传感器离板子比较远,比如 HVAC 里温度探头装在风管上,板子在控制柜里,那走线可能有好几米,这时候必须用屏蔽双绞线,屏蔽层单点接地,接在板子的模拟地平面上。

IDAC 的输出引脚要单独走线到 RTD,不能跟数字信号线平行走。我见过一个案例,IDAC 走线跟 UART 的 TX 线平行走了 5 厘米,结果采样数据里出现了跟串口波特率同频的周期性噪声,后来把 IDAC 走线绕到板子另一层才解决。这个坑很隐蔽,因为噪声频率跟温度变化无关,看温度曲线像是随机跳动,但用示波器看电源纹波又看不出来,最后是用频谱分析才定位到的。

去耦电容的放置也有讲究。ADS122U04IPWR 的 AVDD 和 DVDD 各需要 0.1uF 和 1uF 的电容,0.1uF 必须紧贴引脚,1uF 可以稍微远一点但也不能超过 5mm。模拟地和数字地要在芯片下方用 0 欧姆电阻或者磁珠单点连接,不能直接铺铜连在一起。这个单点连接的位置要选在芯片的 AGND 和 DGND 引脚附近,让回流路径最短。

2.2 基准电压和激励电流源的配置

ADS122U04IPWR 的内部基准是 2.048V,可以通过寄存器选择。如果测 PT100,在 0 摄氏度时电阻 100 欧姆,用 1mA 激励电流,产生的电压是 100mV。PGA 增益设成 16 倍,放大后是 1.6V,跟 2.048V 基准匹配得不错,能充分利用 ADC 的动态范围。如果测 PT1000,0 摄氏度时 1000 欧姆,用 0.5mA 激励,电压是 500mV,PGA 增益 4 倍,放大后 2V,也很合适。

这里有个计算过程要说明:假设我们要测 0 到 100 摄氏度,PT100 在这个范围的电阻变化是 100 到 138.51 欧姆,对应电压变化是 100mV 到 138.51mV(1mA 激励)。这个变化量只有 38.51mV,如果 PGA 增益是 16,放大后是 616mV 的变化量。24 位 ADC 在 2.048V 基准下的 LSB 是 2.048V 除以 2 的 24 次方,约等于 0.122uV。616mV 对应大约 505 万个码值,分给 100 摄氏度的范围,每摄氏度大约 5 万个码值,分辨率远远超过 0.01 摄氏度。所以从分辨率角度看,这个配置是绰绰有余的。

但实际有效分辨率受噪声限制。ADS122U04IPWR 在 PGA 增益 16、数据率 20SPS 时的有效分辨率大约是 21.5 位,折算下来有效 LSB 大约是 0.5uV。616mV 对应大约 123 万个有效码值,每摄氏度大约 1.23 万个码值,依然能轻松分辨 0.01 摄氏度。所以数据率不用设太高,20SPS 足够,还能有效抑制工频干扰。

2.3 与 STM32F427ZI 的接口连接

ADS122U04IPWR 的 UART 接口是 2 线制,TX 和 RX,波特率最高支持 115200。跟 STM32F427ZI 连接时,ADS 的 TX 接 STM32 的 RX,ADS 的 RX 接 STM32 的 TX,交叉连接。如果中间要加隔离,可以用数字隔离器,比如 ISO7721 或者 ADuM1201,但要注意隔离器的传输延迟不能太大,否则会影响高速通信。115200 波特率下,位宽是 8.68us,隔离器的延迟通常在几十纳秒到几微秒,问题不大。

STM32 这边用 USART 的 DMA 模式收发。发送命令时,把命令字节写入 DMA 缓冲区,启动 DMA 发送,发送完成中断里再启动 DMA 接收。接收用空闲中断加 DMA,这样一帧数据收完就能立刻处理,不用轮询。这个套路在 STM32 上很成熟,HAL 库和 LL 库都能实现,我用的是 LL 库,代码更精简,中断响应更快。

有个细节要注意:ADS122U04IPWR 的 UART 是 8 位数据位、无校验、1 位停止位,跟 STM32 的默认配置一致。但 ADS 的 UART 在空闲时 TX 线是高电平,跟标准 UART 一样,所以直接连没问题。如果中间加了反相器或者光耦,就要注意极性对不对,我见过有人用光耦隔离结果忘了光耦是反相的,数据死活收不对,查了半天才发现。

3. 固件实现的核心环节

3.1 ADS122U04IPWR 的寄存器配置流程

ADS122U04IPWR 有 4 个配置寄存器,分别控制输入多路复用器、增益、数据率、工作模式等。上电后首先要做复位,可以发复位命令或者拉低 RESET 引脚。复位后所有寄存器回到默认值,然后按顺序配置。

配置顺序建议是:先配寄存器 0,设置输入通道和增益;再配寄存器 1,设置数据率和工作模式;再配寄存器 2,设置基准和 IDAC 电流;最后配寄存器 3,设置 IDAC 路由和烧毁检测。这个顺序不是强制的,但按这个顺序来逻辑最清晰,不容易漏配。

具体到 PT100 测温,寄存器 0 要设置 MUX 选择 AIN0 和 AIN1 作为差分输入,增益设成 16。寄存器 1 设置数据率 20SPS,连续转换模式。寄存器 2 设置基准为内部 2.048V,IDAC 电流 1mA。寄存器 3 设置 IDAC1 路由到 AIN0,IDAC2 路由到 AIN3(如果做三线制 RTD 的话)。配置完后发 START 命令,ADC 就开始连续转换了。

读数据时,发 RDATA 命令,ADS 会返回 3 个字节的转换结果,高位在前。STM32 收到后拼成 24 位有符号数,然后做换算。换算公式是:电压等于码值乘以基准电压除以 2 的 23 次方(因为是有符号数,满量程是 2 的 23 次方减 1)。然后根据电压反推电阻,再查表或者用 Callendar-Van Dusen 公式算温度。

3.2 温度换算的数学处理

PT100 的温度换算,工业上常用两种方法:查表法和公式法。查表法精度高但占 Flash,公式法省空间但计算量大。STM32F427ZI 有 FPU,算公式法毫无压力,所以我一般用公式法。

Callendar-Van Dusen 公式是这样的:对于 0 到 850 摄氏度,R(t) = R0 * (1 + At + Bt^2),其中 R0 是 0 摄氏度时的电阻,PT100 是 100 欧姆,A 是 3.9083e-3,B 是 -5.775e-7。对于 -200 到 0 摄氏度,还要加一项 C*(t-100)*t^3,C 是 -4.183e-12。实际测温范围如果是 0 到 100 摄氏度,用前两项就够了,误差在 0.01 摄氏度以内。

反推温度时,需要解二次方程。已知 R(t),求 t。可以把公式改写成 Bt^2 + At + (1 - R/R0) = 0,然后用求根公式。因为 B 是负数,抛物线开口向下,取正根。这个计算在 STM32 上就是几个浮点乘加和一次开方,FPU 一个周期就能搞定,实时性完全没问题。

热电偶的换算更复杂,因为要冷端补偿。ADS122U04IPWR 内置了一个温度传感器,可以读芯片温度作为冷端温度。但芯片温度跟实际冷端温度可能有偏差,因为芯片自身会发热。我的做法是用一个单独的 NTC 或者 DS18B20 贴在接线端子附近测冷端温度,精度比芯片内置传感器高。然后根据热电偶类型(K 型、J 型等)查 ITS-90 分度表或者用多项式拟合,把热端电压加上冷端对应的电压,再反查温度。

3.3 数字滤波和抗干扰策略

工业现场的噪声主要来自工频干扰和变频器的高频开关噪声。ADS122U04IPWR 的 delta-sigma 调制器本身有很强的抗混叠能力,但工频干扰还是要靠数据率来抑制。20SPS 的数据率对应 50Hz 和 60Hz 的陷波,因为 sinc 滤波器的零点正好落在这些频率上。如果现场工频是 50Hz,就选 20SPS;如果是 60Hz,也选 20SPS,因为 20SPS 对 50Hz 和 60Hz 都有抑制作用。

但 20SPS 的建立时间是 50ms 左右,对于温度这种慢变量完全够用。如果要做更快的响应,可以选 45SPS 或者 90SPS,但工频抑制会变差。我的经验是,温度测量没必要追求高速,20SPS 甚至 10SPS 都行,稳定压倒一切。

在 STM32 这边,收到数据后还要做一次数字滤波。最简单的是滑动平均,比如取 16 个点做平均,能进一步压低随机噪声。但滑动平均会引入滞后,对于温度这种慢变量,滞后几秒钟无所谓。如果要做报警判断,可以用中值滤波加滑动平均的组合,先去掉明显的野值,再平滑。我一般用 5 点中值滤波加 8 点滑动平均,实测下来既能去掉偶发的干扰尖峰,又能保持曲线平滑。

还有一个技巧是动态调整滤波强度。当温度变化率大的时候,减少平均点数,提高响应速度;当温度稳定的时候,增加平均点数,提高精度。这个逻辑用 STM32 实现很简单,判断连续几次采样的差值,如果超过阈值就切换滤波参数。

4. 常见问题与排查技巧实录

4.1 采样值跳动大怎么办

采样值跳动是最常见的问题,原因可能有很多。第一步先看跳动幅度和频率。如果跳动是随机的,幅度在几十个码值以内,那可能是正常的噪声,加强滤波就行。如果跳动幅度很大,比如几百上千个码值,那肯定有问题。

先查电源。用示波器看 AVDD 和 DVDD 的纹波,如果纹波超过 10mV,就要加强去耦或者换 LDO。ADS122U04IPWR 对电源纹波很敏感,尤其是 AVDD,因为它是模拟电路的供电。我遇到过用开关电源直接供 AVDD 的情况,纹波 50mV,采样值跳得没法看,换成 LDO 后立刻稳定。

再查基准。如果基准电压不稳,所有采样值都会跟着漂。可以用万用表测基准引脚电压,看是否稳定在 2.048V。如果基准引脚有电容,检查电容是否虚焊或者容值不对。ADS122U04IPWR 的基准引脚需要 0.1uF 和 10uF 的电容,少一个都可能不稳。

最后查输入。如果输入走线太长,或者屏蔽没做好,会引入共模干扰。可以试着在输入端加 RC 滤波,截止频率设在 1kHz 左右,对温度信号没影响,但能滤掉高频干扰。电阻用 1k,电容用 100nF,差分输入的话两个输入端各加一个电阻,电容跨接在差分对上。

4.2 温度读数偏差大怎么校准

读数偏差大通常是系统误差,不是随机噪声。系统误差的来源有:传感器本身的误差、激励电流的误差、基准电压的误差、PGA 增益的误差。这些误差叠加起来,可能让读数偏好几摄氏度。

校准的方法是两点校准。用一个高精度的温度源,比如干体炉,把传感器放到 0 摄氏度和 100 摄氏度两个点,记录 ADC 的码值。然后算出一个线性修正公式:实际温度等于斜率乘以码值加上截距。这个斜率跟理论斜率可能有差异,截距就是零点偏移。把这两个参数存在 STM32 的 Flash 里,每次换算时用修正后的公式。

但两点校准只能修正线性和零点误差,如果传感器非线性严重,比如热电偶,就需要多点校准。我一般用 0、25、50、75、100 五个点,用最小二乘法拟合一个三次多项式,精度能到 0.1 摄氏度以内。对于大多数工业应用,这个精度足够了。

还有一个容易忽视的点是自热效应。RTD 的激励电流会在电阻上产生热量,导致传感器温度略高于环境温度。1mA 激励在 100 欧姆上产生 0.1mW 的功率,对于小封装的 PT100,自热可能达到 0.1 摄氏度。如果要求高精度,可以把激励电流降到 0.5mA 甚至 0.1mA,但信号幅度也会减小,需要提高 PGA 增益来补偿。这个权衡要根据具体精度要求来定。

4.3 UART 通信不稳定的排查

UART 通信不稳定表现为数据错位、丢包、或者完全收不到数据。先查波特率。ADS122U04IPWR 的波特率是固定的 115200,不能改。STM32 这边要确保 USART 的波特率也是 115200,而且时钟配置要准确。如果 STM32 用的是外部晶振,一般没问题;如果用内部 RC 振荡器,误差可能超过 2%,导致通信失败。所以工业应用一定要用外部晶振。

再查接线。TX 和 RX 有没有接反,这是最常见的错误。ADS 的 TX 要接 STM32 的 RX,ADS 的 RX 要接 STM32 的 TX。如果中间有隔离器,还要确认隔离器的方向对不对。我见过有人用光耦隔离,结果光耦的输入输出接反了,数据完全不通。

如果接线没问题,用示波器看波形。ADS 的 TX 线在空闲时应该是高电平,发送数据时会有下拉脉冲。如果波形幅度不够,比如只有 1V 多,可能是驱动能力不足或者线太长。可以在 ADS 的 TX 线上加一个上拉电阻,比如 10k 上拉到 3.3V,增强驱动。如果波形有振铃或者过冲,可能是线太长或者阻抗不匹配,可以在靠近 STM32 的 RX 引脚处串一个 22 欧姆的电阻,做阻抗匹配。

还有一个隐蔽的问题是地环路。如果 ADS 和 STM32 分别供电,而且两个电源的地之间有电位差,UART 通信就会出错。解决方法是把两个地连在一起,或者用隔离器彻底隔离。工业现场建议用隔离器,因为地电位差可能很大,直接连地可能烧芯片。

4.4 常见问题速查表

问题现象可能原因排查方法解决方案
采样值随机跳动电源纹波大示波器测 AVDD 纹波换 LDO,加强去耦
采样值周期性跳动工频干扰看跳动频率是否 50Hz数据率设 20SPS,加 RC 滤波
读数整体偏高/偏低基准电压偏差万用表测基准引脚校准基准或换外部基准
读数随温度漂移基准温漂大加热板子看读数变化换低温漂基准
UART 收不到数据TX/RX 接反检查接线交叉连接
UART 数据错位波特率不匹配测 TX 波形位宽确认 STM32 时钟配置
UART 偶发丢包地环路干扰测两地电位差加隔离器
温度响应慢滤波太强看滤波参数减少平均点数
温度有自热误差激励电流太大降低电流看读数变化减小 IDAC 电流,提高 PGA

这个表是我在实际项目中总结的,基本上覆盖了 90% 以上的问题。遇到新问题的时候,先按这个表过一遍,大部分都能解决。如果还不行,就要用排除法,从传感器开始,一级一级往后查,先确认传感器输出正常,再确认 ADC 输入正常,再确认数字输出正常,最后确认 STM32 接收正常。这个流程虽然笨,但最可靠。

5. 工业现场部署的实战经验

5.1 电磁兼容性的硬功夫

工业现场的电磁环境比实验室恶劣得多。变频器、接触器、电机启动器这些设备在开关瞬间会产生强烈的电磁脉冲,通过空间辐射和电源线传导进入测量系统。ADS122U04IPWR 虽然本身抗干扰能力不错,但如果不做防护,照样会被干扰。

第一道防线是屏蔽。传感器线用屏蔽双绞线,屏蔽层接在控制柜的接地排上,不能接在信号地上。如果传感器外壳是金属的,也要接地。第二道防线是滤波。在 ADS 的模拟输入引脚前加共模扼流圈和差模电容,共模扼流圈选 100uH 左右的,差模电容选 100nF,能有效抑制高频共模干扰。第三道防线是隔离。UART 通信加数字隔离器,电源加隔离 DC-DC,把模拟侧和数字侧彻底分开。这样即使现场有大的地电位差,也不会影响测量。

还有一个细节是 PCB 的层叠设计。如果有条件,用四层板,顶层走信号,第二层铺地,第三层走电源,底层再铺地。这样信号线有完整的参考地平面,回流路径短,辐射和敏感度都低。如果只能用两层板,那就在信号线周围铺地铜,多打过孔连接上下层地,尽量模拟四层板的效果。

5.2 长期稳定性的考量

工业设备要求连续运行好几年不出故障,所以元器件的长期稳定性很重要。ADS122U04IPWR 的 datasheet 里给了长期漂移指标,但实际使用中,焊接质量、PCB 清洁度、环境湿度都会影响长期稳定性。

焊接后一定要清洗 PCB,尤其是助焊剂残留。助焊剂在潮湿环境下会吸收水分,导致漏电流,影响高阻抗节点的电压。ADS 的模拟输入是高阻抗的,如果引脚附近有助焊剂残留,漏电流可能达到纳安级别,虽然不大,但对于微伏级信号来说就是灾难。清洗用无水酒精或者专用清洗剂,洗完后用热风枪吹干。

还有一个是防潮。工业现场湿度可能很高,PCB 表面凝露会导致漏电。可以在 PCB 上涂三防漆,但要注意三防漆不能涂在连接器和传感器的接触面上。三防漆选丙烯酸类的,好涂也好修,硅胶类的太难去除,维修麻烦。

连接器的选择也很关键。传感器接口用凤凰端子或者魏德米勒的工业连接器,接触电阻小,抗振动。不要用杜邦线或者排针,那些在工业现场用不了多久就会接触不良。我见过一个项目用排针接传感器,运行半年后开始出现随机跳变,查了半天是排针氧化了,换成凤凰端子后问题消失。

5.3 标定和溯源的实际操作

工业测温设备一般要求定期标定,通常是每年一次。标定需要高精度的温度源,干体炉是最常用的,便携、升温快、稳定性好。但干体炉的温场均匀性有限,插孔底部和顶部的温差可能有 0.5 摄氏度,所以要把传感器插到底,而且要用同一深度的参考温度计。

标定时先设定干体炉到第一个温度点,等稳定后同时读取参考温度计和被测设备的读数,记录偏差。然后依次测多个点,算出修正系数。修正系数写入设备的非易失存储器,设备运行时自动应用。

如果设备支持现场标定,可以在软件里做一个标定模式,通过按键或者上位机命令进入,然后按提示操作。标定完成后自动计算并保存系数。这个功能很实用,因为工业现场不可能把设备拆下来送回实验室标定,现场标定能省很多事。

溯源方面,参考温度计要定期送计量院检定,拿到检定证书。干体炉也要定期校准。这些记录要保存好,有些行业审核的时候会查。虽然麻烦,但这是保证测量准确性的基础,不能省。

5.4 低功耗设计的取舍

有些 HVAC 应用是电池供电的,比如无线温度变送器,这时候功耗就很关键。ADS122U04IPWR 支持单次转换模式,转换完自动进入低功耗状态,电流从几百微安降到几微安。STM32F427ZI 也有多种低功耗模式,Stop 模式下电流只有几十微安。

低功耗设计的思路是:平时 STM32 和 ADS 都处于休眠状态,定时器定时唤醒,唤醒后 ADS 做一次转换,STM32 读数据、处理、发送,然后继续休眠。占空比可以做到 1% 以下,平均电流降到几十微安,一节电池能用好几年。

但低功耗和精度有矛盾。休眠唤醒后,ADS 需要一定的建立时间才能达到标称精度,如果唤醒后立刻转换,前几次数据可能不准。我的做法是唤醒后先丢弃前 3 次转换结果,从第 4 次开始取数。这样每次唤醒多花几十毫秒,但精度有保证。对于温度这种慢变量,多花几十毫秒完全无所谓。

还有一个是激励电流的功耗。1mA 激励在 100 欧姆上功耗是 0.1mW,不大,但如果连续开启,累积起来也可观。可以在转换前才开启 IDAC,转换完立刻关闭。ADS122U04IPWR 的 IDAC 开启时间很短,微秒级别,对转换没影响。

6. 方案扩展与变体思路

6.1 多通道温度测量的实现

ADS122U04IPWR 有 4 个模拟输入通道,可以组成 2 路差分输入,或者 4 路单端输入。如果测 2 路 PT100,可以用 AIN0/AIN1 和 AIN2/AIN3 分别接两个 RTD,IDAC 轮流给两个 RTD 供电。但 IDAC 只有两路,如果两个 RTD 都要激励,需要外部模拟开关切换,或者用两个 IDAC 分别供两个 RTD,但这样每个 RTD 的激励电流会减半,需要重新计算增益。

如果要测更多通道,可以用外部多路复用器,比如 ADG708 或者 CD4051,把多个传感器轮流接到 ADS 的输入。但外部多路复用器会引入额外的导通电阻和漏电流,对精度有影响。导通电阻跟 ADS 的输入阻抗分压,会导致增益误差;漏电流会在高阻抗节点上产生电压,导致偏移误差。所以外部多路复用器要选低导通电阻、低漏电流的,而且要在软件里做通道间校准。

我的经验是,如果通道数不超过 4 路,尽量用 ADS 本身的通道,不要外扩。如果超过 4 路,可以考虑用多个 ADS122U04IPWR,每个管 4 路,通过 UART 地址区分。ADS122U04IPWR 的 UART 不支持多机通信,但可以用 STM32 的多个 USART 分别接,或者用模拟开关切换 UART 线。多个 ADS 的方案成本高一些,但精度和可靠性更好。

6.2 无线温度变送器的改造

把有线方案改成无线,核心是加一个无线模块,比如 LoRa 或者 NB-IoT。STM32F427ZI 的 USART 资源丰富,可以一路接 ADS,一路接无线模块,互不干扰。无线模块选型要看传输距离和功耗要求。LoRa 传输距离远,功耗低,适合 HVAC 这种分布式的场景;NB-IoT 依赖蜂窝网络,适合没有本地网关的场景。

无线改造后,供电也要改。如果是有线供电,改成电池供电,就要重新做功耗预算。ADS 和 STM32 的低功耗模式要用上,无线模块也要选低功耗的,发送完立刻休眠。天线设计也很关键,LoRa 的天线要匹配 50 欧姆阻抗,放在金属外壳外面或者用外置天线,否则传输距离会大打折扣。

数据协议也要改。有线的时候可以连续发送,无线的时候要打包发送,减少发送次数。可以把多个温度值打包成一帧,加上时间戳和校验,一次发出去。接收端解析后存数据库。这样既省电又省带宽。

6.3 与上位机系统的对接

温度数据最终要进上位机系统,比如 SCADA 或者楼宇自控系统。对接方式有几种:Modbus RTU、Modbus TCP、MQTT、OPC UA。Modbus RTU 最简单,STM32 的 USART 加一个 RS485 收发器就能实现,适合短距离、点对点的场景。Modbus TCP 需要以太网接口,STM32F427ZI 有以太网 MAC,加一个 PHY 芯片就能实现,适合局域网内多设备组网。MQTT 适合云端对接,STM32 加一个 Wi-Fi 或者 4G 模块,把数据推到 MQTT 服务器。OPC UA 适合工业 4.0 场景,但实现复杂,一般用网关转换。

我一般推荐 Modbus RTU,因为简单可靠,工业现场的设备基本都支持。STM32 这边实现 Modbus 从站,把温度值映射到保持寄存器,上位机轮询读取。寄存器地址和数据类型要提前定义好,比如 40001 是温度值乘以 100 的整数,40002 是状态字。上位机按这个定义解析就行。

如果数据量大,或者需要实时推送,可以用 MQTT。STM32 定时把温度数据打包成 JSON,通过 Wi-Fi 模块发到 MQTT 服务器。上位机订阅主题,收到数据后存数据库或者推送到界面。这种方式灵活,但依赖网络,网络断了数据就丢了。所以关键场合还是要用 Modbus RTU 做备份。

7. 写在最后的实操心得

这个方案我从头到尾做过好几版,踩过的坑比上面写的还多。最大的体会是,工业测温看起来简单,不就是读个 ADC 吗,但实际做起来,每一个环节都有讲究。电源、基准、布局、滤波、校准、防护,任何一个环节出问题,都会导致测量不准或者不稳定。

ADS122U04IPWR 是一颗很好的芯片,但好芯片不等于好方案。我见过有人用 ADS122U04IPWR 做出来的东西还不如用 12 位 ADC 的,就是因为外围电路没做好。所以不要迷信芯片指标,要把精力花在系统设计上。

STM32F427ZI 的性能对于温度测量来说是过剩的,但过剩有过剩的好处,你可以把省下来的 CPU 时间用来做更复杂的滤波、更精细的校准、更丰富的通信协议。而且 F427ZI 的生态好,资料多,遇到问题容易找到答案。

最后分享一个小技巧:调试的时候,先用一个固定的电阻代替传感器,比如 100 欧姆的精密电阻,看读数是否稳定。如果固定电阻读数稳定,那问题在传感器或者传感器走线上;如果固定电阻读数也不稳,那问题在 ADC 或者电源上。这个二分法能快速定位问题,省很多时间。

温度测量这个事,说到底是跟噪声和漂移作斗争。理解了噪声的来源和漂移的机理,就能有针对性地解决。希望这些经验对做类似项目的朋友有帮助。