☰
ADS122U04与PIC18F85J50工业测温:UART+RTD比例测量实战
2026/11/5 5:01:58 网站建设 项目流程

“搞工业测温的都知道,模拟前端和主控之间的通信选型,往往比传感器本身更折磨人。” 这句话我写在项目总结的开头,是真实感受。最近完成了一套基于 ADS122U04IPWR 与 PIC18F85J50 的温度测量系统,覆盖工业现场和 HVAC(暖通空调)两条应用线,实测下来的体会是:这个组合在分辨率、通信距离、成本三者之间,找到了一个很务实的平衡点。ADS122U04IPWR 是德州仪器一颗自带 UART 接口的 24 位 Delta-Sigma ADC,PIC18F85J50 是微芯的老牌 8 位单片机。把这两颗芯片放在一起,用 UART 而不是 SPI/I2C 连接,算是整套方案里最值得说的一步棋。

温度测量看起来简单,把传感器电阻或电压变成数字量而已。可放到工业环境里,压缩机旁、电控柜里、蒸汽管道边,问题立刻变复杂:信号线长、电磁干扰大、传感器类型杂、MCU 资源有限、还要保证长时间稳定运行。ADS122U04 恰好把这些痛点一起打包处理了,而 PIC18F85J50 负责把数据稳稳地接收、换算、上传。这篇文章会把选型思路、关键电路、固件流程、现场调试经验完整记录下来,适合正在做工业温控、HVAC 控制器、分布式采集模块的软硬件工程师参考。

1. 选型推演:从系统痛点反推芯片组合

1.1 工业测温真正难在哪儿

我习惯先列系统级问题,再回头挑芯片,而不是拿两页参数表对着比。工业温度测量表面上只要求“把温度读准”,拆开看其实是四个硬骨头。

第一是信号链长度。现场传感器往往离控制器几米甚至几十米,毫伏级的小信号在长线缆上极易被污染。第二是传感器种类杂,PT100、PT1000、热电偶、NTC 都可能出现,最好一个采集模块通吃。第三是 MCU 资源问题,做产品时不可能为了一个测温模块上 32 位 Cortex-M4,成本上完全不值得。第四是长期可靠性,工业设备要 7×24 小时跑,环境温度可能从 -40°C 到 85°C,器件级联越简单、接口越稳定,后面越省心。

HVAC 场景还额外加了一条:量大、成本敏感、后续维护少。冷冻机组、组合式空调箱、新风机组上,一个控制器要测好几路温度,每路都配独立调理芯片肯定不现实,所以更希望一颗 ADC 多通道输入,配合一路简单串口把数据送给主控。

1.2 为什么挑中 ADS122U04IPWR

ADS122U04IPWR 这个后缀值得先拆一下:I 代表工业温度等级,PWR 是德州仪器 TSSOP-16 封装代号。这颗芯片最核心的卖点,是把 24 位 Delta-Sigma ADC 和 UART 串行接口做在了一起。

很多工程师第一反应是,24 位 ADC 到处都是,为什么非要带 UART 的?我自己的实际经历是:实验室里用 SPI 没大问题,MCU 和 ADC 只隔几厘米,但到工业现场,SPI 的时钟线在长距离上就是一根天线,传感器信号在设备间走来走去,时钟线上的噪声会直接导致通信错乱。I2C 更麻烦,速率上不去,还要处理地址和上拉电阻。UART 天生只有两根线,没有时钟同步问题,如果再外接一颗 RS-485 收发芯片,整个采集单元可以甩到几十米外,这在 HVAC 机房和工业设备里非常实用。

这颗芯片还内置了可编程增益放大器(PGA)和两个激励电流源 IDAC,这是为 RTD 温度测量量身定做的。后面讲比例测量时会细说,这里先记住结论:用内部电流源加外部参考电阻的方式,可以把激励电流的温漂误差整个消掉,这是普通 ADC 加外部分压方案做不到的。

