☰
UART接口Δ-Σ ADC与PIC18单片机的高精度温度采集方案
2026/11/4 11:03:50 网站建设 项目流程

工业现场的温度测量和暖通空调(HVAC)系统里的温度监测,看起来都是“把传感器送来的信号转成温度数值”,实际上对方案的要求差别很大。工业场合更看重精度、抗干扰和长距离稳定通信,HVAC 则更强调成本可控、施工维护方便。这两类应用有一个共同的卡点:传感器信号要先经过 ADC 转换,再交给 MCU 处理,而 ADC 和 MCU 之间怎么连接、怎么设置寄存器、怎么把微伏和毫欧级别的信号换算成稳定的真实温度,这一串问题直接决定了产品能不能稳定上线。

我这篇博文要讲的,是我实际用过的组合:TI 的 ADS122U04IPWR 这颗 24 位 Δ-Σ 型 ADC,配合 Microchip 的 PIC18F96J65 单片机,实现工业与 HVAC 场景下的高精度温度采集。ADS122U04IPWR 最有意思的地方是它自带 UART 接口,而不是传统的 SPI 或 I2C,这就让 MCU 侧的连接变得非常干净,尤其适合传感器分散、走线较长的应用场景。PIC18F96J65 作为主控,有多个 EUSART 和足够的 IO 资源,用来跑通信协议、显示逻辑和控制逻辑都很顺手。这篇文章适合正在做温度采集板、传感器模块、HVAC 控制器或者想在工业现场项目中换掉老式模拟方案的嵌入式工程师参考。

1. 整体方案拆解:两颗芯片怎么分工

1.1 项目要解决的真实问题

我最初接到这个项目时,需求听起来并不夸张:环境温度 -20℃ 到 +80℃ 的一套 HVAC 控制器,加热段、冷却段、混合段里面一共要测 4 个点的温度;另一条线是工业锅炉房,要用 K 型热电偶测排烟温度,最高到 600℃ 左右,现场还有变频器干扰。

难点不在“测温度”本身,而在于三类问题。

第一是信号弱。PT100 在 0℃ 时只有 100Ω,温度每升高 1℃,电阻只增加约 0.385Ω。如果用 1mA 激励电流,1℃ 变化对应的电压也就是 0.385mV,这是个很小很弱的信号。第二是走线远。HVAC 现场的设备间和控制柜之间经常隔了十几米甚至几十米,传感器线缆一旦和动力线平行布置,共模干扰和辐射耦合都会进来。第三是系统里不止一个传感器,风扇、压缩机、电动阀这些执行机构一动作,电源和地上就会抖一下,模拟信号链最怕这种瞬态干扰。

ADS122U04IPWR 正好能消解这三方面的压力:24 位分辨率对微伏级信号绰绰有余,内置 PGA 可以把小信号放大到合适幅度,内置低温漂基准又省掉了一颗基准芯片。PIC18F96J65 则负责整体调度、与人机界面交互、输出给上位机,并且管理 ADC 的配置和结果读取。

1.2 ADS122U04IPWR 适合做温度采集的原因

ADS122U04IPWR 是一颗 24 位 Δ-Σ ADC,4 通道输入,内部有可编程增益放大器(PGA)、两个激励电流源 IDAC1/IDAC2、偏置电压输出和一个低温漂基准源。这些资源组合起来,基本上把温度测量前端需要的全部外围都收进去了。

它和常见 ADC 最大的区别是 UART 接口。SPI 接口的 ADC 需要 MCU 侧的片选、时钟、数据输入、数据输出四根线,而且时序控制非常严格。UART 只需要 TX 和 RX 两根线,通信距离也远得多。对 HVAC 这种控制柜和传感器模块分离的布线方式,UART 接口能把线束降到最少,连接和隔离都更方便。协议上它还支持多地址访问,理论上一条 UART 总线上可以挂多个 ADS122U04IPWR,只需要用 A0/A1 引脚给出不同地址就行。

另一个值得说的点是它的数字滤波能力。Δ-Σ 架构配合内部数字滤波器,在低数据速率下能对工频干扰起到很强的抑制作用。实际项目中我用 20 SPS 的数据速率,配合合适的 RC 滤波,现场变频器一开,读数依然很稳,这一点后面我会专门讲。

