news 2026/11/5 5:04:12

ADS122U04与dsPIC33EP组合的HVAC温度采集系统设计与干扰处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADS122U04与dsPIC33EP组合的HVAC温度采集系统设计与干扰处理

最近把一套暖通风柜的温度采集链路换成了 ADS122U04IPWR 加 dsPIC33EP512MU814 的组合,专门用在工业和 HVAC 的温度测量场景里。折腾了两周,踩过不少坑,也把很多以前没仔细琢磨的细节都捋顺了。这套方案解决的核心问题是:在强电干扰、传感器双端长距离走线、环境温湿度波动的工况下,把温度采集的稳定性做到控制闭环能放心用的水平,同时让整个控制器的成本保持在可控范围内。

如果你在做的项目里有类似需求——比如空调箱的送风/回风温度、冷冻水供回水温差、工业管道或压缩机表面温度,这套组合值得参考。下面按照我做这个项目时的推进顺序,把选型逻辑、硬件设计、UART 通信、温度换算、现场干扰处理,以及最后怎么扩展成多点测温节点的完整过程写一遍。

1. 传统 HVAC 测温链路的最大短板,以及这套组合怎么补

1.1 为什么传感器信号会在控制柜里“变脏”

很多老式 HVAC 控制器喜欢直接用板载 12 位 ADC 量 NTC 或 0~10V 变送器。单纯看分辨率,12 位对应 4096 格,如果量程是 50℃,理论上也能到 0.01℃,但实际完全不是这么回事。

先说噪声。HVAC 控制柜里往往同时有接触器、继电器、变频器和开关电源。接触器吸合的瞬间,电流变化率非常高,会在公共地线上产生几十甚至上百毫伏的瞬态电压。模拟前端输入阻抗再高,也架不住地电位整体被抬起来。更麻烦的是,柜内还有 50Hz 工频磁场,靠近变压器或强电电缆的传感器线会耦合出几十纳伏到几毫伏的工频干扰。

再说传感器本身。工业现场常用 Pt100 或 Pt1000,满量程电阻变化很小。Pt100 在 0℃ 附近每变化 1℃ 大约只有 0.385Ω,如果激励电流只有 1mA,对应的电压变化就是 0.385mV/℃。想让显示分辨率做到 0.1℃,系统至少要在 385μV 的基础上再留出 10 倍裕量,也就是要稳定分辨几十微伏的信号。普通 12 位 ADC 加简单的 RC 滤波,在这种环境下很难做到稳定。

我以前试过用运放把信号放大后再进单片机,效果比直接采好一些,但运放的温漂、偏置电压、PCB 漏电又会引入新的误差。调试时总感觉是在拆东墙补西墙。后来换成集成度高的 24 位 ADC,很多问题一下子收拢到芯片内部了。

1.2 24bit UART 接口 ADC + DSC 的分工价值

选 ADS122U04IPWR 的核心原因有三点。第一,它是一颗 24 位 Δ-Σ ADC,内部带了可编程增益放大器(PGA)、可编程激励电流源和低温漂参考电压,能把微伏级的传感器信号直接放大并数字化。第二,Δ-Σ 架构本身对 50Hz/60Hz 工频干扰有很好的抑制能力,尤其当采样速率设置成工频整数倍时,效果更明显。第三,也是最重要的,它用 UART 和主机通信。

UART 在 HVAC 控制柜里非常实用。相比 SPI 的时钟加数据线,UART 只需要 TX、RX、GND 三根线,布线上更省事,而且可以在几米距离内稳定工作。你可以把 ADC 板放在靠近传感器的位置,转成数字信号后再用 UART 把结果引回主控板,完全避开长距离传输微弱模拟信号的问题。

dsPIC33EP512MU814 在这里不是简单当单片机用。它是 Microchip 的 16 位 DSC,程序存储空间大,有多个 UART、DMA 和比较强的数学运算能力,适合同时处理多路温度数据、PID 控制、变频器通信和本地显示。ADC 只管把模拟信号变成可靠的数字码值,DSC 专注所有判读、滤波和逻辑控制。