I 也纠正一个常见误区:24 位分辨率的有效精度并不等于 24 位。“分辨率”是 ADC 能分辨的最小台阶,真实精度取决于参考源、PGA 噪声、布线质量以及校准水平。ADS122U04 在工业场景里能跑到 16 到 18 位有效精度已经非常理想,这对温度测量完全足够,毕竟 PT100 在 100°C 时的电阻变化只有约 0.39Ω/°C。

1.3 为什么还用 8 位机 PIC18F85J50

ADS122U04 已经把模拟前端全部包揽,主控任务就变得很纯粹:初始化串口、发命令、读数据、换算温度、做滤波、上传结果。这些事一颗 8 位 MCU 完全能胜任,硬上 32 位只会让成本、功耗和调试复杂度一起上升。

PIC18F85J50 是微芯的 80 引脚 8 位单片机,64KB Flash、3.9KB RAM 左右,工业级温度范围。它在电源电压上与 ADS122U04 一样是 3.3V,两片可以直接同轨供电,不需要电平转换。选它还有一个非常现实的因素:工业市场供货周期长、价格稳定,MPLAB X 加 XC8 的工具链成熟,项目换人接手也容易。

片上有多个 EUSART 模块,正好分出一路接 ADS122U04,另一路留给 RS-485 或调试串口。原本我以为 8 位机的处理能力会不够用,实际跑下来,每秒采集一次温度、做滤波、换算、上传,CPU 占用率还不到 20%。控制器的固件越简单越不容易出 bug,这条经验在工业产品上屡试不爽。

2. 硬件电路:把模拟前端做到“不用动脑”

2.1 传感器与通道规划

HVAC 现场最常见的温度传感器有三种:NTC 热敏电阻、PT100/PT1000 铂电阻、K 型热电偶。它们脾气各不相同。

NTC 便宜量又大,热水管和风管上大量使用,但非线性严重,长期稳定性也一般。铂电阻线性度好、重复性好,工业场合是首选,就是贵一点。热电偶能测高温,但输出信号只有几十微伏,且必须做冷端补偿,否则误差大得离谱。

ADS122U04 有 4 路模拟输入,可以配置成四路差分或者多路单端,再加上芯片自带的内部温度传感器,正好可以做热电偶的冷端补偿参考。我实际项目的通道规划是:通道 1 接 PT1000 测回风温度,通道 2 接 NTC 测盘管温度,通道 3 接 K 型热电偶测压缩机排气管,剩下一路接内部温度传感器做冷端。

规划通道时有个容易被忽略的点:每路输入在配置寄存器里的 PGA 增益、IDAC 电流档位、滤波模式可能不同,程序里必须在切换通道时同步更新配置,否则会出现“上一个通道的增益设置残留到下一个通道”的隐患。我早期就踩过这个坑,后来干脆每次采样前都完整写一遍配置寄存器,虽然多几条命令,但逻辑上干净很多。

2.2 比例测量:Rref 和 IDAC 的神仙配合

这是整套方案里最值得展开的内容。用 RTD 测温时,最忌讳的是用稳压源给传感器供电再测电压,因为稳压源的绝对电压会随温度和负载变化,测出来的值里掺杂着供电漂移误差。

比例测量的做法是:芯片内部电流源 IDAC 产生一个电流 I,让同一股电流依次流过参考电阻 Rref 和铂电阻 RTD,然后用 ADC 分别测两个电阻上的电压。由于两个电压来自同一电流,电流绝对值的漂移会在比例运算中直接约掉,基准电压只需要稳定和匹配,不要求高精度绝对值。这个原理就像用天平和标准砝码去称重,砝码值准了,手抖一点也没关系。

