ADS122U04与dsPIC33EP组合的HVAC温度采集系统设计与干扰处理
发布时间:2026/11/5 5:04:14 锦皓数字建站

最近把一套暖通风柜的温度采集链路换成了 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.99mARref 和 Rpt 上的电压都同比例下降比例关系仍然不变。所以参考电阻只要选低温漂、高精度的金属箔电阻或精密绕线电阻对电流源稳定性的要求大大降低。实际接线时有一点非常关键Rref 要靠近 ADCRref 和 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 RXADC 的 RX 接 DSC 的 UART TXGND 共地。如果 GND 走线不够粗UART 在长距离传输时仍然可能被共模干扰影响。最好单独拉一条回线回控制板而不是靠地平面绕一圈。模拟电源和数字电源要分开。AVDD 和 DVDD 各自用 10μF 钽电容加 0.1μF 陶瓷电容去耦中间用磁珠或小阻值电阻隔开。我第一次画板时图省事把两端电源连在一起结果 ADC 读数在小数点后第二位不停跳后来分开布置才干净。另一个容易忽略的细节是模拟输入通道的 RC 滤波。在 AIN 引脚到传感器之间串一个 10~47Ω 的电阻再对地并一个 1~10nF 电容能有效抑制射频干扰和振铃。但电容不能太大不然电压建立时间不够低速率采样时倒是还好高速轮询时会造成串扰。3. ADS122U04 的初始化与数据读取让协议栈跑起来3.1 UART 通信链路检查清单ADS122U04 通过 UART 接收命令和返回数据通信参数首先要和芯片里的配置一致。实际调试前我按这个顺序检查波特率是否匹配。ADS122U04 支持有限几个波特率选项DSC 的 UART 要精确到目标波特率误差小于 ±2%。如果使用内部振荡器最好在系统初始化时先校准振荡器。帧格式是不是 8 数据位、无校验、1 停止位。ADC 命令帧通常带 CRC别在初版代码里图省事屏蔽掉。发送命令后必须等待响应。UART 是异步接口ADC 收到命令后执行需要时间尤其是启动转换后不能立刻读结果。数据长度。读取转换结果一般会返回 3 个字节的 24 位码值加一个校验字节具体按实际协议长度解析。这些检查看起来琐碎但每个都能让你多调半天。有一个很典型的问题DSC 的 UART 发送完最后一个字节后数据可能还在发送移位寄存器里没有完全移出如果代码立刻进入低功耗模式或把 UART 关掉最后一个字节会被截断。我就在这个坑里蹲了一个晚上最后加了一个发送完成中断才解决。3.2 寄存器配置的四个关键块ADS122U04 的寄存器具体地址和数据手册版本有关但配置思路是一致的主要看四块输入通道配置选择当前转换的是哪一路模拟输入单端还是差分是否启用内部温度传感器。PGA 增益和转换模式根据传感器信号幅度选择 1、2、4、8 等增益以及单次转换还是连续转换。HVAC 应用不需要很高的转换速率连续转换配合主控定时取数更方便。参考电压源选内部 2.048V 还是外部 REFP/REFN 输入。比例测量时一定要选外部参考把 Rref 接到 REFP/REFN。激励电流源设置 IDAC 电流大小和流向。Pt100 一般用 1mAPt1000 可以用 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 现场校准方法和精度验证硬件设计再合理实际走线、焊点、器件误差都会让结果偏离理想曲线。现场校准我有几个习惯零点和量程校准用高精度电阻箱替代传感器分别输入 100Ω0℃和 138.5Ω100℃记录 ADC 码值算出实际比例系数而不是直接用标称的 Rref。这一步把 Rref 误差和增益误差一起抹掉了。引线电阻补偿如果只能用两线制先短路传感器端子测一次线阻然后在软件里减去。恒温槽对比把传感器和标准温度计放在同一个恒温槽里至少取 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 转换速率 20SPSPGA 增益 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 组合的真正价值不是把两个芯片连起来而是从传感器到控制输出全程形成一条可信的数据链。后面加新测点也不过是在这条链上再复制一份而已。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。