这种分工让整个系统的边界非常清楚:模拟前端的选择、参考、激励电流都在 ADC 里闭环完成,DSC 不需要参与细节。后面排错也容易,温度不对就先查模拟端,通信不对就先查 UART 链路,不用再对着几十个分立元件猜来猜去。

2. 硬件端设计与关键连接:先想清楚用什么传感器

2.1 三类常见温度传感器怎么选

设计硬件前,第一件事不是画原理图,而是确认现场用哪种传感器。三种常见选择各有优缺点,我一般按下面的逻辑判断:

传感器类型测温范围线性度成本HVAC 典型场景
Pt100 / Pt1000-50~250℃较好中等水管温度、回风温度、冷却液温度
NTC 热敏电阻-40~150℃较差低室内温度、管道表面温度
K 型热电偶-200~1100℃中等低压缩机排气、工业高温管道

Pt100 在 HVAC 里最常用,因为水系统温差不大的场景对绝对精度要求很高。Pt1000 的好处是同样电流下信号大 10 倍,但传感器本身电阻也大,对引线电阻没那么敏感,可以在两线制连接里用。热电偶适合高温,但需要冷端补偿,HVAC 里一般只在工业风柜或冷库设备上遇到。

我这次做的是一个空调箱的送风温度、一个冷冻水供水温度和一个回风温度。水路用了 Pt100,回风用了 Pt1000,都能进同一片 ADS122U04 的输入端口,只是激励电流和 PGA 配置不同。这样板材和端子统一,维护也方便。

2.2 比例测量法:用同一路电流把误差抵消掉

如果直接用 ADC 内部参考电压去算电阻,电流源的误差会直接进结果。正确做法是比例测量法,这也是工业 RTD 测量的标准玩法。

方法很简单:用 ADS122U04 内部的 IDAC 电流源同时流过参考电阻 Rref 和测温电阻 Rpt,把 Rref 两端的电压接 ADC 的 REFP/REFN 参考输入,把 Rpt 两端的电压接模拟输入 AINx。这样 ADC 输出的码值实际上是两个电阻的比例:

Rpt = Rref × (code / 2^23)

这个公式的妙处在于:电流源的绝对值变化不会影响结果。即使 1mA 变成了 0.99mA,Rref 和 Rpt 上的电压都同比例下降,比例关系仍然不变。所以参考电阻只要选低温漂、高精度的金属箔电阻或精密绕线电阻,对电流源稳定性的要求大大降低。

实际接线时有一点非常关键:Rref 要靠近 ADC,Rref 和 REFP/REFN 之间的感知走线要直接,不要经过长距离或过孔绕路。如果 Rpt 距离很远,最好用四线制(开尔文连接)消除引线电阻。两线制虽然省线,但线阻会直接叠加到 Rpt 上,对 Pt100 来说,0.1Ω 线阻就对应约 0.26℃ 误差。

对于 HVAC 水管温度和回风温度,如果条件允许,我建议至少用三线制,再用软件扣除公共线阻。追求长期精度的话,四线制最省心。

2.3 与 dsPIC33EP512MU814 的 UART 连接细节

ADS122U04 的 DVDD 建议和 dsPIC33EP 一样设为 3.3V,这样 UART 可以直接互连。如果贪图省事把 DVDD 也接到 5V,就要注意 dsPIC33EP 的高电平输出可能够不到 UART 输入的高电平阈值,必须加电平转换,否则会出现偶发通信错误。

连接只有三根线:ADC 的 TX 接 DSC 的 UART RX,ADC 的 RX 接 DSC 的 UART TX,GND 共地。如果 GND 走线不够粗,UART 在长距离传输时仍然可能被共模干扰影响。最好单独拉一条回线回控制板,而不是靠地平面绕一圈。

模拟电源和数字电源要分开。AVDD 和 DVDD 各自用 10μF 钽电容加 0.1μF 陶瓷电容去耦,中间用磁珠或小阻值电阻隔开。我第一次画板时图省事把两端电源连在一起,结果 ADC 读数在小数点后第二位不停跳,后来分开布置才干净。