具体到一版实际电路,我用的配置是:IDAC1 配置为 500μA,参考电阻 Rref 选 2.74kΩ、0.1% 精度、温漂 25ppm/°C 以内的精密电阻。500μA × 2.74kΩ = 1.37V,这个电压正好落在 ADC 外部基准的合理范围内。PT100 在 0°C 时电阻 100Ω,压降 50mV;100°C 时电阻约 138.5Ω,压降约 69mV。经过 PGA 放大 8 倍后,输入 ADC 的信号是 0.4V 到 0.55V,远低于供电轨,处于非常舒服的量程。如果接 PT1000,同样电流下压降放大十倍,PGA 改为 2 倍即可。

关于 IDAC 电流大小要提醒一句:并不是越大越好。电流太大会让 RTD 自热,也就是电流在探头内部产生额外温升,造成测量值偏高。500μA 的功耗只有 25μW 到 35μW,对大多数工业探头来说可以忽略。若是薄膜型 PT100,散热条件差,建议降到 250μA。

三线制接法在长线测温时是必须的。简单说就是在 RTD 远端补一根引线,让其中两根引线分别接到 ADC 的两个输入通道,引线电阻以共模形式出现,被差分输入抑制掉。HVAC 现场一般三线制就够,四线制效果最好但线缆成本高,一般只在计量级场景使用。

2.3 电源与地:24 位 ADC 最怕的不是噪声,是乱地

24 位 ADC 很容易让新手迷信“高分辨率”,但到了现场,决定精度的往往是地线和参考电阻。经验上有三件事必须做对。

第一,AVDD 和 DVDD 可以共用一颗 3.3V LDO,但数字电源路径上必须串磁珠或小电阻做隔离,避免数字开关噪声回流到模拟地。第二,ADC 下方的模拟地与 MCU 的数字地单点汇合,两层板更要专门规划,别让开关电源的回流路径从模拟区域下面穿过去。第三,参考电阻两端到 ADC 的 REFP/REFN 引脚要走短,最好用 0603 封装,走线不要和数字信号线平行。这些基础工作做不好,后续软件怎么滤波都没救。

工业现场接口必须有 ESD 防护。UART 只要出了板,就要加 TVS 阵列。如果走 RS-485,收发器要选带浪涌保护或带隔离的型号。HVAC 设备在雷雨季节,地环路感应出来的电压相当吓人,我一个客户就遇到过烧坏整块通信卡的情况。

2.4 UART 物理层与 PIC18F85J50 对接

ADS122U04 出来的是 3.3V TTL UART,PIC18F85J50 的 GPIO 也是 3.3V 电平,所以可以直接对接。连接方式很简单:PIC 的 TX 接 ADS 的 RX,PIC 的 RX 接 ADS 的 TX,两片共用一组 3.3V LDO 供电。如果还要把数据传到上位机,就从 PIC 的另一组 EUSART 接 RS-485 芯片,这样温度采集链和远程通信链彻底分开,互不干扰。

有一个很容易被忽视的细节:MCU 上电后,ADS122U04 内部需要一段稳定时间,如果 MCU 一启动就立刻发 UART 命令,很可能丢掉第一帧。我的做法是上电后先延时 10ms 到 20ms,再开始初始化 ADC,这个小延时成本几乎为零,能省很多奇怪的“上电无响应”问题。

3. 固件开发:先跑通一帧数据,再谈温度换算

3.1 单片机 UART 初始化

PIC18F85J50 的 EUSART 配置,我习惯用 MPLAB Code Configurator 生成,再手动调整关键参数。这里给一段 XC8 环境下的初始化示例,系统时钟按 24MHz 计算。

// XC8, PIC18F85J50, 系统时钟 24MHz void EUSART1_Init(void) { TXSTAbits.BRGH = 1; // 高速模式 BAUDCON1bits.BRG16 = 1; // 16 位波特率生成 SPBRG1 = 155; // 24MHz / (16*9600) - 1 = 155.25 TXSTAbits.TXEN = 1; // 使能发送 RCSTAbits.SPEN = 1; // 串口使能 RCSTAbits.CREN = 1; // 连续接收使能 PIE1bits.RC1IE = 1; // 接收中断使能 }