1.3 PIC18F96J65 的职责与外围资源

PIC18F96J65 属于 Microchip 的增强型中端 8 位 MCU,带 USB 外设,更重要的是它内置了多个 EUSART。增强型 UART 的好处是支持自动唤醒、帧错误检测和 9 位地址检测,这些特性配合 ADS122U04IPWR 的串口协议,可以写出一套干净利落的驱动。

系统里它的分工是这样的:启动时配置自身的 UART 波特率和引脚方向,按照既定时序给 ADS122U04 写配置寄存器;进入正常运行后,每隔固定周期发送读数据命令,拿到 3 字节转换结果;再把原始码值换算成电压/电阻,最终换算成温度。如果采样结果超出合理范围或者长时间通信失败,MCU 还要负责报警和降级处理。

手里这块 PIC18F96J65 的闪存空间足够放下通信协议栈、多个传感器通道的处理逻辑和温度线性化查找表,运行时 RAM 也够用。实际代码跑下来,Flash 占用不到一半,后期扩展曲线还是比较充裕的。

2. 关键设计选择背后的逻辑

2.1 为什么用 UART 接口的 ADC,而不是 SPI 或 I2C

做温度采集板选 ADC 时,大家第一反应都会找 SPI 接口,这也是大多数高精度 ADC 的标配。但在这个项目里,SPI 反而成了麻烦。

首先是隔离难。工业现场如果要做到传感器端和控制端完全隔离,光耦是少不了的。SPI 的 SCLK 速率通常跑得比较高,几 Mbps 甚至更高,光耦的延时和上升沿变形很容易把时序搞坏。UART 只要 9600 或 115200 波特率,低速下光耦的延迟根本不是问题,隔离电路可以做得非常简单可靠。

其次是布线压力。4 通道 HVAC 控制器如果每个传感器都单独走模拟线回来还好,但控制柜内空间紧张,多几根线就要多几路端子。ADS122U04IPWR 允许把 ADC 就近放在传感器附近,转成 UART 信号后两根线回传,这在现场施工时省了大量功夫。

最后是调试成本。用逻辑分析仪检查 SPI 时序要对齐 CLK 边沿,问题定位比较费劲;UART 只要波特率一致,大部分时候一次就能通。对于工程师来说,调试省下的时间才是最值钱的。

2.2 RTD 测量里的激励电流和引线补偿

RTD 是无源传感器,必须靠恒定电流激励产生电压。ADS122U04IPWR 内置的 IDAC 电流源可以设置不同档位,我最终选了 500μA。

为什么不用 1mA 或 2mA?PT100 在 600℃ 时电阻约为 313Ω,500μA 电流下电压只有 156mV,配合 PGA 8 倍增益后约 1.25V,还有充足余量。激励电流越小,RTD 自热效应越小,测量误差越低。对于薄膜 PT100,1mA 都可能带来可见的自热误差,500μA 是我测试下来准确性和抗噪能力都比较折中的选择。

引线补偿方面,三线制是工程上的常用折中。ADS122U04IPWR 依靠 IDAC1 和 IDAC2 两个恒流源分别从传感器两端注入电流,配合差分测量可以抵消引线电阻误差。原理不复杂:两根引线电阻分别落在两个电流源的回路上,只要两个电流源匹配,引线压降在差分输入端相互抵消。四线制精度最高,但 HVAC 现场很多传感器是两线制的,如果传感器到 ADC 的线比较短,且对精度要求没那么苛刻,两线制也能接受,只是要在系统校准环节把引线电阻一次性修正掉。

2.3 波特率、数据速率与吞吐量的平衡

ADS122U04IPWR 转换完成后,MCU 通过串口读数据。这里有两层速率:一层是 ADC 的转换速率,一层是 UART 的通信波特率。转换速率我在项目里固定为 20 SPS,这个设置下数字滤波器的陷波点刚好对准 50Hz,对工频干扰的抑制效果最好。对 HVAC 温度控制来说,20 秒出 20 个点,已经足够控制回路的 1 秒周期使用。

UART 波特率则定为 9600。一组读数据命令加 3 个数据字节大概 5 个字节,按 10 位一帧算,一帧约 1.04ms,5 个字节也就 5ms 左右,远小于 50ms 的转换周期。即便 MCU 需要轮询 4 个 ADC 通道,UART 带宽也完全够用。波特率低一点还有一个好处:信号虽然慢但更抗干扰,反向电路设计时更宽容。如果以后要挂更多 ADC 或提高通道数,把波特率抬到 115200 也不难。

