我在楼宇自控项目的首版样机里第一次用这块组合时,其实是被逼出来的:四路 Pt1000 管道温度要送到控制器,0~100℃范围内要求 ±0.2℃,控制柜里还有几台变频器在那里嗷嗷叫。头一版我直接用 PIC18F55K42 自带 ADC 做采样,长线压降、共模噪声、参考电压波动叠在一起,数据根本稳住。后来我把模拟采样这摊事交给 ADS122U04IPWR 这颗 24 位 ADC,PIC18F55K42 只负责通过 UART 读数据和做控制逻辑,问题才算真正收口。这篇就把我在这个方案里踩过的坑、试过能用的接法、初始化流程和校准方法完整写出来,给想做工业温度变送器或 HVAC 温控板的工程师一个可以直接参考的蓝本。
1. 为什么是这个组合:24位ADC与工业MCU的分工逻辑
1.1 工业温度信号的"真实尺寸"决定了普通MCU搞不定
很多人觉得测温度不就是读个电压吗?关键在于信号太小。以 Pt100 为例,0℃ 时阻值 100Ω,用 250μA 的激励电流去激励,电压只有 25mV。到 100℃ 时阻值变成约 138.5Ω,电压也才 34.6mV。也就是说,整个测温量程内的信号变化幅度只有不到 10mV。普通 MCU 的 10 位、12 位 ADC 配合内部参考电压,通常 LSB 都在 1mV 上下,这个量级基本等于把目标信号放在量化噪声边缘,再加上运放漂移、地弹、开关电源纹波,结果就是温度读数像心电图一样抖。
这时候你面临两个选择:要么在外面加高精度仪表运放和独立基准源,把信号放大到 MCU 能吃进去的范围;要么直接用一颗内置 PGA、低温漂参考源和可编程电流源的 24 位 ADC。ADS122U04IPWR 属于后者,而且它和 MCU 之间走的是 UART 接口,不是 SPI 也不是 I2C。这个接口差异在实际项目里非常有用,尤其是传感器板和主控板分离的场景,UART 两线就能拉很长距离,光耦隔离也便宜好做。
1.2 ADS122U04IPWR 的定位:把"模拟前端"彻底从MCU身上剥离
ADS122U04IPWR 的 IPWR 后缀指的是 TSSOP 封装和卷带包装,很多帖子容易把这颗芯片和 SPI 接口的 ADS1220 搞混。ADS1220 是 SPI 从机,而 ADS122U04 是 UART 从机,两者引脚、寄存器、帧格式完全不同,选型时一定要看清后缀。
这颗芯片内部集成了我最看重的几样东西:
- 24 位 Δ-Σ ADC,带 4 通道输入多路复用器;
- 可编程增益放大器 PGA,增益档位从 1 到 128 可选;
- 内部低温漂参考电压,典型 2.048V;
- 两个可编程激励电流源 IDAC,可以直接驱动 RTD,省掉外部恒流源电路;
- UART 接口,由外部主机发送命令读写寄存器。
这套组合对工业温度测量意味着什么?意味着传感器激励、信号放大、模数转换、参考电压这些最容易出问题的部分,全部封装在单一芯片内部,PCB 面积砍掉一大半,故障点也少一大半。我做的那块 HVAC 采集板,前级几乎就靠这颗芯片加几个电阻电容搞定,模拟部分非常干净。
1.3 PIC18F55K42 在系统里真正该干什么
PIC18F55K42 是 Microchip 的 8 位 MCU,很多人一看到"8 位"就觉得低端,但在这种测温应用里它的资源其实完全过剩。这颗芯片最值钱的地方不是 CPU 主频,而是那堆 Core Independent Peripherals(CIP),也就是不占用 CPU 也能自己干活的外设。
我把它用作 UART 主站,负责给 ADS122U04 发配置命令、周期读取转换结果,然后做线性化、校准、滤波,最后把温度值通过 RS485 或四线电流环送给上位机。PIC18F55K42 自带的 ADC2 模块带硬件平均和计算功能,可以顺便做冷端补偿(如果接热电偶)或监测电源电压。如果系统里还要控加热器、风机,它的 PWM 模块和 CLC 可配置逻辑单元还能直接做硬件保护,比如过温无软件直接切入安全状态,这在 HVAC 柜里很有价值。
所以这个组合的分工很清楚:ADS122U04IPWR 负责把温度物理量变成可信的数字量,PIC18F55K42 负责把数字量变成业务逻辑。模拟和数字的边界一刀切下去,两边都好维护。
2. 信号链设计:从传感器到ADC引脚的完整接法
2.1 Pt100 / Pt1000 三线制接法:激励电流应该这样给
RTD 测温最怕导线电阻,两线制在小信号放大下没有任何工程价值。工业现场我优先推荐三线制或四线制。ADS122U04 内部有两个可编程电流源 IDAC1 和 IDAC2,可以专门用来做三线制 RTD 的线阻补偿。
以三线制 Pt100 为例,典型做法是:将 IDAC1 接到 RTD 的一端,电流流过 RTD 后从另一端回到模拟地;丽外两根导线分别接到 ADC 的差分输入 AINP 和 AINN,通过相同长度的导线把 RTD 两端的电势引回来。因为 AINP 和 AINN 两条回线上流过相等的激励电流(或者说线阻相同),两条线上的压降被差分输入抵消,剩下的就是 RTD 本体上的电压。
设计时要注意两点:一是激励电流不要设太大,通常 250μA 或 500μA 就够,再大会导致 RTD 自热,温度读数偏高;二是 ADC 的采样开关是开关电容结构,输入需要低阻抗来源,所以差分输入端对地各放一个 1nF~10nF 的电容,对抑制高频噪声和电荷注入很有帮助。
2.2 NTC 热敏电阻在 HVAC 场景里的接法选择
HVAC 系统里大量使用 10kΩ NTC 热敏电阻,B 值常见 3435 或 3950。NTC 的好处是便宜、响应快、灵敏度高,缺点是线性度差、一致性靠元器件档位保证。对于管道温度、回风温度、供水温度这种 0~100℃ 范围内的测量,NTC 完全够用。
NTC 的接法通常使用分压电路:NTC 一端接电源或参考电压,另一端串一个精密电阻到地,中间抽头进 ADC。如果直接用 PIC18F55K42 的 ADC 做,分压点电压受电源波动影响大;换成 ADS122U04 后,可以让分压电阻接到内部参考电压上的稳压电源,或者干脆用比例测量法,让 ADC 的参考电压和分压激励电压同源,这样参考电压本身的漂移会被抵消掉。
还有一个容易忽略的点:NTC 分压法中电流是持续流过的,自热效应必须算。10kΩ NTC 在 25℃ 时,如果分压供电 3.3V,流过电流约 0.33mA,功耗约 1.1mW,对应自热误差可能到 0.1℃ 以上。所以激励电压尽量降低,分压电阻阻值尽量取大,或者用 IDAC 恒流激励并用 ADC 高增益档测量。
2.3 ADS122U04 外围器件:参考电容、滤波电阻与 ESD 保护
这颗 ADC 对外围器件要求不算苛刻,但有几个位置不能省:
- 参考电压去耦电容:内部参考的 REF 引脚需要加滤波电容,典型值 0.1μF 并一个 10μF 电容,布局要贴着引脚放,走线尽量短;
- 输入滤波:差分输入端各串一个几十欧到几百欧的电阻,再接对地电容,组成简单 RC 低通,把射频干扰和电机逆变器的高频噪声挡在外面。RC 时间常数不要过大,否则会拖慢传感器响应;
- ESD 保护:传感器线缆会引出柜外,工业环境必须加 TVS 管或压敏电阻,串联限流电阻。ADC 内部有部分保护,但别拿昂贵的芯片去赌现场浪涌。
这里我再强调一次:ADS122U04 是模拟器件,模拟输入引脚不能直接拿万用表针去戳,不能靠近数字线平行长距离布线。我见过不少板子功能调通了,EMC 测试不过的,最后都是输入走线绕太远、被数字开关噪声串扰导致的。
2.4 供电与地线:模拟和数字怎么分才干净
PIC18F55K42 和 ADS122U04 如果共用一组供电,数字部分 I/O 翻转时产生的毛刺会通过电源线传导到模拟部分。我的做法是电源先进 MCU,MCU 输出经过一个磁珠或小电感,再加 10μF 和 0.1μF 两级电容,单独供给 ADS122U04。地平面统一使用单点连接,不要把模拟地和数字地割成两片孤岛,否则会产生更大的地环路。
如果做的是工业变送器,UART 和外部主机的隔离是必须考虑的。最简单方案是加两个数字隔离器或光耦,给 ADS122U04 的供电端留出独立的隔离电源。UART 速率通常不高,光耦的上升沿慢一点也能用,但要注意波特率误差,我个人会用带施密特触发输入的光耦,波形干净很多。
3. UART链路与寄存器初始化:让24位数据流进来
3.1 ADS122U04 的 UART 从机协议到底怎么理解
ADS122U04 的 UART 接口不是 Modbus,也不是传统串口透明传输,它是芯片自己定义的一套 8 位命令帧结构。主机往 RX 脚发送命令,芯片在 TX 脚回响应。通信建立前要先确认波特率、帧格式、设备地址这三件事。波特率一般由主机根据数据手册配置,常见温度测量用不到高速,低速下通信更稳;设备地址用于多设备挂总线时区分目标芯片。
刚开始调这块芯片,我建议不要上来就想配置寄存器,先用最简单的"读设备 ID"命令测试通路。如果你能正常读到芯片返回的 ID 值,说明 UART 时序、地址、电平都对了,再往下走。如果这一步都过不去,检查示波器上的波形远比用逻辑分析仪抓复杂帧更高效——先看电平能不能正常拉低,再看波特率对不对。
3.2 关键配置项:增益、数据速率、激励电流和参考源
配置寄存器时,重点是这几个决策:
- PGA 增益:取决于传感器输出信号范围和 ADC 参考电压。以 Pt100 为例,250μA 激励下 0~100℃ 对应 25mV~34.6mV,内部参考 2.048V,PGA 增益取 16~64 比较合适,保证信号占满量程的 30% 以上;
- 数据速率:Δ-Σ ADC 的速率和噪声、工频抑制直接挂钩。工业现场优先选择能被 50Hz 整除的数据速率档位,让内置数字滤波器在工频及其谐波处形成凹陷;
- IDAC 电流值:RTD 工况常用 250μA 或 500μA,NTC 分压或恒流激励根据阻值选择更小电流,避免自热;
- 输入通道选择:多路复用器切换到目标通道,闲置通道接地或设为高阻,避免悬空引脚引入噪声;
- 参考源选择:使用内部参考还是外部参考,必须和分压比例测量法联系起来。
3.3 从 PIC18F55K42 侧发起通信:初始化顺序和示例代码
在 PIC18F55K42 上我用 MCC 生成 UART 基础代码,波特率按数据手册要求设置。主机侧的初始化顺序建议是:系统上电稳定后,硬件复位 ADS122U04(如果有复位引脚,拉低再释放),等待几十毫秒,再发送复位命令,之后读设备 ID,最后逐条写配置寄存器。这个顺序能避免芯片上电瞬间寄存器处于未知状态导致的第一帧乱码。
下面是一段精简的示意见程,实际寄存器地址和位定义务必以官方数据手册为准:
// 伪代码:仅示意结构 void ADS122U04_Init(void) { ADS122U04_Reset(); // 硬件复位,等待 10ms UART_SendCMD(CMD_RESET_SW); // 软件复位 delay_ms(10); uint8_t id = UART_ReadDevID(); // 第一步:确认通信链路 if (id != EXPECTED_ID) { // 处理通信异常 } ADS122U04_WriteConfig( PGA_GAIN_32, DATA_RATE_50SPS, REF_INTERNAL, IDAC_250uA ); ADS122U04_SelectChannel(AIN0_AIN1); }读取转换结果时,我一般用中断方式收满 24 位数据,收到后校验一下帧格式是否合法。不要在 UART 接收中断里做温度换算,那样会拉长中断服务时间,万一再有其他外设中断,容易丢字节。正确做法是中断里只把 24 位原始数据搬到缓冲区,主循环里再处理滤波和换算。
3.4 帧校验与错误恢复策略
UART 通信最怕假报文。温度变送器对数据连续性的要求很高,所以错误处理要有策略:
- 收到非法帧或校验不匹配时,不要立刻清空状态,先连续丢弃 N 帧,再重新请求一次读取;
- 如果连续多次通信失败,可能是 ADS122U04 进入了异常模式,执行一次软件复位,重新初始化寄存器;
- 在 HVAC 系统中,控制策略对温度缺失非常敏感,我的处理是通信失败时输出上一次有效值并打告警,而不是输出 0 或满量程,否则控制器会误判为超低温或超高温,可能触发错误的加热/制冷动作。
4. 把原始码变成温度:线性化、校准与误差分配
4.1 从 24 位二进制补码到电压和电阻
ADS122U04 的转换结果一般是 24 位二进制补码,正满量程对应 0x7FFFFF,负满量程对应 0x800000。换算公式虽然每家器件细微差别,但思路是一样的:
电压 = 原始码 × (2 × 参考电压) / (增益 × 2^24)(部分器件按 2^23 归一化)。
以内部参考 2.048V、PGA=32 为例,满量程范围约 ±64mV,理论 LSB 电压约 7.6nV。但别高兴太早,24 位只是器件的固有分辨率,实际可重复精度要查数据手册的噪声曲线。在 50SPS 数据速率下,等效有效位数往往在 19~21 位,对应温度分辨率仍在 0.001℃ 量级,对 HVAC 和工业控制来说绰绰有余。
得到电压后,如果是恒流激励,电阻值 = 电压 / 激励电流。三线制 RTD 需要减掉补偿处理,四线制直接测量,这里建议把激励电流的精确值作为校准参数保存,因为 IDAC 有初始误差和温漂。
4.2 Pt100 线性化:查表、多项式和 CVD 方程
Pt100 的标准特性用 IEC 60751 曲线描述。工程上有三种做法:
- 查表法:把 0~850℃ 的阻值表固话到 PIC18F55K42 的 Flash 里,二分查找后线性插值。实现简单,占用 Flash 约 4~6KB,精度能到 0.1℃ 以内;
- 多项式法:0~100℃ 范围内用二次多项式拟合,计算量小,适合 8 位 MCU;更宽范围用 Callendar-Van Dusen 方程,但解方程稍复杂;
- 简化比例法:只用 0℃ 和 100℃ 两个点做直线近似,适合要求不高的 HVAC 场景,误差最大能到 0.3℃ 左右。
我的实际做法是:在 PIC18F55K42 上用浮点库算 CVD 方程,虽然 8 位 MCU 浮点慢一点,但温度测量本来就不是高速场景,每次计算只有几步,稳稳的。注意 C 编译器开浮点优化会让代码变大,要留意 Flash 剩余空间。
4.3 NTC 的 Steinhart-Hart 方程与 B 值近似
NTC 阻值与温度是指数关系,直接线性拟合误差很大。常用的是 Steinhart-Hart 方程:
1/T = A + B·ln(R) + C·(ln(R))³
这个方程需要三个校准点来解出 A、B、C。如果嫌麻烦,也可以用厂家提供的 B 值公式:
R = R25 · exp(B · (1/T - 1/298.15))
在 HVAC 中 B 值公式已经够用,但注意 B 值公式在两端温度误差会比 Steinhart-Hart 大不少,做 -10℃ 以下的冷热工况或 80℃ 以上热水温度时,建议还是用三点校准。
4.4 两点校准与误差分配表
不管用哪种传感器,变送器出厂前都要校准。我的标准流程是:用恒温槽(或者干体炉)设置两个校准点,比如 0℃ 和 100℃,记录 ADC 原始值后,计算增益校正系数和零点偏移量,并保存到非易失区。这样能够同时纠正 ADC 增益误差、参考电压初始误差、传感器互换偏差的一部分。
误差分配要心里有数。典型链路上:
| 误差来源 | 典型量级 | 缓解手段 |
|---|---|---|
| Pt100 传感器精度 | ±0.15℃(Class A) | 选 A 级铂电阻 |
| ADC 参考温漂 | 几 ppm/℃ | 内部参考已优化,外部工艺控制 |
| 激励电流漂移 | 影响电阻比 | 同一时刻比例测量 |
| 线性化近似 | 0.01~0.3℃ | 用 IAU 60751 公式/查表 |
| 自热效应 | 0.01~0.2℃ | 降低激励电流 |
每个环节都抠一遍,整体系统才能做到标称 ±0.2℃。只追求 ADC 位数是没用的,传感器本身的等级往往才是天花板。
5. 工业现场和HVAC柜里的实战抗干扰
5.1 50Hz 工频干扰:数据速率选择的学问
工业环境最大的干扰源是 50Hz 工频及其谐波。Δ-Σ ADC 内置数字滤波器,数据速率只要选择恰当,就能在干扰频率处形成陷波。比如把数据速率设为 20SPS,滤波器会对 50Hz、150Hz、250Hz 这些位置有很强的抑制。HVAC 柜里变频器很多,逆变器载频通常在 2kHz 以上,光靠 ADC 滤波器不够,前级 RC 和 PCB 布局更重要。
如果现场干扰特别严重,我还会在 PIC18F55K42 里再做一次平均值滤波或一阶低通滤波。注意平均数量要取整数个工频周期对应长度,否则会引入新的混叠。
5.2 三线制线阻补偿的实际计算
三线制的补偿原理是让两条等长导线的电阻在差分测量路径上被抵消。设每根导线电阻为 Rline,IDAC1 电流经过 RTD 后从 AINN 回路返回,理想情况下:
VAD = I × (RRTD + Rline) − I × Rline ≈ I × RRTD
当然这是理想情况,实际需要保证两根导线长度一致、材质相同,否则残余误差还是会出现。如果施工时用了一根长一根短,再好的 ADC 也救不回来。我在项目规范里要求所有温度探头使用同等长度双绞屏蔽线,往回引线多出来的部分必须预留相同的线长。四线制能彻底解决线阻,但需要传感器支持四线引出,成本会高一些。
5.3 HVAC 的热响应与采样周期选择
HVAC 系统和大块金属设备的热惯性很大,管道里的水温变化不可能瞬间跳变。采样周期没必要设成 5ms、10ms 这种高速率,反而会把噪声采进来。我一般把 ADS122U04 的数据速率设在 20~50SPS,PIC18 每 1~2 秒读一次最新值并做滤波,既稳定又省电。磁盘管温度、回风温度这种随房间负荷变化的量,时间常数本来就以几十秒计,你做得再快控制也用不上。
5.4 PCB 布局:模拟输入、UART 与隔离的几条铁律
最后说布局,这块板子我改了三版才稳定,教训很深:
- 模拟输入走线必须短,RTD 过来的双绞屏蔽线在进入 PCB 前就接好 TVS 和 RC,再接 ADC 引脚;
- UART 信号线如果在板内走线,尽量远离晶体振荡器和 PWM 输出,两侧包地;
- 如果 UART 需要跨接光耦隔离,光耦的供电要用独立隔离电源,不要把隔离前后电源混在一起;
- 晶体振荡器放在 PIC18F55K42 旁边,走线不要穿过模拟输入区域。
6. 调试、踩坑与长期运行的要点
6.1 第一步就卡壳:读不到数据的排查链路
我调试这块方案时最常遇到的问题就是"UART 发出去命令没响应"。我建议的排查顺序是:
- 拿示波器看 ADS122U04 的 RX 和 TX 波形,确认主机发出的电平有没有到达芯片引脚;
- 检查芯片供电电压和复位状态,很多 TSSOP 封装的焊盘虚焊会导致上电异常;
- 确认帧格式,包括起始位、停止位、波特率误差。PIC18 的 UART 模块对波特率误差有限制,如果用了内部振荡器且没校准,误差可能超范围;
- 确认设备地址。地址不匹配时,芯片会直接沉默,这个坑最隐蔽。
6.2 能读到数据但数值乱跳:噪声还是配置问题
如果读数在几摄氏度范围内跳动,先看数据速率和 PGA 增益的搭配。低速率高增益下噪声最小,别为了追求刷新率把数据速率拉太高。再看激励电流,RTD 激励电流太小,信号幅度低,信噪比就差;太大则自热。最后检查传感器的屏蔽线是否单端接地,如果屏蔽线两端都接地,地环路会引入新的工频干扰。
6.3 温度整体偏移:别急着怀疑ADC
整体偏差 0.5℃ 以上的情况,第一怀疑对象通常是校准参数和传感器本身。我曾经花了两天查一块板子,最后发现是恒温槽里的标准温度计没有检定,参考点本身就偏了。校准器具的精度必须比被测对象高一个数量级,这是原则。另外 NTC 的批次一致性不好,每一批器件都要重新标定,不能用上一批的校准表直接代。
6.4 长期漂移与定期再校准
工业变送器和 HVAC 控制器的长期稳定性很重要。铂电阻本身老化很小,但 ADC 参考电压和外围电阻会随时间和温度变化。我的做法是系统里留一个精密基准电阻通道,定期切换到标准电阻自检,自动修正校准系数。这样能把长期漂移对系统的影响降到最低,用户端维护成本也会低很多。
另外一个被很多人忽略的坑是:NTC 和 RTD 探头在接线端子处的氧化会导致接触电阻变大,尤其 HVAC 柜里湿度高时。项目上最好选镀金端子并定期紧固螺丝,不然冬天夏天温差一大,读数就开始慢慢漂。
最后说个我自己的体会:做温度测量这种东西,方案的精髓不在某一颗芯片有多高级,而在信号链上每一个环节都能稳定且可预期。ADS122U04IPWR 和 PIC18F55K42 的组合,一个把模拟前端做扎实,一个把控制和校准做灵活,是做工业变送器和 HVAC 温控板很省心的一套搭配。如果你也正被传感器小信号和现场干扰搞得头疼,不妨按这个思路搭一版试试。