另一个容易忽略的细节是模拟输入通道的 RC 滤波。在 AIN 引脚到传感器之间串一个 10~47Ω 的电阻,再对地并一个 1~10nF 电容,能有效抑制射频干扰和振铃。但电容不能太大,不然电压建立时间不够,低速率采样时倒是还好,高速轮询时会造成串扰。

3. ADS122U04 的初始化与数据读取:让协议栈跑起来

3.1 UART 通信链路检查清单

ADS122U04 通过 UART 接收命令和返回数据,通信参数首先要和芯片里的配置一致。实际调试前,我按这个顺序检查:

  1. 波特率是否匹配。ADS122U04 支持有限几个波特率选项,DSC 的 UART 要精确到目标波特率误差小于 ±2%。如果使用内部振荡器,最好在系统初始化时先校准振荡器。
  2. 帧格式是不是 8 数据位、无校验、1 停止位。ADC 命令帧通常带 CRC,别在初版代码里图省事屏蔽掉。
  3. 发送命令后必须等待响应。UART 是异步接口,ADC 收到命令后执行需要时间,尤其是启动转换后不能立刻读结果。
  4. 数据长度。读取转换结果一般会返回 3 个字节的 24 位码值加一个校验字节,具体按实际协议长度解析。

这些检查看起来琐碎,但每个都能让你多调半天。有一个很典型的问题:DSC 的 UART 发送完最后一个字节后,数据可能还在发送移位寄存器里没有完全移出,如果代码立刻进入低功耗模式或把 UART 关掉,最后一个字节会被截断。我就在这个坑里蹲了一个晚上,最后加了一个发送完成中断才解决。

3.2 寄存器配置的四个关键块

ADS122U04 的寄存器具体地址和数据手册版本有关,但配置思路是一致的,主要看四块:

  • 输入通道配置:选择当前转换的是哪一路模拟输入,单端还是差分,是否启用内部温度传感器。
  • PGA 增益和转换模式:根据传感器信号幅度选择 1、2、4、8 等增益,以及单次转换还是连续转换。HVAC 应用不需要很高的转换速率,连续转换配合主控定时取数更方便。
  • 参考电压源:选内部 2.048V 还是外部 REFP/REFN 输入。比例测量时一定要选外部参考,把 Rref 接到 REFP/REFN。
  • 激励电流源:设置 IDAC 电流大小和流向。Pt100 一般用 1mA,Pt1000 可以用 0.25mA,电流过大自热效应会显著抬高读数。

我的做法是初始化时把四块全部写一遍,然后回读校验。回读很有必要,因为 UART 通信本身也可能出错,某个位被干扰弄错,在现场很难发现。

3.3 读取与解析转换结果的代码骨架

下面给一段示意性质的代码框架,用于 dsPIC33EP512MU814 通过 UART1 向 ADS122U04 发送读数据命令并解析 24 位码值。具体命令字和 CRC 算法以原厂数据手册为准,我这里只展示整体流程。

#include <stdint.h> static uint8_t crc8_update(uint8_t crc, uint8_t byte) { int i; crc ^= byte; for (i = 0; i < 8; i++) { if (crc & 0x80) crc = (uint8_t)((crc << 1) ^ 0x07); else crc <<= 1; } return crc; } static uint8_t crc8(const uint8_t *buf, uint8_t len) { uint8_t crc = 0x00; while (len--) crc = crc8_update(crc, *buf++); return crc; } int32_t ads_read_raw_delta(void) { uint8_t cmd[3]; uint8_t resp[5]; int32_t code; cmd[0] = 0x10; // 示例:读数据命令 cmd[1] = 0x00; cmd[2] = crc8(cmd, 2); uart_write(UART1, cmd, 3); if (uart_read_exact(UART1, resp, 5, 100) != 0) return 0x80000000; // 超时 if (resp[4] != crc8(resp, 4)) return 0x80000000; // CRC 错误 code = ((int32_t)resp[0] << 16) | ((int32_t)resp[1] << 8) | ((int32_t)resp[2]); if (code & 0x800000) code |= 0xFF000000; // 24 位转 32 位有符号数 return code; }