SPBRG 的计算过程很简单:目标波特率 9600,24MHz 时钟下,16 倍过采样对应的分频值是 24MHz / (16 × 9600) = 156.25,再减 1 得 155.25,取整为 155。实际波特率约 9615bps,偏差 0.16%,远在 UART 容差范围内。如果通信时好时坏,先用示波器看看波形和实际波特率,这是排查串口问题第一件事。

3.2 ADS122U04 命令帧封装思路

ADS122U04 是命令应答式协议,MCU 发一帧,ADC 回一帧。数据手册里定义了完整的字节格式,这里只写封装思路,不把手册逐字节抄过来,因为不同版本手册的位定义略有差异,以你手上最新版为准。

// 命令宏定义:实际值请按数据手册填写 #define CMD_READ_DATA 0x12 #define CMD_WRITE_REG 0x40 #define CMD_START 0x20 typedef struct { uint8_t cmd; uint8_t arg; uint8_t crc; } ads_frame_t; void send_cmd(uint8_t cmd, uint8_t arg) { ads_frame_t f; f.cmd = cmd; f.arg = arg; // 校验字节规则以手册为准,这里示意 f.crc = cmd ^ arg; UART1_WriteByte(f.cmd); UART1_WriteByte(f.arg); UART1_WriteByte(f.crc); }

我强调这个示例不是让你直接抄,而是说清楚协议层一定要做封装。真正写驱动时,把 send_cmd 和 read_frame 做成底层函数,上层逻辑只需要关心“配置寄存器”“启动转换”“读数据”这几个动作。如果把帧拼接的细节散落在业务代码里,后面排查问题会很痛苦。

3.3 完整采集流程的骨架代码

一个采集周期分成四步:配置寄存器、启动转换、等待完成、读取码值。下面是我实际项目中的 PT100 采集骨架,去掉具体寄存器值后仍然有参考价值。

#define R_REF_OHMS 2740.0f #define ADS_FS_CODE 0x7FFFFF // 返回 RTD 电阻值 float read_pt100_resistance(void) { // 1. 配置差分通道 AIN0/AIN1,PGA=8,IDAC=500uA,基准=外部REFP/REFN // ads_send_cmd(CMD_WRITE_REG, cfg_val); // 2. 启动一次转换 // ads_send_cmd(CMD_START, 0x00); // 3. 等待 DRDY 拉低,再读 24 位码值 // uint32_t code = ads_read_data(); uint32_t code = 0x123456; // 示意:实际从 ADC 读取 // 比例测量:电阻 = 码值比例 × 参考电阻 float ratio = (float)code / ADS_FS_CODE; return ratio * R_REF_OHMS; }

这里有个关键点:比例测量最终只需要知道 Rref 的欧姆数,不需要知道 ADC 基准电压实际是多少。因为码值本身就是输入电压与基准电压的比例,测出来直接乘 Rref 就是 RTD 电阻。所以 v_ref 那一步可以完全省掉,这也是比例测量的精妙之处。

如果读回来的码值一直是负数,多半是通道极性接反了。ADS122U04 使用二进制补码输出,把 AIN0 和 AIN1 交换一下就能看到正值。这个问题在调试初期非常常见,代码里加一句极性判断能省不少事。

3.4 温度换算:从电阻到摄氏度

拿到 RTD 电阻后,有两种方式换算温度:公式法和查表法。

公式法基于 IEC 60751 的 Callendar-Van Dusen 方程。0°C 以上时:

Rt = R0 × (1 + A·t + B·t²)

其中 R0=100Ω,A=3.9083e-3,B=-5.775e-7。反解这个一元二次方程就能得到温度,代码很简洁:

float pt100_ohm_to_temp(float R) { const float A = 3.9083e-3f; const float B = -5.775e-7f; float c = 1.0f - (R / 100.0f); float disc = A * A - 4.0f * B * c; if (disc < 0.0f) disc = 0.0f; return (-A + sqrtf(disc)) / (2.0f * B); }

