首页 / 资讯中心 / 文章详情

ADS122U04与PIC18F67K40的高精度温度采集设计与实现

ADS122U04与PIC18F67K40的高精度温度采集设计与实现 ★ FEATURED ARTICLE
做了几年工业控制板的硬件和固件温度采集是绕不开的活。最近一个项目要求在 HVAC 控制器里同时测几路温度和一路备用热电偶常温区目标精度 ±0.3°C现场还要过 EMC。一开始想直接用 PIC18F67K40 自带的 12 位 ADC 采集省一颗芯片但算完很快就放弃了——12 位 ADC 配 Pt1000一个 LSB 对应好几度别说 0.3°C连稳定显示温度都费劲。后来选了 TI 的 ADS122U04IPWR 做模拟前端让 PIC18F67K40 专心做主控做了两版样机实测定标下来效果不错中间踩了不少坑。这篇文章把选型思路、模拟链路设计、UART 隔离方案、固件实现和调试经验完整梳理一遍给准备做工业或 HVAC 温度采集的朋友一个可以照着走的参考。1. 为什么温度采集要外挂 24 位 ADC而不是直接用 MCU 内置 ADC1.1 温度传感器的输出信号有多微弱先算一笔账。PIC18F67K40 内置 12 位 ADC参考电压按 3.3V 算一个 LSB 是 3.3V / 4096 ≈ 0.8mV。接 Pt1000用 250µA 激励电流温度每变化 1°CPt1000 阻值变化约 3.85Ω对应电压变化不到 1mV。也就是说内置 ADC 一个码跳变就相当于 0.8°C 左右这还没算 PGA 缺失导致的信噪比损失、输入偏置和增益误差。工业现场要看的温度波动往往就零点几度MCU 内置 ADC 从分辨率上就被淘汰了。如果用 NTC 热敏电阻测 HVAC 的管温情况稍好一点因为 NTC 在常温区灵敏度能到几十 mV/°C但在高温区灵敏度急剧下降而且 B 值离散度大批次一致性问题多。所以 HVAC 项目里只要有高精度测温需求外挂精密 ADC 基本是刚需。ADS122U04IPWR 这类 24 位 delta-sigma ADC 把 PGA、激励电流源、基准源和温度传感器都集成进去了等于把整个模拟前端打包好交给用户。1.2 ADS122U04 与同类器件的差异ADS122U04 这个型号U 代表 UART 接口04 代表 4 通道输入实际上就是经典 ADS1220 的 UART 版本。ADS1220 用 SPIADS122C04 用 I2CADS122U04 用 UART。型号接口模拟输入适合场景ADS1220SPI4 路传统 SPI 主机高速读取ADS122C04I2C4 路引脚紧张的板卡多从机ADS122U04UART4 路需要隔离、布线距离长、抗干扰要求高三颗器件的核心模拟性能是一致的24 位分辨率、可编程增益 1~128、内部 2.048V 基准、两路匹配的激励电流源10µA 到 2mA、内部温度传感器、单极性和双极性配置都支持。ADS122U04 的亮点在于 UART 接口只需要 TX、RX 两根线最多加一根 READY 输出。对工业现场来说隔离器件数量直接减半这是实打实的成本。2. RTD 测量电路设计恒流源、基准电阻和比例测量2.1 两线制、三线制、四线制怎么选RTD 测温最经典的问题是引线电阻。Pt100 的灵敏度只有 0.385Ω/°C一根 100 米长的 0.5mm² 铜线单根电阻大约 3.6Ω两线制回路里就是 7.2Ω换算成温度误差超过 18°C完全不可接受。两线制只适合短线、低成本场景而且最好配 Pt1000。因为 Pt1000 的阻值是 Pt100 的 10 倍同样的引线电阻误差被缩小 10 倍7.2Ω 引线误差换算是 1.9°C 左右勉强能接受。HVAC 里大量使用两线制 Pt1000 就是这个原因。三线制是目前工业现场的主流选择。原理是用两路匹配的激励电流源分别驱动两根引线利用基尔霍夫电流定律把引线压降互相抵消。ADS122U04 内部自带两路完全匹配的 IDAC正好用于三线制。四线制最准激励电流走两根线感测电压走另外两根独立引线ADC 输入阻抗很高感测线上几乎没有电流引线压降不影响测量。代价是多一根电缆成本和施工复杂度上升。一般只有实验室级或关键工艺点才上四线制。2.2 一个能直接用的计算例子Pt100 加 ADS122U04我用的参数是这套IDAC1 IDAC2 500µA基准电阻 RREF 1kΩPGA 增益 4外部基准接在 RREF 两端。测量范围覆盖 -50°C 到 200°C。原理是比例测量ADC 输出的数字码正比于 V_RTD / V_RREF而 V_RTD I × R_RTDV_RREF I × R_RREF同一个激励电流电流项直接约掉所以R_RTD code × RREF / (Gain × 2^23)这样 IDAC 的温漂和误差就被完全抵消了这是这套方案最大的优势。选取参数时要注意几个约束RREF 要大于 RTD 最大阻值否则参考电压小于信号电压测量会溢出。Pt100 在 200°C 时约 175.8Ω所以选 RREF 1kΩ 非常宽裕。VREF 500µA × 1kΩ 0.5V高于 PGA 允许的最低外部参考电压。激励电流压降 I × (RREF R_RTD_max) 500µA × 1175.8Ω ≈ 0.59V在 AVDD 3.3V 时距离 IDAC 的输出合规电压余量还有接近 2V安全。PGA 增益取 4200°C 时最大信号电压 88mV放大后 352mV占参考电压 0.5V 的 70%既不会削顶又充分利用了量程。如果测温范围收窄到 HVAC 的 0~150°C可以用 Pt1000 加 250µA 激励RREF 取 5.6kΩ增益 2。这样自热更小长线误差也更小是 HVAC 温控器更合适的配置。2.3 输入保护和 RC 滤波的实际参数工业现场传感器线缆可能走强电桥架也可能在变频器旁边雷电感应和接触器跳变带来的浪涌都可能在输入端出现。我在每路模拟输入串联 1kΩ 电阻再接 TVS 管到 AVSS同时加 0.1µF 差分电容和两个 1nF 共模电容到地。截止频率大约 1.6kHz既能滤高频干扰又不拖慢响应。TVS 的结电容尽量选小的否则会破坏 RC 滤波特性。最关键的一点是RC 滤波器的地必须接模拟地 AGND不能接到数字地或功率地。我在第一版 PCB 上吃过亏滤波电容接到公共地平面结果开关电源的纹波全部灌进 ADC读数噪声翻了好几倍。3. PIC18F67K40 和 ADS122U04 的 UART 通信与隔离方案3.1 为什么用 UART 而不是 SPI如果说模拟链路决定精度上限接口方案决定现场可靠性。SPI 需要 SCLK、MISO、MOSI、CS 四根线过隔离就要四个通道而且经过光耦或数字隔离器后高速时钟沿变缓时序容易出问题。UART 天生异步两根线就能通信隔离成本直接砍半线缆上也少两根。ADS122U04 默认 115200 波特率8 数据位无校验 1 停止位配置命令和数据帧都带 8 位 CRC。对于 20 SPS 到 175 SPS 的数据率这个波特率完全够用一帧转换结果 3 字节加 1 字节 CRC115200 波特率下传输时间不到 1ms远小于转换周期。3.2 光耦隔离的接法我的实际接法MCU 侧 UART_TX 经光耦到 ADS122U04 的 RXADS122U04 的 TX 经另一个光耦回到 MCU 的 UART_RX。光耦副边电源和原边电源完全分开MCU 侧 3.3V传感器侧用隔离 DC-DC 单独供电。光耦要选速度足够的型号比如 6N137 或高速晶体光耦不能用慢速 4N25115200 波特率下上升沿会糊掉。READY 引脚我通过第三个光耦引回 MCU 的 INT 引脚用于数据就绪中断。如果你不想多一路光耦也可以降低波特率并用软件查询但实测下来还是硬件中断最省心后面会专门讲这个坑。3.3 READY 引脚与中断驱动的读取时序ADS122U04 的 READY 引脚在每次转换完成时输出一个低脉冲。正确用法是把它接到 MCU 的外部中断引脚在下降沿触发时读取数据。这样 MCU 不用一直轮询也不会在转换中途读到新旧交替的数据。配置成 RDATAC 连续读取模式后每次转换完成ADC 会自动把结果放到发送寄存器READY 低脉冲后又拉高。MCU 在中断里直接收 4 个字节3 字节数据加 1 字节 CRC按帧校验时间上完全来得及。4. 固件实现寄存器初始化、数据读取和温度换算4.1 初始化寄存器配置ADS122U04 有 4 个配置寄存器用 WREG 命令写入。我的典型初始化序列如下// 假定 UART 已配置为 115200, 8, N, 1 // WREG 命令格式命令字节(0x40|寄存器地址) 数据 CRC // 寄存器0 (MUX)AINPAIN0, AINNAIN1, PGA增益4 uint8_t reg0 0x21; // 具体位拼装以数据手册为准 // 寄存器1 (MODE)90 SPS连续转换 uint8_t reg1 0x0E; // 寄存器2 (CONFIG)外部基准REFP/REFN二补码输出 uint8_t reg2 0x02; // 寄存器3 (EXC)IDAC1IDAC2500uA, // IDAC1接AIN2, IDAC2接AIN3, 低侧开关打开 uint8_t reg3 0x78; ads122u04_wreg(0x00, reg0); ads122u04_wreg(0x01, reg1); ads122u04_wreg(0x02, reg2); ads122u04_wreg(0x03, reg3); // 发送 START 命令启动转换 ads122u04_send_cmd(0x08);这里要提醒一下MUX 和 EXC 寄存器的位定义比较绕AIN 选择位和 IDAC 路由位都在这几个字节里拼。我建议直接参考数据手册的寄存器地图把每个通道的 AINP/AINN、增益、IDAC 电流大小和路由方向先画成一张表再填入寄存器值不要靠记忆写。4.2 数据帧、CRC 和连续读取ADS122U04 的 UART 协议里每个命令帧最后一个字节是 CRC。CRC 计算范围覆盖命令字节、地址和数据字节。虽然很多应用图省事把 CRC 校验跳过但我强烈建议保留——工业现场 115200 波特率下偶发误码并不罕见CRC 能兜底。进入连续读取模式后每次转换完成设备自动输出 3 字节 24 位数据加 1 字节 CRC。读取代码大概这样volatile uint32_t g_adc_code; void __interrupt() adc_ready_isr(void) { if (READY_PIN 0) { uint8_t frame[4]; uart_read_bytes(frame, 4); // 3字节数据1字节CRC if (crc8_check(frame, 4)) { int32_t code (frame[0] 16) | (frame[1] 8) | frame[2]; if (code 0x800000) code | 0xFF000000; // 符号扩展 g_adc_code code; } } }我最初是用轮询等待 READY 电平变低再收数据在单任务裸机代码里也能跑。后来加了 Modbus 主机通信轮询周期被抢占偶发读了一半数据就进通信中断从此换成中断方式再没出过问题。4.3 从原始码到温度比例换算与查表插值拿到 24 位原始码后第一步换算电阻float r_rtd (float)code / 8388608.0f / 4.0f * 1000.0f; // code/(Gain*2^23)*RREF第二步把电阻换算成温度。Pt100 的阻值-温度曲线并非线性IEC 60751 标准用 Callendar-Van Dusen 方程描述系数是 A3.9083e-3B-5.775e-7C-4.183e-12。直接用浮点多项式算对 PIC18F67K40 来说也不算吃力但我更推荐查表线性插值提前生成 -50°C 到 250°C 每隔 1°C 的阻值表存成 uint16_t 数组运行时二分查找加线性插值。这样浮点运算量只有一次乘除代码简单插值误差小于 0.01°C完全够用。查表要选对表。Pt100 和 Pt1000 的阻值差 10 倍千万别混。固件里我把表放在 const flash 区不占 RAMPIC18F67K40 的 4KB RAM 留给通信缓冲和现场变量。4.4 热电偶冷端补偿的简易实现ADS122U04 的内部温度传感器不仅可用于自身监控更实际的价值是给热电偶做冷端补偿。热电偶测的是热端和冷端的温差冷端通常就在接线端子上温度不能用常数预估必须实时测。实现逻辑不复杂切换 MUX 到内部温度传感器模式读一次内部温度然后切换回热电偶通道读毫伏电压。用 NIST 多项式把实测毫伏换算成温度再减去冷端温度得到真实热端温度。内部温度传感器的绝对精度大约 ±2°C用在 HVAC 的备用超温保护上够了但如果你做工业计量级的热电偶测温还是建议外接精密 NTC 做冷端校准。5. 校准、精度预算和 HVAC 现场的抗干扰处理5.1 误差到底花在哪了比例测量把 IC 内部误差抵消了一大半剩下的误差大头在系统层面。我做了一张误差预算表项目评审时很有用误差来源典型量级处理手段Pt100 传感器本身 (Class B)±0.3°C 0°C选 Class A 或产线校准RREF 精度 0.1%±0.26°C 100Ω0.05% 低温漂电阻两线制引线电阻百米量级可到十几度三/四线制ADC 系统偏置增益视芯片批次两点校准消除IDAC 温漂比例测量可忽略无需处理自热25µW 约 0.001°C尽量用低激励电流从表里能看出传感器和基准电阻是大头。HVAC 场景精度要求通常 ±0.5°C用 Class B Pt1000 加 0.1% RREF 就能摸到不需要每台校准。工业场景要求 ±0.2°C 甚至更高就必须走产线校准流程了。5.2 产线两点校准而不是每个温度点都调我做产线校准时只做两点一点测 0Ω 短路得到系统偏置另一点用一个 0.01% 精度的 100Ω 标准电阻替代传感器得到增益误差系数。然后把偏置和增益系数存进 MCU 的 EEPROM 或 Flash 参数区每次上电启动计算时先做校正。有人会问为什么不做多点温度校准因为 RTD 传感器的非线性由 IEC 60751 表负责ADC 系统的非线性在 24 位级别远小于测温需求两点校准已经能覆盖偏置和增益两个主要误差项。多点校准只对要达到 ±0.05°C 的高精度场合才有意义。5.3 HVAC 现场的 EMC 处理经验HVAC 设备里最凶的干扰源是变频压缩机、PWM 风机和继电器触点这些器件工作时会在电源和信号线上制造纳秒级的浪涌。传感器线缆又往往和强电电缆走同一个线槽因此必须做三层防护第一层是硬件滤波前面讲的 RC 加 TVS 就是这一层。第二层是 ADS122U04 的数字滤波器它内置的滤波器在数据率设置合适时对工频及其倍频有陷波特性具体看数据手册的滤波器响应图。第三层是 MCU 侧软件滤波我用滑动平均加中值剔除5 个采样里去最大最小取中间三个平均既能滤尖峰又不明显增加响应延迟。电源处理上模拟侧 AVDD 我用单独的 LDOTLV70433不从 MCU 的 3.3V 直接取避免数字翻转噪声耦合进基准和 ADC。PCB 走线时模拟地单独铺一块只在 ADC 芯片下方单点连接数字地这个细节第一版没做读数偶尔跳字第二版改了布局后问题消失。6. 调试踩坑记录UART 时序、引线电阻和参考电压超标6.1 READY 引脚没接读回来的数据永远差一拍第一版原理图我为了省一路光耦没有把 READY 接到 MCU 中断而是让 MCU 每 20ms 轮询读一次。结果发现温度读数偶尔会跳到相邻采样值春节期间排查了两天才定位到原因轮询时刻落在 ADC 转换的中间读到的既有上次转换的数据也有正在更新的寄存器数据两个值混在一起就是毛刺。把 READY 接上用下降沿中断触发读取后毛刺彻底消失。这里得到的教训是数据就绪信号不要省它本身就是通信协议的一部分。6.2 两线制 Pt100 在长线上的温度误差另一台测试机为了省布线走了两线制 Pt100传感器距离控制器大概 80 米。单根线阻 2.9Ω 左右回路 5.8Ω折算成温度误差 15°C 还多现场一直报温度偏高。我们把传感器换成 Pt1000 后同样 5.8Ω 误差降到 1.5°C 左右又在软件里粗略估了线长做了固定补偿最终系统满足了 HVAC 的精度要求。如果你的项目必须用两线制记住两点优先选 Pt1000并且至少要在现场用万用表实测线阻不要靠估算。6.3 激励电流档位和 RREF 没算好参考电压超标还有一次调试我直接抄了一个 ADS1220 的参考设计里面用 IDAC 1mA、RREF 4.7kΩ。算下来 VREF 4.7V比 AVDD 3.3V 还高IDAC 输出直接进入合规电压限制区ADC 读数完全乱掉。这才意识到 ADS122U04 的 IDAC 输出需要合规电压余量输出节点电压不能超过 AVDD - 0.35V。设计时一定要把 RREF 和激励电流的乘积算进去同时考虑 RTD 最大阻值时串联回路的总压降。我自己后来养成了先规划电气参数再画原理图的习惯先算 IDAC、RREF、增益、参考电压四者的关系再落元器件。自热问题也顺带提一下。500µA 通过 100Ω 的 Pt100发热只有 25µW几乎没有影响所以很多应用手册推荐用 1mA 甚至 2mA 激励来提高信号幅度。但如果传感器探头做在小热容结构里或者测的是流速很低的空气温度自热会显著拉高读数。HVAC 管道风速本来就不高我见过 1mA 激励导致探头温度虚高 0.5°C 的案例所以气体温度测量我一般只用 250µA宁可牺牲一点分辨率好在 24 位 ADC 完全不缺分辨率。按这套 ADS122U04 加 PIC18F67K40 的方案做下来常温区实测稳定性在 ±0.1°C 以内三线制 Pt10090 SPS软件滑动平均现场过 EMC 后读数也没有可见跳变。这套组合的性能冗余其实大大超出 HVAC 需求工业上做到 0.2°C 级别的过程温度监控也够用。如果后续要把成本压下来可以考虑把测量通道数从 4 路减到 2 路或者换封装更小的 TSSOP 版本但核心设计逻辑基本不变。
阅读完成 · 觉得有帮助?
咨询建站