这段代码不完整,uart_write 和 uart_read_exact 需要按 dsPIC33EP 的库和中断方式去实现。但核心点很明确:命令带 CRC,解析出来的 24 位码值必须做符号扩展。如果直接把低 24 位当正数用,温度在 0℃ 以下会直接算错。

4. 从码值到温度:换算、线性化与现场校准

4.1 先把码值换算成电阻或电压

拿到 24 位码值后,第一步不是查表,而是换算成物理量。如果使用了比例测量法,并且参考电阻 Rref 和 ADC 参考电压来自同一个电流源,公式就是简单的比例关系:

Rpt = Rref × code / (2^23)

其中 2^23 是 24 位有符号码值在单极性比例下的满量程位置。举个例子,Rref 取 1kΩ,电流 1mA,那么参考电压是 1V。Pt100 在 100℃ 时约 138.5Ω,Rpt 上的电压是 138.5mV,理想码值约为 1161822。用比例公式反算:

Rpt = 1000 × 1161822 / 8388608 ≈ 138.5Ω

结果正好和 IED 751 特性对应。注意这里如果开了 PGA 增益,只要输入信号没有超出 PGA 的线性范围,比例公式仍然有效,因为参考信号和测量信号被同一个增益倍数同时缩放。

4.2 RTD 非线性修正与查表

Pt100 不是线性电阻,直接按比例关系得到的温度会有误差。0~100℃ 范围内,铂电阻温度特性可以近似为:

R(t) = R0 × (1 + A×t + B×t²)

其中 R0 = 100Ω,A = 3.9083×10⁻³,B = -5.775×10⁻⁷。反解温度可以用二次方程:

t = (-A + sqrt(A² - 4×B×(1 - R/R0))) / (2×B)

两行代码就能算出来,对 HVAC 应用足够了。如果覆盖范围更宽,比如 -10~200℃,我建议直接用查表加线性插值,或者按 IEC 60751 的分段公式处理。

实际代码里我用的是分段查表:把 -40~200℃ 按 1℃ 间隔生成电阻表,对实测电阻做二分查找,再用线性插值补出小数部分。这样避免了在 DSC 里做大量浮点乘方,运算量小,也容易维护。

4.3 现场校准方法和精度验证

硬件设计再合理,实际走线、焊点、器件误差都会让结果偏离理想曲线。现场校准我有几个习惯:

  1. 零点和量程校准:用高精度电阻箱替代传感器,分别输入 100Ω(0℃)和 138.5Ω(100℃),记录 ADC 码值,算出实际比例系数,而不是直接用标称的 Rref。这一步把 Rref 误差和增益误差一起抹掉了。
  2. 引线电阻补偿:如果只能用两线制,先短路传感器端子测一次线阻,然后在软件里减去。
  3. 恒温槽对比:把传感器和标准温度计放在同一个恒温槽里,至少取 3 个温度点,记录偏差,用 3 点折线修正。多数情况下能控制在 0.2℃ 以内。

校准参数我会写到 Flash 里,每次上电读到全局结构体。注意校准参数要带校验和,防止掉电写入失败导致整套数据异常。

5. 现场实测中的干扰问题:症状、排查和根治

5.1 三个典型故障症状与定位过程

装到现场后,问题开始一个接一个。先说最典型的三个,按排查顺序写:

第一,温度值稳定但明显偏低 1~2℃。这个基本是引线电阻没扣除,或者传感器自热。对照检查表,先把传感器放到冰水混合物里,看软件读数和实际 0℃ 差多少。如果差了就是引线电阻或校准系数问题,扣除后一般能好。

第二,温度读数快速跳变,幅度 0.3~1℃,周期看起来像是 50Hz 工频。先用示波器看传感器输入线,通常能看到 1~3V 的高频毛刺。解决办法是换用屏蔽双绞线,屏蔽层只在 ADC 板一端接地;同时把 ADC 采样率降到 20SPS 或 10SPS,让内置数字滤波器把工频和共模噪声压住。