注意,这个反解公式只适用于 0°C 以上。0°C 以下还要再补一个带 C 系数的三次项,C=-4.183e-12。如果只做 HVAC 的舒适性温度,可以不管低温段,但工业场合经常要测 -40°C,必须处理。

查表法是工程上更稳妥的选择。把 -50°C 到 200°C 的阻值做成数组,在 8 位 MCU 上做二分查找加线性插值,速度极快,占用 Flash 也就几百字节。相比直接调用数学库里的 log、exp,查表法的性能和可控性都好很多。NTC 的 Steinhart-Hart 公式虽然能算,但在 8 位机上跑浮点对数太慢,我基本都是用分度表加插值。

3.5 周期采样、状态机与看门狗

主程序不要写成“阻塞式轮询”。HVAC 和工业温度变化很慢,1 秒采样一次都算快的,很多场合 0.2Hz 足够。我建议把 ADC 采集放在一个 10ms 时基里排队,每秒执行一次完整采样。

通信超时必须有兜底逻辑。如果连续 3 次读不到有效帧,就重新初始化 ADS122U04;再失败就置故障码并上报。这样即使现场出现瞬时干扰,系统也能自动恢复,不会因为温度显示卡死而误触发联锁。看门狗也一定要开,工业设备最忌讳死机后无人复位。

4. 工业与 HVAC 落地:干扰、校准和控制耦合

4.1 变频器与继电器噪声的软件滤波

HVAC 现场最狠的干扰源是变频器和继电器。继电器触点抖动几毫秒,变频器产生几十千赫兹共模噪声,专门考验 ADC 和 MCU。软件上我采用“去极值均值滤波”:每轮采 8 帧,排序后去掉最高和最低,剩下 6 帧取平均。实测对脉冲型干扰效果很好,在 8 位 MCU 上开销完全可以忽略。

ADS122U04 的内部数字滤波器也要充分利用。数据速率设置在 20SPS 左右时,对 50Hz 工频干扰的抑制已经很明显。如果工厂电网谐波重,再配合硬件上一阶 RC 低通,截止频率约 10Hz,三管齐下,输出曲线非常平稳。软件滤波的实质是压低剩余噪声,不能替代硬件抗干扰,顺序永远是先做好硬件,再用软件兜底。

4.2 双点校准与产线工艺

误差不光是 ADC 本身带来的,探头、引线、参考电阻、PCB 应力都会贡献。产品出厂时我会用 0°C 和 50°C 两个恒温槽做双点校准,给每个通道记录一组参数:

T_real = gain × T_raw + offset

把 gain 和 offset 写进 MCU 的 EEPROM 或外部存储。这一步能在量产阶段把 HVAC 产品的温控误差从 ±1°C 收窄到 ±0.3°C 左右。经验教训是:恒温槽必须等探头和槽液充分热平衡后再读数,否则校准基准本身就是错的,后面全白做。我见过有人把探头塞进冰水混合物没等温度稳定就开始标定,结果产品全线偏差。

4.3 断线与故障判定

RTD 断线、NTC 开路、短路,这些故障在 HVAC 项目里算“必须正确上报”的事件,否则可能误开压缩机或误报警。

判定方法很简单:断线时 IDAC 会把输入电压抬高,ADC 读数接近满幅;短路时电阻接近 0,读数接近 0。给每个通道设置合理上下限,比如 PT100 对应 -50°C 到 200°C 的阻值范围,超范围就上报故障。但注意不要单次超出就判故障,因为长线状态下接触不良也会造成瞬时跳变。我的做法是连续 20 次采样都超范围才置故障位,短暂跳变只记录事件,不改变故障状态。

4.4 HVAC 温控回差与 MCU 输出

