24位Δ-Σ ADC与PIC MCU的高精度温度采集方案解析

发布时间:2026/11/5 6:28:02

24位Δ-Σ ADC与PIC MCU的高精度温度采集方案解析 做温度采集这件事很多工程师第一反应是“MCU 内置 ADC 够用了”但真到了工业现场和 HVAC 设备里噪声、长线、自热、温漂这些问题会让你明白什么叫“差之毫厘、谬以千里”。我最近在做的这个项目主控选了 PIC18LF46K22前端模拟采集则用了 TI 的 ADS122U04IPWR一颗 24 位、四通道、带 UART 接口的 Δ-Σ ADC。整套方案跑下来温度测量稳定性比之前用运放加内置 ADC 的方案好了一个数量级代码和硬件调试反而更省心。这篇内容适合正在做温度采集、压力变送器、或者设备监测的人参考尤其是准备在工业现场和 HVAC 场景下用 RTDPT100/PT1000、NTC 甚至热电偶做多点测温又不想被模拟前端设计折磨的朋友。整套原理和代码不挑平台核心思路拿到其他 MCU 上一样能用。1. 项目需求分析与方案选型逻辑1.1 为什么不用内置 ADC非要上 24 位 Δ-Σ先说我的原始需求一个暖通设备项目里需要同时测量至少两路温度现场有压缩机启停、变频风机、电磁阀动作这些干扰源让模拟信号质量非常难看。MCU 内置 ADC 大多是 10 位或 12 位参考电压靠 VDD 或者简陋的内部基准满量程也就 0~3.3V加上没有真正意义上的差分采样共模干扰几乎原样进采样值温度波动放大后经常出现几度的跳变。Δ-Σ ADC 的思路完全不同。它靠过采样和数字滤波换取高分辨率24 位输出里有效分辨率轻松做到 18~20 位同时内部整合了可编程增益放大器PGA、输入多路开关、精密基准和电流源。ADS122U04IPWR 的 PGA 支持 1 到 128 倍增益配合片上基准能把 PT100 这种毫伏级信号整到接近满量程硬件放大电路直接省掉。我最看重的其实是差分输入。工业现场最怕的不是噪声大而是共模电压乱跳差分结构能抵消掉同一方向上的干扰比如接地电位差、50Hz 工频拾取这是单端 ADC 再怎么滤波都很难做到的。1.2 两颗芯片为什么合拍ADS122U04IPWR 属于 TI 的低功耗工业 ADC 家族四通道输入可以配置成两个差分对也可以是四路单端还带两个可编程激励电流源 IDAC。接口是 UART这个决策我认为非常实用工业主控板上大多带硬件 UART接线就 2 根线用 SPI 的话要额外占用时钟和片选长线传输时 SPI 的时序要求也比 UART 苛刻。PIC18LF46K22 是 Microchip 的低功耗 8 位 MCU工作电压 1.8V 到 3.6V正好匹配 ADC 的 3.3V 逻辑。它内部资源对这个项目完全够用一个 EUSART 负责和 ADC 通信再分几个 I/O 做显示和继电器控制程序空间 32KB跑校准和滤波算法绰绰有余。更重要的是PIC18 是很多设备工程师的看家平台资料多、开发环境稳定、供应链成熟在这种偏稳定的工业场景里没必要为了花哨追新平台。1.3 传感器选型的现实考量ADS122U04IPWR 本身没有传感器倾向它开放的输入结构让 PT100、PT1000、NTC、热电偶都能接。差距在测量方案和代码标定上PT100/PT1000精度高线性度好靠 IDAC 恒流激励加比例式测量能消掉电流源温漂适合测水温、风管温度、回水温度这类精度要求高的点。NTC灵敏度高成本低但曲线非线性严重适合只需要粗略控制、测温范围窄的场合。热电偶测温范围宽、响应快不过信号是微伏级要用到高 PGA 增益和冷端补偿接线和校准比 RTD 复杂。我这个项目以 PT100 为主关键点全部走三线制次要点用两线制因此下面的分析和代码会围绕 PT100 展开但我会把配置思路讲清楚换 NTC 或热电偶时只需改传感器配置和换算公式。2. 硬件设计要点与关键电路拆解2.1 比例式 RTD 测量到底在测什么很多第一次用恒流源测 RTD 的人会踩同一个坑认为给 PT100 一个固定电流然后测两端电压除以电流就可以了。理论上没错可实际做出来的精度很差因为 IDAC 电流会随温度漂基准电压也在漂两路漂移叠加结果没法看。比例式测量就是为了根治这个问题。ADS122U04IPWR 内部有两个 IDAC我用 IDAC1 给 PT100 供电IDAC2 给精密参考电阻 R_REF 供电ADC 的参考电压就取自 R_REF 两端。这样转换输出的比例是R_RTD Code_RTD / Code_RREF × R_REF这个式子里没有电流项。IDAC 电流哪怕从 1.000mA 漂到 1.010mAPT100 上的电压和 R_REF 上的电压会同步变化比值不变。真正决定误差的只有 R_REF 的温漂和 ADC 自身的线性度选一个 0.1% 精度、温漂低于 25ppm 的金属膜电阻就稳了。三线制接线也顺带解决了导线电阻问题。PT100 两根线分别走 IDAC 激励和测量高边第三根线专门接测量低边。理想情况下两根现场线电阻相等测量端得到的差分电压就不含线阻我实测 10 米线径 0.5mm² 的线线阻大概在 0.7Ω 左右两线制能带来 2℃ 以上的误差三线制基本看不出来。2.2 外围元件参数怎么定激励电流选择上PT100 我建议 1mA这是自热和信噪比的折中点。电流太小信号幅度低PGA 要开高增益噪声跟着上去电流太大 RTD 自身发热比如 1mA 激励下 PT100 的自热功率约 1mW热量堆积会让读数半天稳不下来。NTC 或者高阻值传感器才适合用 100µA 档位。基准电阻值要参考所选 PGA 增益。对应 0~150℃ 常见工业场景PT100 阻值变化大约是 100Ω 到 157Ω1mA 电流下差分电压是 0.1V 到 0.157V。PGA 设为 8、参考电压 2.048V 时满量程是 256mV留足裕量。R_REF 这里取 3.3kΩ 左右IDAC2 流过 1mA 产生 3.3V 会超参考上限所以实际减半用 2.048kΩ 相近规格或用 2mA 档配 1.024kΩ按手册上的量程表调就行。REFP/REFN 引脚之间我放了 1µF 和 100nF 并联低 ESR 电容这两个电容直接影响内部调制器参考稳定性尽量不要省。RTD 差分输入前端各串了一个 10Ω 电阻加 10nF 到地的 RC 滤波截止频率大约 1MHz作用是把来自变频器和高压回路的射频干扰挡在芯片门口。2.3 电源和 PCB 布局的几条老规矩PIC18LF46K22 和 ADS122U04IPWR 都用 3.3V 供电。HVAC 主控板上通常先有 24V AC 转 5V DC再由 LDO 转 3.3V我建议给模拟部分再加一级 LDO并且与数字部分之间的地用单点磁珠连接或者 PCB 上做“模拟地岛”避免数字 GPIO 翻转时把噪声耦合进参考源。ADC 的 AVDD 和 DVDD 引脚虽然能共用 3.3V但去耦电容要分开摆放模拟部分用 10µF 加 0.1µF数字部分有 0.1µF 就够。AVDD 到 DVDD 之间放一个 10Ω 电阻做隔离实测对改善转换稳定性有帮助。所有工业现场的线缆接口都要考虑 ESD 和浪涌。我从接线端子进来后先走 TVS 管钳位到 3.3V再串电阻和二极管限流最后才进 RC 滤波和 ADC 输入。这套保护结构非常必要因为 HVAC 环境里哪怕一根线接错或者插拔时产生静电芯片可能就直接报废了。3. 寄存器配置与通信实现3.1 UART 链路与命令交互ADS122U04IPWR 的 UART 是标准 8 位异步帧接口上靠几个输入引脚设定工作模式具体地址和模式由硬件配置确定这个设计很考验 PCB 前期的规划。我留了一组四联拨码开关把地址位固定成默认相当于板子插上就能识别。PIC18LF46K22 的 EUSART1 与 ADC 对接波特率我设在 9600bps。有人嫌慢可这是在工业现场权衡后的结果测温刷新率本来就低比如 20SPS 的转换率下9600 波特率完全喂得饱低速还能换来更强的抗干扰能力。UART 只是指令和数据通道不是高速 SPI没必要追求高波特率。命令交互上我是这么做的主机发一个命令帧ADC 回一个状态字节加数据字节。所有读寄存器、写寄存器、启动转换、读转换结果的命令结构都类似先写命令字节再按约定等对应长度的数据。实测最稳妥的流程是主机发完命令后不立刻读先等 100µs 到 500µs 让 UART FSM 稳定读取前再检查接收标志避免丢字节。3.2 关键配置位域拆解ADS122U04IPWR 的寄存器不多核心就是配置寄存器 0 到 4。只看关键的几个位区域输入多路选择MUX决定哪个引脚接入 PGA。单端还是差分、正负通道怎么接。比如 PT100 三线制接法AIN0 接激励线AIN1 接测量低边AIN2 可能作为备用通道。PGA 增益从 1 到 128 共 8 档。PT100 我用 8 倍信号 0.1V~0.157V参考 2.048V 时输出码值比例正好在量程中的合适区间既没有削顶风险又有足够分辨率。数据速率20SPS 到 2kSPS 可选。数据率越高功耗越高、噪声越大HVAC 测温属于慢变信号20SPS 最合适还能附带 50/60Hz 工频滤波效果。IDAC 电流档位和输出引脚这是我最常确认的部分IDAC1 和 IDAC2 必须分别配置电流大小和输出通道而且在连续转换模式下它们会被自动接管随时检查是否配置到位。参考电压来源选择外部参考还是内部基准我用外部参考模式因为比例式测量必须让 ADC 参考跟随 IDAC 电流。这些小细节往往是被忽略导致系统读数异常的根源。比如 MUX 配置成差分但接线却把公共端悬空PGA 饱和后读数固定在某一个满偏值看哪都像正常实际已经失真。3.3 PIC18LF46K22 上的驱动代码骨架代码用 MPLAB XC8 编译器写的。核心思路是先用宏定义 UART 读写接口再封装 ADC 寄存器操作和读取。不把逻辑调通就把传感器接上是很多工程翻车的起点我的习惯是先做寄存器回读确认通信无误再上真实传感器。#include xc.h #define ADC_UART_TX(c) putch(c) #define ADC_UART_RX() getch() // 根据数据手册核对具体命令码这里给出常用宏 #define ADC_CMD_RDATA 0x20 // 读转换结果 #define ADC_CMD_RREG 0x24 // 读寄存器 #define ADC_CMD_WREG 0x44 // 写配置寄存器示例 #define ADC_CMD_START 0x14 // 启动连续转换示例 unsigned char ads_read_reg(unsigned char addr) { unsigned char val; ADC_UART_TX(ADC_CMD_RREG | (addr 0x0F)); for (int i 0; i 500000; i) { /* 小延时 */ } val ADC_UART_RX(); return val; } void ads_write_reg(unsigned char addr, unsigned char value) { ADC_UART_TX(ADC_CMD_WREG | (addr 0x0F)); ADC_UART_TX(value); } long ads_read_data(void) { unsigned char b[4]; long result 0; ADC_UART_TX(ADC_CMD_RDATA); for (int i 0; i 4; i) { b[i] ADC_UART_RX(); // 顺序取决于手册定义的输出格式 } result ((long)b[1] 16) | ((long)b[2] 8) | b[3]; // b[0] 通常是状态或高位符号信息按需要处理 if (result 0x800000UL) { result | ~0xFFFFFFUL; // 24 位有符号扩展 } return result; }这段代码的重点是顺序和延时。实际项目里我编译时会把接收部分加一个超时计数避免 MCU 卡死在等待 UART 数据上否则一旦 ADC 配置出错整个主循环都会停摆。写寄存器有个细节ADS122U04IPWR 的很多关键寄存器在上电后处于换算过的保护状态写之前最好先读一遍然后按位改不要整字节覆盖否则容易把保留位写坏导致配置静默失效。4. 数据处理、标定与误差补偿4.1 从码值到阻值ADC 输出是 24 位有符号数表示差分输入与参考电压的比例乘以满量程范围。转换公式是V_IN (Code / 0x7FFFFF) × V_REF / PGA_Gain不过比例式测量时更推荐直接做双通道比例计算。假设同一时刻读到了 RTD 通道的码值 Code_RTD 和参考通道的码值 Code_RREF参考通道接到一个已知电阻上近似认为两次读的电流一致RTD 阻值就出来了R_RTD Code_RTD / Code_RREF × R_REF如果硬件上参考通道直接接的是 R_REF 两端那么读取的 Code_RREF 天然代表参考电压连第二路码值都不需要直接代入参考电压已知值计算。4.2 温度和阻值的换算RTD 温度和阻值的关系用 Callendar-Van Dusen 方程描述比较标准。0℃ 以上简化为R(t) R0 × (1 A × t B × t²)其中 R0 100ΩPT100A 3.9083e-3B -5.775e-7。最直接的办法是用查表加线性插值几百行的标定表塞进 Flash 没压力。我更喜欢直接解一元二次方程的正根计算量小精度也够。float rtd_resistance_to_temp(float r) { const float R0 100.0f; const float A 3.9083e-3f; const float B -5.775e-7f; if (r R0) { return 0.0f; // 简化处理0℃以下要换另一套公式 } // R R0*(1 A*t B*t^2) B*t^2 A*t 1 - R/R0 0 float c 1.0f - r / R0; float disc A * A - 4.0f * B * c; return (-A sqrtf(disc)) / (2.0f * B); }对于负温段比如冷库或者北方室外机必须用完整 CVD 方程做迭代或分段查表公式里多了 C 项和分段条件直接抄上面代码会偏。4.3 误差修正和两点标定即使硬件用了好电阻实际板子仍有失调和增益误差。我做了两段校准常温冰水混合物做 0℃ 校准点再选 100℃ 标准电阻箱模拟做满度点。每个点记录对应转换码值然后线性矫正测到的阻值校准系数存 EEPROM。实际偏差情况大致是这样的校准点理论阻值校准前读数校准后读数误差0℃100.00Ω100.13Ω100.00Ω±0.05Ω50℃119.40Ω119.61Ω119.42Ω0.02Ω100℃138.51Ω138.83Ω138.52Ω0.01Ω0.05Ω 对应 PT100 大约 0.13℃这个精度在 HVAC 控制逻辑里完全够用。想再往上走就得考虑冷端补偿、长线压降、参考电阻温度系数的精细模型属于额外成本一般不划算。5. 工程实战中的常见问题与排查5.1 读数跳变先从电源和基准下手现场反馈最多的问题是读数无缘无故跳 0.5℃ 左右。我接手后第一件事不是换 ADC而是用示波器量 AVDD 和 REFP 引脚果然看到 15kHz 左右的纹波来自电源模块的开关噪声。解决方式是缩小 RC 截止频率、给 LDO 输出加 100µF 电解电容再单独给基准电容加 100nF 高频旁路跳变立刻消失。另一个隐蔽来源是数字地噪声通过 I/O 窜入模拟地。把 ADC 的 DVDD 和 PIC 的 DVDD 之间的 10Ω 隔离电阻换成磁珠I/O 线整体缩短并提高走线间距读数稳定性明显改善。很多“ADC 质量不行”的结论最后都归因到地平面处理太粗。5.2 长线传输和接线问题三线制 PT100 施工时工人在端子排上把线序接错的情况太常见了接反后测量值直接负向饱和。排查方式是断电后用万用表蜂鸣档顺着线序确认电阻值PT100 三线正常量到三组阻值近似相等的测量线。上电后再用电压表量 AIN0-AIN1 的差分电压应该在 0.1V 附近过低说明线断或电流没供上。RV 现场长线带来的共模干扰我在屏蔽线外层单端接地尽量靠近控制板一侧接地双端接地会形成地环路反而不利。屏蔽层最好绝缘处理避免与机柜多点搭接形成环路。5.3 低成本标定与验证方法没有恒温槽也有一套完整标定方法。买几个精密电阻箱或者国产 0.01% 精密电阻模拟 PT100 在固定温度点的阻值。把对应阻值接进输入端子读码值做多点校准精度足够满足绝大多数 HVAC 项目需求。温度探头本身的验证用两个最靠谱也最便宜的基准冰水混合物是非常好的 0℃ 恒温源注意要用纯水和碎冰充分搅拌、等待热平衡沸水受海拔影响大100℃ 精度不如冰点好。如果现场条件允许可以标注海拔后修正沸点。这套流程走完基本能发现探头焊接有没有虚焊、封装有没有破损、导线有没有断芯。最后再分享一个经验ADS122U04IPWR 这类 UART 型 ADC调试时先用一个测试程序连续读回寄存器配合串口助手在电脑上打出来确认通信协议完全正常再接传感器做闭环。这样把“硬件问题”和“通信问题”两个变量分开处理排查起来效率会高很多。这个项目做完后我的体会是模拟前端设计没有捷径每一分稳定性都是从电源、基准、接插件、地平面这些看似不起眼的地方一点点抠出来的。
延伸阅读