第三,UART 通信偶尔断,尤其是邻近继电器动作时。这说明数字信号路径也受到了干扰。我在电源端加了共模电感和 TVS,又把 UART 线从强电电缆槽里拿出来,间距至少 10cm,问题消失。如果距离超过 3 米,建议把波特率降到 9600,并且给 UART 线加终端电阻。

5.2 采样率、滤波和屏蔽的配合

Δ-Σ ADC 有个特性:采样速率越高,输出噪声越大;采样速率越低,内置数字滤波器越能抑制工频干扰。HVAC 温度测量不需要很快,20SPS 已经完全够用。

最后定的参数是:ADS122U04 转换速率 20SPS,PGA 增益 8,激励电流 1mA。在 DSC 端,每次读回 16 个码值,先做中值滤波去掉毛刺,再做滑动平均。实测在变频器满载运行的空调箱旁边,温度读数稳定在 0.02℃ 以内跳动。

这里有个细节:中值滤波窗口长度不能太长,否则温度突变时响应太慢。我取 5 个点中值,再对中值结果做 8 次一阶低通,时间常数约 0.5 秒。既能压噪声,又不会让压缩机因为个别跳变频繁误动作。

6. 从单点测温到多点监控:这套架构怎么扩展

6.1 用多路输入还是多片 ADC

整个系统如果只有 2~3 个测点,一片 ADS122U04 的多路输入就够用,通过寄存器切换通道,每次转换只读一路,轮着来。切换通道后要留出稳定时间,一般连续丢弃前 2 次转换结果,从第 3 次起再读数,否则通道间会有串扰。

测点一旦超过 4~6 个,我建议别让一片 ADC 承担太多。单 ADC 切换所有通道后,每个通道的采样周期会被拉长,控制响应速度下降;如果一路出问题,所有温度数据都会受影响。更稳妥的做法是每片 ADC 就近放 4 路传感器,多片 ADC 通过 UART 分别接到 DSC 的不同 UART 口。

dsPIC33EP512MU814 有多个 UART,天然适合这种星形结构。每片 ADC 分配一个地址,由 DSC 定期轮询。轮询间隔 1 秒足够,温度变化慢,没必要更快。

6.2 与 HVAC 控制闭环联动的思路

温度采集只是前端,最终目的是让控制器做判断。我这套系统就是回风温度参与 PID 调节,冷冻水温度参与变频泵控制。ADC 数据经滤波后,在 DSC 里做 PI 或 PID 运算,输出 PWM 或串口指令给变频器和风阀执行器。

实际做闭环时,要把温度采集的死区放大一点。HVAC 系统惯量大,温度测点是延迟环节,PID 参数不能按测控仪表的经验直接套。我一开始用 2 秒周期做 PID,系统来回震荡,后来把控制周期拉长到 5 秒,去掉微分项,只用 PI,很快就稳定下来。

从调试角度讲,先把采集和校准做到肉眼观察 0.1℃ 都不跳再看控制,否则后边排错会很痛苦。这是这套项目给我最大的体会。ADS122U04IPWR 加 dsPIC33EP512MU814 组合的真正价值,不是把两个芯片连起来,而是从传感器到控制输出全程形成一条可信的数据链。后面加新测点,也不过是在这条链上再复制一份而已。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 5:03:55

工业级温度测量:ADS122U04IPWR+STM32F215RE高精度闭环设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:03:45

ADS122U04+PIC18F57K42高精度温度采集方案详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:03:06

STM32搭配24位ADC:单线UART与比例式测量的高精度温度采集方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:03:05

ADS122U04与STM32F756ZG高精度温度采集系统设计实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:02:45

S7-200 SMART PLC实现Modbus RTU总线数据侦听与故障诊断

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 5:02:28

工业级温度采集系统:ADS122U04IPWR+PIC32MZ硬核设计指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华