HVAC 温控的核心其实不在测量精度,而在控制稳定性。温度到设定点后如果不加回差,压缩机在边界会频繁启停,电机寿命直线下降。比如制冷模式设定 25°C,回差 1°C,那么回风温度低于 24°C 才停机,高于 26°C 才开机。这个逻辑会让测量系统即使有 ±0.2°C 的小波动,也不至于让继电器抖个不停。

PIC18F85J50 内置的 PWM 外设还能配合温度做风机调速,把温度偏差映射成占空比。到这一步,ADS122U04 的任务就是把温度数据喂准,剩下的控制逻辑全部交给 MCU。整个系统分工清晰,调试时可以各管各的。

5. 实测问题速查与调试心得

5.1 问题速查表

现象可能原因排查思路
ADC 读数恒为满量程RTD 开路、IDAC 未使能、基准未接好万用表量探头电阻,检查 IDAC 寄存器
读数低得离谱传感器短路、输入通道接反量 AIN0/AIN1 之间电压,交换极性
温度随室温漂移参考电阻温漂过大、地线不良换成 25ppm 以下精密电阻,处理接地
UART 通信偶发失败波特率误差、电平驱动不足示波器看波形,重算 SPBRG
读数周期性跳变变频器干扰、屏蔽层未接地软件滤波,检查屏蔽层单端接地
上电几秒内读数异常ADC 稳定时间不足加长上电延时,MCU 启动后先等待
NTC 通道温度乱跳分压电阻温漂比 NTC 还大换低温漂分压电阻,检查布局

5.2 调试工具箱与流程

工程师调试这套系统,建议按顺序来:先把 ADS122U04 和 PIC18F85J50 之间的 UART 用 USB 转 TTL 模块单独验证,确认帧能通;再用可调电阻箱代替 RTD,验证换算函数;最后才接真实探头和现场线缆。这样一旦出问题,能快速定位是通信、算法还是现场干扰。

示波器看 UART 波形时,重点看高电平和停止位。如果上升沿不够陡,多半是线上负载过重或电平不匹配。我还有一个看似冷门但非常实用的建议:调试阶段把 ADC 的原始码值通过串口打出来,不要只打温度。原始码能直接体现硬件层面异常,比如是否接近满程、是否有固定跳变量。当年我直接看转换后的温度,遇到干扰只能干瞪眼,改成打印原始码后,问题一眼就定位了。

5.3 一次 HVAC 现场干扰的复盘

说个真实案例。客户反馈某机房安装后,温度偶尔从 25°C 跳到 -15°C 再跳回,几秒钟一次,看起来特别吓人。示波器一量,问题出在 RS-485 线的屏蔽层上:屏蔽层在控制器端没有接地,整条屏蔽层变成了天线,把变频器的脉冲干扰耦合到通信线上。

把屏蔽层接到控制柜的接地排后,问题彻底消失。这类问题和芯片本身无关,纯粹是现场接线规范问题。但正因为用了带 UART 的采集架构,定位变得非常快:直接抓原始帧确认是物理层干扰,而不是去怀疑温度换算或控制逻辑。这也印证了我一直强调的观点——硬件地基做好,比什么高级算法都管用。

一套方案做下来,我最深的体会是:选芯片组合时不只要盯着一两个“最强参数”,而是从产线、长线传输、升级维护这些角度倒推需求。ADS122U04IPWR 加 PIC18F85J50 这套组合,模拟前端可靠、通信边界清晰、固件逻辑简单,在工业和 HVAC 场景里是值得推荐的搭配。如果让我给刚开始做工业温度采集的工程师一个建议,那就是先把电源、基准、地线这三件事做好,再谈软件滤波,别用算法去补硬件的窟窿。调试时一定保留原始码输出,很多奇怪问题其实卡在物理层,而不是算法层。最后顺带提一句,这套方案后续扩展多通道也不难,在 PIC 上多挂一片 ADS122U04,每个 ADC 管 4 路输入,UART 挂在同一条总线上,整个系统依然能维持简单可靠的架构。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询