3. 硬件连接与模拟前端设计

3.1 电源与地平面规划

ADS122U04IPWR 的模拟供电 AVDD 和数字供电 DVDD 我建议分开处理。AVDD 用 LDO 单独供给,DVDD 可以和 MCU 供电共用。如果板子上只有一路供电,至少要用磁珠或者小电感把 AVDD 和 DVDD 之间的纹波耦合降到最低,再用 10μF 和 0.1μF 电容去耦。

接地是最容易被忽略的一环。ADC 的高精度性能全靠一个干净的模拟地参考。我的做法是板子上划出一块完整的模拟地平面,ADS122U04IPWR 的 GND 引脚、传感器负端、基准电容的地都就近接到这个平面上,再接单点连接到主地。现场调试时我发现,只要地线连接不合理,读数的低位字就会在几位之间来回跳,这不是 ADC 的问题,是地弹干扰。

3.2 MCU 与 ADC 的通信链路搭建

PIC18F96J65 的 EUSART1 用作和 ADS122U04IPWR 通信。引脚上,PIC18F96J65 的 TX 脚接 ADC 的 RXD,PIC 的 RX 脚接 ADC 的 TXD,这是基础接法。注意 ADC 端的 TXD 一定接到 MCU 的 RX,别接反。

A0 和 A1 两个地址引脚我在项目里接固定电平。一颗 ADC 时可以直接接地,如果同一总线上要挂多颗,则用 0Ω 电阻选择地址。WU 引脚用于唤醒低功耗状态,我在非低功耗设计里直接将其拉高,避免误判。

需要提醒的是,ADS122U04IPWR 本身有电气空闲和唤醒时序要求,MCU 上电后不能立刻发命令,要先让 TX 线稳定一段时间,我一般在固件里做大几十毫秒延时。

3.3 传感器信号调理电路

PT100 通道的模拟前端不需要额外放大器了,ADS122U04IPWR 内置 PGA 就是干这个的。关键是输入端的两级保护。传感器线缆从现场引入,可能碰到静电、错接或者感应雷电流。我按标准设计加了 100Ω 串联电阻、TVS 管和共模滤波电容。100Ω 电阻配合 0.1μF 电容形成低通,截止频率约 16kHz,把射频干扰大部分滤掉。TVS 管则保护 ADC 输入引脚不被击穿。

热电偶通道要注意的是冷端补偿。K 型热电偶产生的热电动势是测量端和冷端的温差函数,冷端温度必须已知。我在 ADC 附近,也就是 PCB 上冷端位置,放了一颗 PT1000 或者 MCP9700 之类的测温元件,每 100ms 读一次冷端温度,然后在固件里做补偿。

滤波电容也不能贪大。RTD 采样期间外部电容会暂态吸收 IDAC 电流,电容太大反而让建立时间变长。我的经验值是输入端每线加 1nF 到 10nF,不要超过 10nF,和 100Ω 配合得到的带宽已经足够抑制干扰。

4. 固件实现:从寄存器配置到真实温度值

4.1 ADS122U04 的寄存器配置流程

固件第一件事是初始化 UART,再把 ADC 的工作模式配置好。我用的 XC8 编译器,伪代码如下:

// PIC18F96J65 侧:EUSART1 初始化 void UART1_Init(void) { TRISCbits.TRISC6 = 0; // TX 引脚输出 TRISCbits.TRISC7 = 1; // RX 引脚输入 BAUDCON1bits.BRG16 = 1; SPBRGH1 = 0; SPBRG1 = 25; // 8MHz 时钟、9600 波特率 TXSTA1bits.TXEN = 1; RCSTA1bits.SPEN = 1; RCSTA1bits.CREN = 1; }

ADS122U04IPWR 的寄存器通过 UART 写入。给 ADC 的第一个字节前,MCU 需要发送一个超过 11 位周期的低电平唤醒信号,实际代码里我用延时实现:

