
我接手过不少用 MCU 直接采热电阻的项目早期图省事全用 MCU 内置 ADC 加模拟开关切换多路信号结果高低温段非线性、零漂、共模干扰在工业现场被折腾得够呛。后来痛定思痛开始上独立的 24 位 Δ-Σ ADC外接 16 位 DSC 做数据处理和逻辑控制组合起来就是标题里这套方案——ADS122U04IPWR 负责把热电偶、RTD 的 mv 级微弱信号高保真地数字化dsPIC30F4011 负责跑控制算法和对外通信。这套组合放在工业和 HVAC 场景里最大的优势就是干净利落ADC 到 DSC 之间只用一根 UART 线不用并行总线也不用 SPI 拉一堆时钟和数据线隔离、布线、抗干扰一下子就都简单了。这篇文章就把我实际配置、调参和踩坑的过程完整写一遍给正在选型或者已经画板子想抄作业的朋友一个参考。熟悉这两颗芯片的人应该不少但真正把 UDP 测温和 UART 版 Δ-Σ ADC 搭配着用再落到风机盘管、组合式空调机组、冷水机组这些设备上的案例其实不多。ADS122U04IPWR 是 TI 家带 UART 接口的 24 位 ADC型号里的 U 就代表 UART 通信内部集成了 IDAC 电流源、高精度基准、PGA 可编程增益专为 RTD 和热电偶而设计。dsPIC30F4011 是 Microchip 的 16 位 DSP 内核 MCU40 MIPS 的性能跑 PID、跑线性化查表、跑简单滤波算法完全够用而且内置多个 UART 和定时器做 HVAC 里的焓值计算、温差控制正合适。1. 为什么会选UART接口ADC 16位DSC这个组合1.1 现场总线和隔离带来的隐藏约束先说一个很多人一开始没意识到的问题工业设备里 ADC 往往不在主控板上而是放在传感器端子附近和主控板之间隔着一段线缆甚至隔着隔离栅。如果 ADC 用 SPI 接口你需要时钟、数据输入、数据输出、片选四根线如果主控离得远或者遇到电机变频器、接触器动作频繁的场合这四根线的信号完整性和共模干扰就是大麻烦。UART 在同样的场景下优势明显——两根线TX、RX点对点天然适合长线或加隔离。ADS122U04IPWR 用 UART 不仅省线更重要的是它把测量模拟量和传输数字量之间的边界划得很清晰靠近传感器做模数转换数字信号再回传抗扰能力比模拟量长线传输高一个量级。HVAC 系统里还有一个现实约束——设备主控要做很多事。压缩机启停控制、风机调速、水阀开度 PID、漏水报警、通信协议栈Modbus RTU 甚至 BACnet全挤在一颗 MCU 上。如果每路温度都用 MCU 内置 ADC 去采时序会被打断中断嵌套一多采样抖动就来了。外挂 ADC 把采样时序从主控中剥离出来主控按需读取结果实时性反而更好掌控。而且 ADS122U04IPWR 是连续转换模式转换完成的数据在芯片里排队DSC 想什么时候读就什么时候读不丢样本。1.2 24 位分辨率对 HVAC 场景到底有没有用很多人一看到 24 位就说过度设计这话分场景。HVAC 里如果只是采室温10 位、12 位 ADC 都够看0.1°C 的分辨率在空调控制里都属于锦上添花。但问题出在信号的动态范围和传感器的低灵敏度上。以 K 型热电偶为例每度只变化约 40 uV普通 12 位 ADC 的 LSB 就是几百 uV 甚至几 mV算到温度上误差好几度再叠加恒温器设置点的 0.5°C 死区控制控制精度根本无从谈起。24 位 ADC 配合 PGA等于在传感器端先做放大把热电阻或热电偶的信号幅度放大到适合 ADC 全量程的区间再用高分辨率去量化。ADS122U04IPWR 的 PGA 可以做到最高 128 倍加上内部基准源和 IDAC 电流源整体做出来的系统在 0°C~100°C 区间温度测量分辨率能做到 0.0001°C 这个级别当然实际受传感器精度、导线电阻、基准漂移限制工程上做到 ±0.05°C 就已经很能打了。这个精度不仅是控制够用还能顺带做一些冷水供回水温差、风机盘管换热能力评估的数据分析。1.3 dsPIC30F4011 在这里扮演的角色dsPIC30F4011 不是普通 MCU它带 DSP 内核有 MAC乘加指令在 HVAC 控制器里做数据融合很方便。实测下来它干三件事很顺手温度线性化计算。热电阻PT100、PT1000和热电偶接入 ADS122U04 后输出的是 ADC 原始码不是温度值。要做冷端补偿、多项式拟合或查表甚至用 Callendar-Van Dusen 方程修正 PT100这些运算在 dsPIC30F4011 上跑很轻松一个三角函数周期的运算量分摊下来占用不到 10% CPU。PID 控制。既然 DSP 内核闲着也是闲着把风机、水阀的 PID 控制在同一个芯片里闭环省掉一颗专门做 PID 的 MCU。多协议通信。内置的两个 UART 一个连 ADS122U04另一个跑 Modbus RTU给楼宇自控系统上报数据互不干扰。从这个角度看选 dsPIC30F4011 不是因为顺便用了这颗而是这颗芯片能同时扛测量和控制的负载系统总成本反而更低。2. ADS122U04IPWR 的温度测量机制与寄存器配置要点2.1 内部结构激励电流、PGA 和 Δ-Σ 调制器如何协同ADS122U04IPWR 的核心是一个 24 位 Δ-Σ 调制器但工程上真正要理解的是它外围那条完整的模拟链路。芯片内部集成了两个可编程电流源 IDAC1 和 IDAC2这个设计非常关键。测量 RTD 时IDAC 给传感器供恒定电流电阻变化转化为电压变化这个电压经过 PGA 放大后再由 Δ-Σ 调制器和数字滤波器转换成 24 位数字码。同时IDAC 流过一只精密参考电阻产生的电压直接作为 ADC 的参考电压 VREF。这就是比例式测量激励电流源漂移引起的误差在激励和参考两条路径上抵消了从原理上消除了恒流源的温漂影响。这款芯片通过 UART 接口控制命令格式跟 SPI 版有一些差异。整体命令体系包括复位、读数据、读写寄存器等几类。配置过程就是先复位再写寄存器然后进入连续转换模式DSC 定期拉取结果。连续转换模式下数据会按照设定速率不断更新内部 FIFO 缓存最新结果DSC 读走的数据永远是最近一次转换完成的数据不存在读到一半被新数据覆盖的问题时序上省心很多。2.2 寄存器配置序列一份可以直接抄的启动代码不同项目的传感器类型不一样寄存器值有差异但配置流程可以通用。我这边以三线制 PT100 测温举例给出按经验调好的配置流程步骤动作说明1发送复位命令0x06上电或通信错乱时先复位2配置输入端多路复用器PT100 接到哪个通道、差分还是单端3配置 PGA 增益PT100 在测温范围内的信号幅度通常取增益 4 或 84配置 IDAC 电流取 250 uA 或 500 uA阻值小的 RTD 用大电流阻值大的用 小电流5配置转换模式和输出速率设 20 SPS 或 40 SPS工频干扰严重时选 20 SPS6定时器配置如果使用按需使能内部定时器7写配置寄存器把上述选项写入对应地址8发送开始连续转换命令进入连续转换状态DSC 开始等待数据注意所有寄存器地址和位域定义以你手上那版数据手册为准。不同批次手册虽然大体一致但个别保留位含义可能有差异写代码前一定对着 manual 核对一遍。这里特别说明两个容易踩的点。第一IDAC 电流大小对自热效应的影响很大。PT100 在空气中自热系数约 0.4°C/mW如果选 1 mA 电流功率是 0.1 mW100 Ω 时本身温升可以忽略但如果传感器被装在狭小空间或者导热差的位置1 mA 就会产生不可忽视的测量偏差。所以我个人偏好 250 uA~500 uA宁可增益调高一点。第二输出数据速率和数字滤波器的关系。ADS122U04 这类 Δ-Σ ADC 的转换速率越低数字滤波器的抽取率越高对工频 50Hz/60Hz 的抑制效果越好。20 SPS 时基本能获得比较好的 50Hz 共模抑制如果现场有变频器干扰频带更宽建议在硬件上把模拟电源、参考电压路径做干净别只指望内部的滤波器。2.3 连续转换模式下读数据的时序细节连续转换模式启动后数据准备好时DSC 需要靠什么信号知道可以读了带 UART 的 ADC 通常有数据就绪引脚DRDYADS122U04IPWR 也有类似功能。我第一次使能的时候没查 DRDY 引脚是否映射到 UART 流控脚结果一直轮询读取虽然也能读到数据但时序上浪费了 CPU。正确做法是用 DRDY 脚接到 DSC 的外部中断输入下降沿触发读取。这样 DSC 在两次转换之间可以安心跑控制算法不必频繁查询。读取数据的格式一般是 4 字节状态字加 24 位转换结果。转换结果的低 2 字节是数据位高字节包含状态信息比如溢出标志、比较器状态等。读数据的时候不要只取 24 位高有效位状态字里的异常标志对现场调试非常有用——传感器断线、过载、参考故障都能从状态字里看出来。这个习惯帮我在现场少跑了很多冤枉路。3. 硬件设计里最容易翻车的几个细节3.1 RTD 三线制接法与导线电阻补偿ADS122U04IPWR 支持二线制、三线制、四线制 RTD但 HVAC 现场为了省线普遍用三线制。三线制接法的核心思路是用 IDAC1 电流激励 RTD同时让 RTD 的负端和参考电阻共用电流回路从而抵消导线电阻造成的误差。我实际项目里的接法是这样的IDAC1 电流从通道正输入流出经过 RTD 再到通道负输入同时IDAC1 电流引出另一路作为基准电流流入参考电阻。这样电流激励源在 RTD 和参考电阻上的比例关系严格一致导线压降只要在 RTD 和参考电阻两条路径上比例相等就会在比例式测量中被自动消掉。这里的关键是三根线必须采用相同规格、相同长度的线确保导线电阻一致。理论上讲三线制在软件补零漂之后导线电阻的影响可以做到很小但物理上的对称性是基础。如果现场只能提供两线制比如旧设备改造在中等精度需求下可以接受 — 加补偿电阻和软件校准之后稳个 ±0.2°C 问题不大。但要追求高精度还是老老实实三线制。3.2 模拟电源、参考电容和去耦布局ADS122U04IPWR 这种 Δ-Σ ADC 对电源纹波很敏感尤其是模拟电源 AVDD。HVAC 设备里电源通常来自开关电源或者变频器的母线噪声底子不好。我的做法是模拟电源输入前加低噪声 LDO从 5V 转 3.3V 后独立供 AVDD、DVDD中间加磁珠隔离。AVDD 对地放 10 uF 钽电容 0.1 uF 陶瓷电容并联靠近 AVDD 引脚放置。0.1 uF 必须尽可能贴近芯片至少 2 个过孔直达地层。参考电压引脚REFP、REFN之间放一个 100 nF 低 ESR 陶瓷电容位置同样要紧贴芯片。参考路径上的噪声会直接耦合进转换结果这个位置留一点空间都会在精度上付出代价。另外ADS122U04 的 UART 通信引脚TX、RX在布局时最好加串联电阻22 Ω做阻尼。这不仅减少 EMI 辐射也避免长线缆上反射造成误码。我的板子上 TX、RX 各串了 22 Ω实测 1 米线缆 115200 波特率很稳。3.3 隔离方案的取舍UART 接口做隔离很方便这也是这套方案一个不小的加分项。工业现场要求模拟端和主控端电气隔离时用数字隔离器跨接在 UART 的 TX、RX 两端即可比隔离 SPI 少两根线隔离成本更低封装也更小。隔离电源可以用带隔离的 DC-DC 模块模拟端单独供电数字地DGND和模拟地AGND再统一单点接地或者小电阻互连。我做过一次用 ISO 系列数字隔离器搭配的方案两路数字隔离器正好覆盖 TX、RX波特率 115200 完全没问题。要注意隔离器件两侧的电源都必须有足够的去耦电容否则高速数字翻转的动态电流会把电源打穿。4. 驱动代码从 UART 时序到连续转换实测4.1 UART 配置波特率、帧格式与中断处理dsPIC30F4011 的 UART1 接 ADS122U04。配置上几个参数要确认波特率取 115200这能满足 ADS122U04 的时序要求数据位 8 位无校验一位停止位关闭硬件流控用 DRDY 中断来同步读取时序。有一个容易忽略的点是ADS122U04 在上电或软件复位后需要一小段时间稳定内部时钟这时候 DSC 不要立刻发命令否则第一条指令会被吞掉。我的做法是复位后延时 50 ms再发送同步指令接着清空接收 FIFO保证后续命令时序对齐。// dsPIC30F4011 UART1 初始化示意 void UART1_Init(void) { U1BRG 31; // Fcy40MHz, 115200 U1MODE 0x8000; // 8位数据, 无校验, 1停止位, UARTEN U1STA 0x0440; // 使能发送和接收 IFS0bits.U1RXIF 0; IEC0bits.U1RXIE 1; // 接收中断使能 }4.2 寄存器读写与读数据函数ADS122U04 的 UART 命令格式大致是一条命令字节后跟若干数据字节。读/写寄存器命令用地址加命令字节的组合读数据有专门的命令码。以下是我在工程里实际用的一段读温度数据代码框架去掉了具体寄存器地址细节保留结构逻辑// 发送单字节命令 void ADS_UART_WriteByte(uint8_t cmd) { while (U1STAbits.UTXBF); U1TXREG cmd; } // 写寄存器 void ADS_WriteReg(uint8_t addr, uint8_t value) { ADS_UART_WriteByte(0x40 | (addr 1)); // 写命令格式 ADS_UART_WriteByte(value); } // 连续转换模式下读 4 字节数据状态24位结果 void ADS_ReadData(int32_t *rawAdc, uint8_t *status) { uint8_t buf[4]; ADS_UART_WriteByte(0x1F); // 读数据命令 for (int i 0; i 4; i) { while (!U1STAbits.URXDA); buf[i] U1RXREG; } *status buf[0]; *rawAdc ((int32_t)buf[1] 16) | ((int32_t)buf[2] 8) | buf[3]; if (*rawAdc 0x800000) { *rawAdc | 0xFF000000; // 符号扩展 } }这里有个小经验读数据命令发出去后ADC 返回的是上一次转换结果。如果你在中断里用 DRDY 触发读取DRDY 下降沿本身就表示新数据已就绪这时候发读数据命令读到的就是最新结果不会错位。4.3 把 ADC 原始码换算成温度比例式测量公式拿到 24 位码之后温度换算不是简单地乘一个系数。ADS122U04 的比例式测温原理是RTD 两端的电压V_rtd IDAC * R_rtd参考电阻两端的电压V_ref IDAC * R_refADC 输出码code (V_rtd / V_ref) * (FS / PGA)这里的 FS 是满量程系数。由此可以反推R_rtd R_ref * (code / FS) * PGA校准后得到 RTD 阻值再通过 PT100 的分度表或者查表插值得出温度值。整个链路里只有 R_ref 的精度和温漂是直接影响精度的因素所以 R_ref 必须选低温度系数的精密电阻典型的 0.1% 精度、5 ppm/°C 甚至更好的规格。这里面插值查表比较适合 dsPIC30F4011 这种 DSP 内核把 PT100 分度表按 1°C 间隔存成 16 位整型数组查目标阻值落在哪两个温度点之间线性插值。实测在 0°C~150°C 范围线性插值配合适当分度表步长0.1°C误差可以做到很小。5. 实测数据、干扰排查与标定补救5.1 上电后读不到数据完整排查链路这个问题我遇到不止一次而且新手特别容易卡住。如果你上电之后 DSC 始终读不到有效数据别急着改代码按下面这个链路逐步排查效率最高确认 UART 有没有波形。用示波器看 TX 引脚复位后有没有命令字节发出。如果没有波形查 DSC 的 UART 引脚配置和波特率设置这是最基础也是最常见的问题。确认 ADS122U04 有没有应答。正常情况 ADS122U04 收到命令会返回数据或者在数据引脚上产生翻转。如果只有 TX 信号没有 RX 信号查 RX 线路有没有虚焊、串阻阻值是否过大。确认波特率是否匹配。ADS122U04IPWR 内部时钟由外部晶振或内部振荡器产生如果它自己的时钟源偏差大UART 通信会对不上。实测有的芯片用内部振荡器时偏差在 1%~2%115200 波特率下长数据帧会出错。解决方式是给芯片配外部晶振或者降低波特率到 57600。确认刚开始通信时的同步问题。UART 是异步的ADC 内部没有开机自动对齐机制。很多时候数据读不出来纯属启动时序没对齐。解决办法是发送一组同步脉冲或者复位命令然后进入稳定的读取循环。用读取 ID 寄存器的方式验证通信链路。如果 ID 能读出来说明链路通问题在配置如果 ID 都读不出来问题在硬件或者时序。5.2 温度跳字与 PID 震荡的处理跳字是 Δ-Σ ADC 系统常见现象不是芯片坏了。如果你在室温下看数据偶尔跳 1~2 个 LSB对应温度约 0.00几°C这很正常如果跳字到几十个 LSB就要查外部因素了。我先看电源纹波。用示波器看 AVDD 和 VREF如果开关纹波超过 1 mV就会直接出现在输出码里。处理办法前面说过LDO 加磁珠把电源做干净。再看参考电阻和布线。参考电阻最好用开尔文接法四线接法连接到 ADC 的 REFP、REFN 引脚避免 PCB 铜箔电阻和过孔电阻造成的误差。铜箔走线经过温度变化时阻值会有微小的变化这种变化会被 24 位 ADC 敏锐地捕捉到。最后数字滤波。ADS122U04 的内置数字滤波对 50Hz 的抑制是有限的如果现场干扰大我在 DSC 侧加了一层滑动平均或一阶低通滤波。使用 20 SPS 采样率时再在软件里做 4 点平均得到的温度数据在 PLC 里做温差控制几乎无抖动。5.3 标定的正确姿势和温漂补偿硬件量产后每块板的残差都不一样必须要做标定。我的标定流程是用精密电阻箱模拟 RTD 阻值按对应温度点给入而不是直接拿水银温度计或热电偶去夹传感器排除了传感器自身误差后标定的是 ADC 链路本身。每个温度点0°C、50°C、100°C记录 ADC 实际输出码计算出增益误差和零偏误差在 DSC 固件里做两点或三点校正。温漂补偿不要只做一次。把板子放进温控箱测 20°C 和 60°C 环境下的零漂变化把补偿系数存进 Flash。HVAC 设备装在外面夏天和冬天环境温度差 40°C 是常有的事没有温漂补偿标定完到现场还是会偏。我实测过一批板子标定前最大误差 ±0.8°C温漂补偿之后在 10°C~60°C 环境范围内能守住 ±0.15°C 以内。这个精度对 HVAC 的温控需求来说已经属于富余级别真正限制最终系统性能的往往是传感器本体的精度和现场的安装方式。6. HVAC 场景下的进阶配置与延伸思考6.1 多路温度测量的资源分配ADS122U04IPWR 的输入通道数量有限如果设备需要测 6~8 路温度常用的扩展方式有两种一是用模拟多路开关切换传感器输入共享 ADC 的 PGA 和基准二是用多片 ADS122U04每片分管一组传感器DSC 用两个 UART 分别接两片。实测下来双 UART 方案更干净——每个 ADC 各配各的 IDAC 和 PGA传感器类型可以混接比如 PT100 和 K 型热电偶各一路互不影响。dsPIC30F4011 刚好提供两个 UART接两片 ADS122U04 是资源刚好匹配的设计。而且每一片都有自己的数据就绪中断DSC 通过不同中断线区分数据源代码逻辑很清晰。成本上比用模拟多路开关加高精度前置放大器还便宜而且维护简单。6.2 与 Modbus RTU 无缝对接的数据处理HVAC 里上位机或楼宇自控系统读取温度通常走 Modbus RTU。dsPIC30F4011 做数据采集之后温度值以 0.01°C 为单位存放在寄存器里Modbus 功能码直接读取。这时的建议是寄存器里存放的是线性化后的温度值乘以 100 的整数而不是原始 ADC 码。上位机不需要知道传感器类型、PGA 增益、IDAC 电流这些细节只认温度值即可维护迭代成本更低。把原始码换算温度值和把温度值打包进 Modbus 寄存器这两步都放在 DSC 里做。这样上位机可以兼容不同传感器类型更换传感器探头或者修改线性化算法都不会触发上位机的协议变更。这个设计思路在项目可维护性上是巨大的加分项。6.3 在 HVAC 之外这套方案的扩展想象这套UART ADC 16 位 DSC的架构也可以迁移到别的场景。比如冷冻水/冷却水的流量与热量计量。ADS122U04 测温度DSC 同时采集流量计脉冲实时计算热焓值是高精度热量计的基础架构。机房温度场监测。数据中心里需要大量温度探头这种方案在成本和抗干扰上的优势体现得非常明显。工业设备热保护。电机绕组、轴承温度连续监测一旦过温立即由 DSC 输出保护信号整个时间链路短且确定。从商业角度说这套方案的核心价值不是某个芯片有多强而是组合在一起后系统可以在保证精度的同时显著降低设计难度和布板成本。对于批量出货的 HVAC 控制器而言这个组合每路成本能控制在比较低的水平这在产品竞争中是相当关键的。我个人在做这套方案过程中的体会是硬件设计上把模拟电源和参考路径做干净软件上把启动时序和读取时序做严格剩下 70% 的坑基本都能躲开。剩下 30% 的坑集中在现场干扰和传感器误差这些很难提前预测的因素上留好校准接口和滤波算法事后再调也是常规操作。如果你正准备在新项目里用 ADS122U04IPWR 搭配 dsPIC30F4011建议先照这篇文章把最小系统跑起来把温度数据稳定读出来再逐步加复杂功能少走弯路。