更多相关文章

2026/11/5 6:28:02

S7-1200外部中断实战:OB40创建与DETACH指令详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 6:28:02

工业温度采集实战:ADS122U04 24位ADC与PIC32的UART信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 6:28:02

ADS122U04与PIC18F86K90组合:工业温度测量链路的选型与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 7:33:10

Univer开源在线表格实战:从Canvas渲染到私有化部署的完整指南

第一次注意到 Univer,是在一个很现实的场景里:我们要给内部 ERP 系统加一个数据预览模块,老板要求“像 Excel 一样、但必须在浏览器里用”,最好还能直接嵌进现有页面。一开始我们想过直接用表格组件硬渲染,但拖到十万行…

2026/11/5 7:33:10

Univer 表格集成实战:从选型、性能优化到上线踩坑

不知从什么时候起,"给内部后台系统做一套像 Excel 的在线表格"这种需求,成了前端团队绕不开的坎。我之前接过一个数据填报项目,甲方要求不低:要能直接粘贴 Excel 内容、要支持公式联动、要在大几万行数据里滚动不卡&…

2026/11/5 7:33:10

DOSBOX-Windows98使用说明:模拟器配置、安装与故障排查

1. 先把“DOSBOX-Windows98”拆开看,它到底是什么拿到“DOSBOX-Windows98 使用说明”这个题目的时候,我第一反应不是去写下载链接,而是想先把话说清楚:这五个字里藏着两个互相打架的东西。DOSBox是个 DOS 环境模拟器,它…

2026/11/5 7:33:10

J-Link V9.40驱动安装验证与版本管理排障指南

嵌入式调试这活儿,最怕的不是代码写错,而是工具链在你看不见的地方掉链子。上周三晚上十一点,我在实验室连着三块板子,插上调试器,设备管理器里蹦出一个黄色感叹号,Keil 里点下载,提示找不到调试…

2026/11/5 7:33:10

前端数据采集利器:navigator.sendBeacon详解

1. 前端埋点终极方案:navigator.sendBeacon 深度解析作为一名长期奋战在前端监控领域的老兵,我深知数据采集的痛点和难点。页面关闭时的数据上报问题困扰了无数开发者,今天我要分享的 navigator.sendBeacon 可能是这个领域最优雅的解决方案。…

2026/11/5 7:28:09

数字加密技术解析:从基础原理到解码实践

1. 项目概述这个看似由数字组成的"5111111555555599999999"标题实际上是一个典型的加密信息案例。在信息安全领域,这种数字串常被用作加密通信或数据存储的载体。作为一名从事数据安全领域多年的从业者,我经常遇到类似需要解码和分析的案例。2…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