void ADS122U04_Wakeup(void) { LATBbits.LATB1 = 0; // 假设 TX 由 GPIO 模拟唤醒控制 __delay_us(1500); // 9600 波特率下,11 个位周期约 1.15ms LATBbits.LATB1 = 1; }

寄存器配置的顺序也有讲究。先把 PGA 增益和输入通道 MUX 设好,再设 VREF 和 IDAC 电流,最后启动转换。PT100 通道我用 AIN0/AIN1 差分输入,PGA 增益 8,内部基准 2.048V,IDAC1 接到 AIN0 输出 500μA 电流。这个配置下写入 REG0、REG2、REG3 三个寄存器即可,REG1 保持默认数据速率 20 SPS 和连续转换模式。

写寄存器时按命令格式把命令字节、寄存器地址、数据字节依次发送。写完后发一次“读取数据”命令,应能收到 3 个字节。如果读到 0xFFFFFF 或者长时间无响应,就要回头检查 GPIO 配置。

4.2 PIC18F96J65 的 UART 驱动与命令时序

有了基础初始化,接下来就是干净的读取循环。这里有个容易被新手的坑:不能发完读数据命令立刻去读 UART 接收寄存器,因为 ADC 需要一定时间去转换并串行输出。一定要等接收寄存器可用。我用的是中断方式:

volatile uint8_t rxBuf[3]; volatile uint8_t rxIndex = 0; void __interrupt() isr(void) { if (PIR1bits.RC1IF) { rxBuf[rxIndex++] = RCREG1; if (rxIndex >= 3) rxIndex = 0; PIR1bits.RC1IF = 0; } }

读取的主循环节奏是:每隔 1 秒,由 MCU 发送一条读数据命令,等待 3 个字节到齐。3 字节拼成一个 24 位有符号数,然后进入数据换算。

这里建议把“读取数据命令”封装成一个函数,并且给每个 ADC 通道分配独立状态机。HVAC 上虽然只挂一颗 ADC,但 4 个输入通道要轮流切换 MUX,切换后需要等待稳定时间再读数据。这个稳定时间和数据速率相关,20 SPS 下约 50ms,我开始没留够,前几十个采样值全部无效,后来改成通道切换后丢前两次数据再使用,才恢复正常。

4.3 温度数据换算与非线性校正

原始码值换算成电压的公式是:

电压 = (原始码值 / 0x7FFFFF) × (满量程电压 / PGA 增益)

ADS122U04IPWR 是 24 位有符号输出,理论上满量程等于 ±VREF/PGA。比如 VREF=2.048V、PGA=8,满量程电压是 ±0.256V,即 ±256mV。码值 0x7FFFFF 对应接近 256mV,0x000000 对应 0V,0x800000 对应接近 -256mV。注意这些是理想情况,实际用内部基准时会有初始误差,必须用校准修正。

PT100 的电阻-温度关系不是严格线性的。要求不高时可以用 3850ppm/℃ 的近似公式:R(T) = R0(1 + αT),α=0.00385。但工业现场精度要求到 ±0.1℃ 时,线性近似就不够用了。我用了简化版的 Callendar-Van Dusen 公式:

R(T) = R0 * (1 + A*T + B*T^2)

因为只用到 0℃ 以上,不需要 C 系数。公式里的 A、B 系数查 IEC 60751 标准即可,R0=100Ω。固件里我先把电压值除掉激励电流得到电阻,再解二次方程得到温度。

热电偶侧则完全不同。K 型热电偶输出的是毫伏级电压,需要用 NIST 多项式把电压转成温度,同时加上冷端补偿。冷端温度(我读的 PT1000)乘以塞贝克系数近似增量,再和主电压叠加。精度要求高的时候要做迭代法,我的做法是先用冷端温度估算一个补偿电压,查表和插值得到最终温度。

4.4 系统运行调度与异常处理

拿到温度值之后,MCU 的角色并不是简单的“转换器”。在实际 HVAC 系统中,温度数值还要经历滤波、越限判断、故障上报等处理。

滤波我用最简单的滑动平均,取最近 4 次采样的平均值,效果足够好,计算量也小。如果现场信号特别恶劣,可以改成中值滤波,优先去毛刺。

异常处理要分成几级。通信超时是一种异常,ADC 返回全 0 或全 1 是另一种。我最开始只做了“超时报错”,后来发现某个通道接线虚焊时,ADC 返回的还是有效码值,但温度明显偏离正常范围。于是我在 MCU 里加了合理范围判断:HVAC 通道范围设为 -40℃~150℃,工业热电偶通道是 -50℃~700℃,凡是超范围的按通道故障处理,并把故障位上报给上位机。

5. 调试实录与常见问题排查

5.1 通信建立不起来的排查路径

我在调试板上第一次跑通时也卡了很久。MCU 发命令,ADC 毫无反应。排查顺序我建议这样来:先量 UART 输出引脚波形,确认 TX 有信号且波特率正确;再检查 RX/TX 是否接反,ADC 的 TXD 是不是接到了 MCU 的 RX;然后用逻辑分析仪抓 ADC 返回数据,确认有没有字节回来;最后才怀疑寄存器配置。

最容易踩的坑是唤醒时序。ADS122U04IPWR 的 UART 协议要求在通信前发送长低电平唤醒信号,如果 MCU 的 TX 在空闲时不是高电平,而是被初始化代码拉低,ADC 就会一直处于检测唤醒状态,后面的命令全部不认。我后来在初始化代码里特意把 TX 引脚先设为高,然后再进入唤醒流程,问题就消失了。

5.2 读数漂移与跳变问题

读数跳变的原因,八成不在 ADC,而在前端电路和布局。我遇到过一次 PT100 通道读数随变频器启动而大幅跳变,排查后发现是传感器线缆和动力线距离太近,且屏蔽层单端接地没做好。把线缆走向改远、屏蔽层在控制柜端单点接地后,数据立刻恢复稳定。

另一种情况是电源纹波导致的跳变。当冰箱压缩机启动瞬间,系统 24V 电源跌落,ADC 的基准源受到干扰。解决方法是给 AVDD 加一级低噪声 LDO,并且加大基准电容。ADS122U04IPWR 内部基准输出脚上我放了 1μF 低 ESR 陶瓷电容,这是手册要求的,不要随意改成几皮法的小电容。

5.3 校准流程和常见误区

很多工程师把校准等同于“给个偏置修一下”,其实温度采集的校准要分清两种误差:零点误差和增益误差。零点误差用短路输入测,把输入对短接得到零点码值,固件里减去即可;增益误差用标准电阻或标准温度源测,修一个系数。

我的校准流程是这样:PT100 通道,先用高精度电阻箱替换传感器,分别输出 0℃ 对应的 100Ω 和 100℃ 对应的 138.5Ω,记录码值,算出增益系数;然后把传感器接到恒温槽里做两点验证。如果只有常温条件,用冰水混合物做 0℃ 校准,再加上一个高精度电阻模拟高温点,也能达到小范围高精度的效果。

有一个很容易忽略的误区:不要在系统刚上电时就校准,温度稳定性和 ADC 内部基准的温漂还没有安定下来。我会让系统预热 30 分钟后校准,校完再连续运行 8 小时看漂移。

6. 实际工程中的几点体会

这套方案我从原理图设计到现场调试,反复打磨过好几轮,有些经验值得分享出来。

一个是对 ADS122U04IPWR 的认识要摆正:它确实是“一颗芯片包办前端”,但并不是说外围随便画画就能用的。模拟部分的电源、地、滤波电容该下功夫一点都不能省,UART 优势只是让信号回到控制端更容易,不代表前端就能偷懒。

另一个是关于通道管理的经验。4 通道依次切换测量时,不要追求切换速度。ADC 每次切换 MUX 后需要等待抗混叠滤波器稳下来,我建议物理上把每个通道的转换周期错开,宁可慢一点,也要保证每个通道拿到的是真实值。

最后想说的是,HVAC 和工业应用的区别,最终会体现在系统设计的宽容度上。HVAC 追求成本低、维护方便,所以 3 线制 PT1000 加上可靠的 UART 方案就够用;而工业上热电偶、冷端补偿、隔离保护一个都不能少。这个项目让我体会最深的一点是:做温度采集,芯片选型只是一半,另一半是你能把现场干扰、线缆压降、校准误差这些“脏活”消化到什么程度。

如果以后有人问我低成本高精度的多通道温度采集怎么做,我大概率还是推荐这套“UART 型 Δ-Σ ADC + PIC18”的组合,因为它在调试难度和现场可靠性之间找到了一个相当平衡的位置。

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

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

立即咨询