从PT100到数字滤波:ADS122U04加STM32G474的24位温度采集方案

发布时间:2026/11/4 19:02:55
从PT100到数字滤波:ADS122U04加STM32G474的24位温度采集方案 做工业和 HVAC 的温度采集很多工程师的第一反应是拿 MCU 内置 ADC或者随便找一块 16 位 ADC 来顶。等系统真正跑起来才发现瓶颈根本不是“分辨率不够”而是噪声、基准漂移、传感器非线性、现场布线和通信协议这些杂事。ADS122U04IPWR 是一颗带 PGA、内部基准和双电流源的低功耗 24 位 ΔΣ ADC它最特别的地方是放弃了 SPI改用 UART 接口。而 STM32G474RE 这颗主控拥有一堆数学加速外设正好用来做温度线性化、数字滤波和现场总线通信。这个组合用在工业和暖通空调HVAC的测温场景里我实际跑下来的体会是模拟前端被大幅简化抗干扰更容易做精度比常见 16 位方案高一个量级而且整体成本并不吓人。这篇文章就把我从选型、硬件、固件到标定的完整过程写出来。适合正在做温度变送器、暖通控制器、制冷机组监控、工业过程采集或者实验设备测控的工程师参考。1. 方案定位把 24 位转换精度装进 HVAC 和工业温度采集先把这个组合的本质说清楚。ADS122U04IPWR 和常见的 ADC 最大差异在接口一颗 24 位 ΔΣ ADC 用 UART 和主控通信而不是 SPI 或 I2C。很多人第一感觉是“这有什么稀奇”但在实际工程项目里这个选择能直接决定布线和隔离方案的复杂度。1.1 为什么选 UART 接口的 ADCSPI 接口在板内很好用四根线、速率高、时序可控。但一旦传感器板要和主控板分开比如说暖通现场的风管温度探头、冷水机组的水温采集端数据线要走过 1 到 5 米的线缆SPI 的时钟线和数据线就成了麻烦时钟噪声耦合到数据线线长不同导致时序偏移抗干扰能力直线下降。UART 只有一根发送一根接收天生适合跨板、跨线缆传输。更关键的是隔离简单——工业现场最常见的做法是数字隔离器把 UART 两根线隔开只需要两路隔离通道SPI 至少要隔离四路成本和体积差距一下就出来了。ADS122U04 还支持自动波特率检测主控上电后给个低电平同步信号就能适配任意波特率省掉了手动配置的麻烦。这颗芯片的采样核心和 ADS1220 是一脉相承的24 位分辨率、可编程增益放大器PGA从 1 倍到 128 倍可调、内部 2.048V 基准、两路可编程电流源。UART 只是它的“外衣”内在仍然是标准的低噪声 ΔΣ ADC 架构。所以它可以覆盖 PT100/PT1000 铂电阻、热电偶、NTC 热敏电阻等多种传感器正好是 HVAC 和工业测温最常用的三类。1.2 STM32G474RE 在这里不是“简单的读数据 MCU”有人会问都 24 位 ADC 了主控随便一颗单片机不就行了问题在于温度传感器不是把 ADC 码值换成电压就完事了。PT100 需要二次方程反解或者查表插值NTC 要用 Steinhart-Hart 公式算自然对数热电偶需要查分度表加冷端补偿再加上现场信号滤波、PID 控制、Modbus/CAN 通信计算量并不小。STM32G474RE 的优势在于它针对这类“采集 控制 通信”的活儿做了专门优化。Cortex-M4F 内核带 FPU单精度浮点运算很快CORDIC 硬件加速器能算 log、exp、开方、除法做 NTC 的 Steinhart-Hart 公式或者 PT100 的二次方程反解非常顺手FMAC 滤波加速器可以在硬件里跑 FIR/IIR 滤波不占用 CPU 主循环。如果做的是 HVAC 整机控制G474 还能顺手把压缩机驱动、风机 PWM、CAN 总线通信一起管了。也就是说一颗 MCU 既做温度采集处理又做控制逻辑和现场通信不用再像以前那样“采集一颗、控制一颗、通信再一颗”。这也是我选它而不是 F103 之类的核心原因——省主控颗数降 BOM还简化了系统设计。2. ADS122U04 配置核心寄存器、电流源和基准这颗 ADC 用起来和传统 SPI ADC 有个明显的思维变化数据手册里给它的是什么寄存器你就得按它的节奏来。我建议拿到芯片后第一步不是连电路而是把寄存器表打印出来对照着看。2.1 第一件事完成 UART 同步ADS122U04 在上电或复位后会先进入波特率检测状态。主控必须在 TX 线上拉出一个低电平 break 信号芯片靠测量低电平持续时间来锁定波特率。这个步骤很多人会漏掉结果就是芯片怎么都不回数据。我常用的同步方式是用 GPIO 直接把 UART TX 引脚拉低 3 到 5 毫秒再拉高保持几毫秒然后把引脚切回复用功能。在 STM32 HAL 下大概是这样void ads122_uart_sync(void) { GPIO_InitTypeDef gpio {0}; // TX 引脚临时切成 GPIO 推挽输出 gpio.Pin ADS_TX_PIN; gpio.Mode GPIO_MODE_OUTPUT_PP; gpio.Pull GPIO_NOPULL; HAL_GPIO_Init(ADS_TX_GPIO_PORT, gpio); HAL_GPIO_WritePin(ADS_TX_GPIO_PORT, ADS_TX_PIN, GPIO_PIN_RESET); HAL_Delay(4); // 低电平保持 4ms芯片测量波特率 HAL_GPIO_WritePin(ADS_TX_GPIO_PORT, ADS_TX_PIN, GPIO_PIN_SET); HAL_Delay(5); // 高电平保持等芯片完成同步 // 切回 USART 复用功能 gpio.Pin ADS_TX_PIN; gpio.Mode GPIO_MODE_AF_PP; gpio.Pull GPIO_PULLUP; gpio.Alternate GPIO_AF1_USART2; // 按实际引脚改 HAL_GPIO_Init(ADS_TX_GPIO_PORT, gpio); }注意如果后续通信出现紊乱最省事的恢复办法不是去读寄存器而是给芯片复位再来一次这个同步流程。实际调试时我把这个函数放在初始化末尾调试器里可以随时调用比断电复位方便得多。2.2 寄存器配置思路与典型值ADS122U04 的寄存器配置和 ADS1220 系列基本同源主要设置几个关键项输入多路选择、PGA 增益、数据速率、电流源电流值和输出脚、基准选择以及 CRC 开关。以下表格是我做 PT100 三线制、测温范围 -40 到 200°C 时常用的配置写寄存器用 WREG 命令命令格式是 0x40 加寄存器地址后面跟一个数据字节寄存器写入值说明0x000x06AIN0-AIN1 差分输入PGA80x010x0020SPS连续转换模式0x020x84IDAC500µAIDAC1 接到 AIN00x030x10使用外部基准 REFP0/REFN00x040x00关闭 CRC默认帧格式这几个值背后的逻辑要说一下。PT100 在 0°C 时是 100Ω500µA 激励电流下产生 50mV 信号到 200°C 时电阻约为 175.8Ω信号约 88mV。PGA8 时满量程大约 ±256mV留出 2.5 倍以上余量既不会削顶又保证了小信号分辨率。数据速率选 20SPS 是为了拿到最好的噪声性能这个速率下 ΔΣ ADC 的过采样倍率最高有效分辨率最好。如果你做的是压缩机排气温度这种需要快速响应的点位可以适当提速到 175 或 330SPS再用软件滤波。写寄存器的时候有个小经验先把要改的所有寄存器读完备份再一次性写避免中间某个值写错导致通道或增益错乱。调试前期我把读回寄存器内容答应下来和配置值比对能排除很多“我以为写进去了其实没有”的情况。2.3 内部温度传感器热电偶冷端补偿的免费资源ADS122U04 内部集成了一个温度传感器专门给热电偶做冷端补偿CJC用。热电偶测的是热端和冷端的温差冷端温度必须已知否则测量毫无意义。很多设计为了省事用板上的 NTC 做冷端补偿但 NTC 本身的误差和热耦合问题经常让整体精度掉到 1°C 以上。用内部温度传感器做 CJC 的好处是它和 ADC 芯片封装在一起热耦合很好而且不占额外通道。只要在设计 PCB 时让热电偶冷端尽量靠近芯片冷端温度的测量精度就能做到相当理想。读取内部温度需要在配置里开启对应的测量通道然后按数据手册给的线性系数换算。这里提醒一句内部温度传感器的绝对精度有限一般标定一次做一个单向偏移校准就能把误差控制在可接受范围。冷端补偿的计算逻辑是先将热电偶电压转换为“以 0°C 为参考”的等效电压再加上冷端对应的热电势再去查分度表得到真实温度。这一步在 STM32G4 的 FPU 上跑很快后面固件部分我会给出大体流程。3. 硬件设计从传感器到 MCU 的信号链硬件部分决定了这套方案能发挥出多少分。24 位 ADC 的“精度天花板”很高但现场噪声和设计缺陷很容易把有效分辨率打回 16 位。所以模拟部分要认真对待。3.1 PT100/PT1000 的比值测量与导线补偿PT100 铂电阻的阻值变化很小导线本身又有几欧姆电阻直接测很容易被导线电阻带偏。我建议优先用比值测量ratiometric方式这也是数据手册里推荐的做法。原理不复杂让同一个激励电流流过 PT100 和一个精密基准电阻 RREF基准电阻两端的电压就作为 ADC 的参考电压同时 ADC 采集 PT100 两端的电压。因为电流源同一个电流经过两个电阻电流波动和温漂在计算时会被约掉最终结果只取决于 RREF 的阻值精度。也就是说只要 RREF 是高品质精密电阻激励电流漂移多少都不怕。典型接法是这样IDAC1 的 500µA 电流从芯片出来流进 PT100PT100 的另一端连 ADC 的 AIN1 和 REFP0再往下串一颗高精度 RREF 到地REFN0 也接到地。这样 AIN0 减 AIN1 就是 PT100 电压REFP0 减 REFN0 就是参考电压完全满足比值测量条件。三线制的意义在于补偿较长导线的电阻误差。如果传感器探头和主板距离超过几米建议用三线 PT100利用第二路电流源 IDAC2 把导线电阻的压降在数学上消掉。四线制当然最好但采暖通风现场穿线成本高三线制是性价比最优的方案。写代码时注意一个细节虽然 ADC 是 24 位但比值计算结果要用浮点运算中间过程别用整数除法否则近端精度的损失会让你前面的硬件功夫白费。RREF 的精度推荐选 0.1% 甚至 0.05%温漂系数 25ppm 或更低。这颗电阻值几毛钱到几块钱但它就是整套系统的精度基准。3.2 与 STM32G474RE 的 UART 连接与隔离ADS122U04 的电源和逻辑电平范围比较宽但为了信号质量和噪声性能我习惯用一颗低噪声 LDO 给 AVDD 供电DVDD 可以共用或者单独一个 3.3V。UART 接线就两对ADS122U04 的 RXD 接 MCU 的 TXTXD 接 MCU 的 RX交叉连接别接反了。隔离设计是 HVAC 和工业项目的刚需。压缩机场合有大量感性负载继电器吸合、变频器开关都会在地线上产生共模噪声直接共地测量很容易让 ADC 结果跳变。最有效的办法是 UART 过数字隔离器隔离器选两通道的 ISO7721、Si8620 这类把传感器侧的地和主控侧的地彻底分开。隔离还有一层好处传感器端可以用独立隔离电源就算现场探头漏电或者被高压碰触也不会倒灌进主控板。实测下来隔离把地环路噪声这个最大的干扰来源切掉之后ADC 读数的稳定性提升非常明显。如果你的硬件方案已经定型没法加隔离至少保证传感器信号地单独走线星型接地别和继电器、驱动件的功率地混在一起。3.3 HVAC 机房里的 EMC 与布线经验暖通机组里最大的噪声源是变频压缩机。变频器母线侧开关频率通常 4 到 20kHz电流变化速率极快会通过空间辐射和传导两条路污染模拟信号。我踩过的坑里最典型的是 ADC 读数在压缩机启动瞬间跳几十个字等电流稳住又恢复。针对这种情况我的经验是三板斧。第一模拟输入线上加 RC 低通滤波每根线串联一颗 1kΩ 以下的小电阻再对地跨接 10nF 到 100nF 电容把高频分量滤掉。注意串联电阻不能太大ΔΣ ADC 的输入级需要电荷补充电阻太大会引起增益误差一般单线不超过 1k。第二传感器电缆用屏蔽线屏蔽层单端接地接在主控侧千万别两端都接否则屏蔽层变成地环路天线。第三PCB 布局上模拟部分用地平面包住下面不要走数字线和高边驱动线。另外强烈建议在 ADC 的电源输入端加一个简单的 LC 滤波——一颗 10µH 电感和 10µF 电容就够放在 LDO 之后。别小看这一级它能挡住从电源线上窜进来的变频噪声比只靠 LDO 的电源抑制比可靠得多。4. 固件实现UART 驱动、滤波和温度换算固件部分是整套系统真正“出数”的环节。我按 UART 驱动、数据滤波、温度换算三步来组织代码每一层的职责尽量单一方便后续加协议栈或者多传感器扩展。4.1 读寄存器、写寄存器、读转换结果ADS122U04 的 UART 命令是典型的“命令-响应”式。最常用的是三个命令RDATA 读取转换结果、RREG 读寄存器、WREG 写寄存器。命令字大概这样组织0x12 是 RDATA0x20 加寄存器地址是 RREG0x40 加寄存器地址是 WREG。具体帧格式以你手里的数据手册为准这里给出的是我项目里实际用的简化写法。下面的代码在 STM32 上初始化 115200、8 位数据、无校验、1 位停止位然后实现最基础的读转换结果static int32_t ads122_read_result(void) { uint8_t cmd 0x12; // RDATA uint8_t rx[4] {0}; // 发送命令等待响应 HAL_UART_Transmit(g_hads_uart, cmd, 1, 10); HAL_UART_Receive(g_hads_uart, rx, 4, 50); // 组装 24 位数据假设 rx[0] 是状态/回显rx[1..3] 是转换结果 int32_t raw ((int32_t)rx[1] 16) | ((int32_t)rx[2] 8) | ((int32_t)rx[3]); if (raw 0x800000) { raw | 0xFF000000; // 24位转32位有符号数 } return raw; }写寄存器我习惯封装成一个小函数避免每处重复拼命令static void ads122_write_reg(uint8_t reg, uint8_t val) { uint8_t buf[2]; buf[0] 0x40 | (reg 0x07); buf[1] val; HAL_UART_Transmit(g_hads_uart, buf, 2, 10); // 可读回验证但注意命令后要留出响应时间 HAL_Delay(1); }调试时最有效的工具是把所有寄存器配置打印出来。我一般在初始化流程里加一个“配置自检”函数写完寄存器后逐条 RREG 读回来和预期值比对一旦不一致就报错。这套机制帮我抓出过好几次寄存器地址写错、位域偏移搞反的低级问题。4.2 STM32G4 的滤波加速玩法温度信号的特点是变化慢、噪声频谱宽。HVAC 现场的风机噪声、工频干扰、变频器开关噪声都叠在传感器信号上软件滤波必不可少。最直接的方案是移动平均简单可靠#define FILT_N 16 static float temp_history[FILT_N]; static uint8_t temp_idx; float moving_average(float new_val) { temp_history[temp_idx] new_val; temp_idx (temp_idx 1) % FILT_N; float sum 0; for (int i 0; i FILT_N; i) { sum temp_history[i]; } return sum / FILT_N; }移动平均的窗口宽度要按数据速率来定。20SPS 下平均 16 个点输出更新率是 1.25Hz对房间温度、水管温度这种大热惯量对象足够但做压缩机排气温度保护就不合适了那种场合反而要提速采样、减小窗口保证保护动作足够快。所以滤波器参数应该做成可配置项不要写死在代码里。如果不想 CPU 频繁跑平均循环STM32G4 的 FMAC 硬件加速器可以在寄存器级完成 FIR 滤波。我个人在项目里用的策略是低速率通道用软件移动平均高速率通道再考虑 FMAC先把功能跑通等性能测试证明 CPU 占用是瓶颈了再优化。过早优化是做嵌入式最容易犯的错。4.3 PT100/NTC/热电偶的线性化处理传感器线性化是整个软件里最影响“用户体验”的部分。PT100 在 0 到 200°C 范围内用简化 Callendar-Van Dusen 公式就能达到不错效果我做了一个直接反解二次方程的函数#include math.h float pt100_res_to_temp(float r) { const float R0 100.0f; const float A 3.9083e-3f; // 1/°C const float B -5.775e-7f; // 1/°C² float x r / R0; float disc A*A - 4.0f*B*(1.0f - x); if (disc 0) { return -273.15f; // 错误输入保护 } return (-A sqrtf(disc)) / (2.0f*B); }这个公式在 0°C 以上精度很好0°C 以下要求更高时要用带 C 系数的完整版本或者直接查分度表插值。查表法其实很适合 STM32G4把 IEC 60751 的电阻-温度对照表按 10°C 间隔存成数组线性插值出来的误差小于 0.02°C代码还更好理解。对于产品化项目查表更稳因为异常温度不会让公式算出荒谬值方便做超限保护。NTC 热敏电阻用的公式是 Steinhart-Hartfloat ntc_res_to_temp(float r, float A, float B, float C) { float lnr logf(r); float inv_t A B*lnr C*lnr*lnr*lnr; return (1.0f / inv_t) - 273.15f; }NTC 的三个系数由厂家或者标定给出一般 10kΩ B3435 的 NTC 用 B 值公式就够但温度范围超过 50°C 时建议用完整 Steinhart-Hart。NTC 在 HVAC 里常用于室内温度、盘管温度优势是便宜、灵敏度高劣势是批间一致性差量产时每个传感器都要单独标定这一点一定要在项目计划里考虑。热电偶的线性化则是“查表为主”先把 ADC 电压加上冷端补偿的热电势再用标准分度表查温度。K 型热电偶全温区的表很长我建议只加载项目实际用到的温度区间比如 -50 到 500°C 范围内的表项既能省 Flash 又能保证插值精度。5. 标定与精度评估把 24 位变成可信的温度很多项目代码写完就以为结束了实际上标定才是保证“最后一位数字可信”的关键。24 位 ADC 本身分辨率很高但不标定的话失调误差、增益误差、传感器误差都会让最终显示的温度不可信。5.1 零点、增益和基准电阻标定分两级。第一级标定 ADC 本身把输入短接读出来的码就是失调记录下来每次测量减去它。第二级标定整个信号链用精密电阻箱或者已知温度点给系统加一个标准量算出增益修正系数。我的做法是三点标定零度冰水混合物、100°C沸水或者干井炉、再加上一个接近量程中点的温度。有了这三个点至少能把非线性误差排查出来。如果没有恒温槽退而求其次用精密电阻箱模拟 PT100 的电值来标定也是在研发阶段非常实用的替代方法。这里要再次强调 RREF 的重要性。比值测量把所有误差都转移到了 RREF 上RREF 是 100Ω 0.1% 精度的电阻系统整体增益误差就是 0.1% 起步算成温度大约 0.25°C。如果要做到 0.1°C 级精度RREF 得选 0.05% 甚至 0.02%这就是影响范围最直接的量化关系。5.2 实测有效分辨率与温漂分析实测量化时不要只看“24 位分辨率”这个营销数字要看有效分辨率。具体做法是恒温条件下连续采 1000 个点计算标准差然后折算成温度动荡幅度。我实测在 20SPS、PGA8、PT100 三线制的配置下软件滤波后的温度标准差能压到 0.005°C 以内这个水平对 HVAC 的 0.1°C 精度需求已经非常充裕。温漂方面要区分两个来源一个是电子元器件本身的温漂另一个是传感器端接插件的接触漂移。固定好螺丝的端子排比压线端子稳定得多这也是工业现场判断读数漂移时容易被忽略的检查点。电路板受潮、助焊剂残留导致的漏电流也会造成零点漂移清洗 PCB 加三防漆之后往往能解决一堆“玄学”问题。6. 常见故障与排查实录下面这些是我在这类项目里反复遇到、也反复帮同行解决的问题。写成速查表希望你们少走弯路。现象可能原因排查与解决上电后芯片毫无响应UART 不同步、TX/RX 接反重新执行 GPIO 拉低同步流程检查交叉接线读数全为 0 或满码PGA 增益过大导致削顶、MUX 配置错误读寄存器核对通道和增益计算通道满量程是否足够温度跳变几十个字继电器/压缩机切换干扰、电源不稳加屏蔽、RC 滤波、LC 电源滤波考虑数字隔离读数随时间和温度缓慢偏移RREF 温漂大、传感器接线端子松动、PCB 污染换低温漂 RREF紧固端子清洗 PCB 加三防漆多板测试时个别板子精度差装配工艺问题、传感器探头批次差异全流程标定检查探头封装和导热硅脂涂抹通信时偶发错误帧波特率偏差、线缆过长、未开 CRC用 9600 降低敏感度开 CRC缩短线缆或加隔离6.1 UART 握手失败这是新板子最常见的问题。现象是发了命令没反应或者发什么都是 0xFF。十有八九是同步那一步没做好。我的排查顺序先量 TXD 和 RXD 是不是交叉正确再看同步信号有没有真的把 TX 拉低足够长时间最后检查电平是否匹配。ADS122U04 的 UART 电平跟随 DVDD如果主控是 3.3V、芯片 DVDD 也是 3.3V 就没事但有人把 DVDD 接 5V 又把 TX 串电阻直接连 3.3V 主控就会出问题。6.2 读数跳变读数跳变和“漂移”是两回事。跳变是瞬间的、偶发的漂移是缓慢的、持续的。跳变优先查干扰示波器挂在 ADC 输入上等压缩机触发瞬间看看有没有毛刺。毛刺幅度几十毫伏折算到温度就好几度这正是 24 位 ADC 的优势所在——它能测出问题也容易把问题放大给你看。漂移则优先查热源和材料RREF 是不是离功率器件太近、探头是不是贴在强振动部位导致端子间歇接触、板上有没有冷凝水。这些排查经验没有捷径只能靠分区块控制变量的土办法但记录一定要做好。6.3 压缩机/变频器干扰下的稳定化手段最后专门说变频干扰因为这是 HVAC 项目的重灾区。我的标准组合拳如下传感器线缆屏蔽层单端接地、ADC 前级 RC 滤波、UART 数字隔离、电源 LC 滤波这四件套做完绝大多数跳变问题都能解决。如果还有残余那就要考虑在固件层做一点“工程处理”压缩机启动瞬间让 ADC 数据保持上次值等 200 到 500ms 后再恢复更新。虽然听起来有点“土”但应急很有效不影响稳态精度。我个人在实际操作中最深的体会是这套方案的精度上限远超大多数项目的需求最后决定产品等级的往往不是 ADC而是传感器本身、基准电阻的选型和现场的布线工艺。对于 HVAC 这种批量大、现场环境恶劣的产品与其把成本花在更高位数的 ADC 上不如在传感器封装、防水、接线可靠性上多用心。下次如果遇到类似的多通道测温需求可以在这个框架上直接扩展ADS122U04 本身支持多路输入一颗不够就多挂几颗反正 UART 选个带地址匹配的型号或者给每颗做独立片选都是成熟做法。先把单通道链路调通、标定流程跑顺再谈扩展这是我把这套方案复制到不同项目时的固定节奏。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询