工业现场的温度测量,最怕两件事:一是小信号被噪声吃掉,二是温漂把精度拖垮。RTD(铂电阻)本身输出只有几十毫伏到几百毫伏级别,放在变频器、接触器、电机扎堆的HVAC机房或者工厂产线旁边,稍不注意,采回来的数据就全是毛刺。这套方案的核心思路很直接——用一颗24位ΔΣ ADC(ADS122U04IPWR)专门负责把RTD的微弱差分信号干净地数字化,再用一颗带FPU的ARM Cortex-M4(R7FA4M1AB3CFM)做线性化、冷端补偿和通信调度。两颗芯片分工明确,一个管"听得清",一个管"算得准"。
我前后用这套组合做过几版温控板,从三线制PT100到四线制PT1000都跑过,踩过的坑不算少。下面把选型逻辑、硬件细节、固件实现和现场排错完整拆一遍,给正在做类似工业或HVAC温度采集的朋友一个可复现的参考。
1. 为什么是ADS122U04加R7FA4M1AB3CFM这套组合
1.1 RTD信号链的真实难点在哪
PT100在0℃时是100Ω,温度系数约0.385Ω/℃。如果激励电流取常见的1mA,那么0℃时两端电压只有100mV,到100℃也就138.5mV左右。也就是说,整个工业温度量程内,有用信号的变化量只有不到40mV。而现场共模噪声、工频干扰、热电偶效应随便一个都可能到毫伏级甚至更大。用普通12位ADC去采,LSB就已经接近1mV,根本分不出0.1℃的变化。
这就是为什么必须上高分辨率ΔΣ ADC。ADS122U04是24位、4通道(实际是2路差分或4路单端可配)、内置PGA和激励电流源的器件。它的有效分辨率在增益64、20SPS数据率下能到20位以上,折算到RTD上就是亚毫摄氏度级别的分辨能力。更关键的是它内部集成了两路匹配的IDAC激励电流源,可以直接给RTD和参考电阻供电,做比例式测量,把激励电流的漂移直接约掉。
1.2 为什么MCU选R7FA4M1AB3CFM而不是普通M0
R7FA4M1AB3CFM属于RA4M1系列,Cortex-M4内核带FPU,主频48MHz,128KB Flash、32KB SRAM。有人会问,温度采集这种慢速任务,用个M0甚至8位机不就行了?单看采集确实够,但实际项目里MCU要干的活远不止读ADC:
- RTD的Callendar-Van Dusen线性化,涉及四次多项式,浮点运算量不小;
- 多通道轮询时要做滤波、异常值剔除、断线检测;
- HVAC场景通常要挂Modbus RTU或者BACnet,协议栈本身吃资源;
- 有些还要跑简单的PID去驱动加热/制冷输出。
M4的FPU在这里是实打实的省时间。我实测过同一套线性化代码,在M0+上跑一次要几百微秒,在M4上带FPU只要几十微秒,多通道轮询时差距会被放大。而且RA4M1的外设配置灵活,SCI、IIC、SPI都全,接ADS122U04的UART接口很顺。
1.3 两者接口为什么走UART而不是SPI
ADS122U04是带UART接口的版本(型号里的U就是UART),和常见的SPI版本ADS1220不同。选UART有几个现实理由:一是走线少,TX/RX两根加一根地就能通信,PCB布局简单;二是RA4M1的SCI可以轻松配到ADS122U04支持的波特率范围;三是UART天然带起始位和校验,短距离板内通信抗干扰反而比裸SPI省心。
代价是速度。ADS122U04在UART模式下最高数据率受限,但对温度测量来说20SPS到100SPS完全够用,温度本身变化就慢,没必要追求高速。
2. 硬件设计里那些容易翻车的细节
2.1 比例式测量电路怎么搭
比例式测量的核心思想:让流过RTD的激励电流和流过参考电阻的电流是同一个(或严格匹配的),这样ADC测到的比值就直接反映电阻比,激励电流的温漂和长期漂移被约掉。
具体接法(以三线制PT100为例):
- ADS122U04的IDAC1从AIN0输出,经RTD到AIN1,再回到IDAC2的引脚形成回路;
- 参考电阻Rref串在激励回路里,接到REF0/REF1;
- 三线制要额外用一路IDAC去补偿引线电阻,这是三线制的关键。
Rref的取值要算。假设激励电流1mA,RTD最大138.5Ω(100℃),那Rref上压降要落在ADC参考电压合适范围内。ADS122U04内部参考是2.048V,用外部Rref时建议让Rref压降接近但不超过参考量程。取Rref=1.65kΩ,1mA下压降1.65V,留了余量,同时RTD上的138.5mV相对参考的比例分辨率足够。
注意:Rref必须选低温漂的精密电阻,至少25ppm/℃以内,最好10ppm/℃。普通1%厚膜电阻的温漂能到100ppm/℃,直接毁掉整个精度。
2.2 激励电流选多大才合适
IDAC可选10μA到1.5mA多档。电流大,信号大,抗噪好,但自热效应严重。PT100的自热系数在静止空气中约0.2~0.5℃/mW。1mA激励下,100Ω上功耗是0.1mW,自热误差约0.02~0.05℃,可以接受。如果选1.5mA,功耗翻倍多,自热误差就上到0.1℃量级,精密场合就不合适了。
我的经验是:普通工业监测用1mA;如果探头封装散热好、或者对自热极敏感(比如测液体温度),降到0.5mA甚至0.25mA,同时把PGA增益提上去补信号。
2.3 布局和接地最容易忽略的点
- 模拟地和数字地单点连接,连接点选在ADC的AGND引脚附近;
- IDAC走线和RTD走线尽量等长、靠近,减少环路面积;
- 参考电阻紧贴ADC的REF引脚,走线短而粗;
- 输入端加RC滤波,但电阻不能太大,否则和IDAC冲突。一般串10~100Ω,配0.1μF到地,截止频率算一下别把有用信号滤掉;
- 如果现场干扰强,输入端并TVS或者气体放电管做浪涌保护,HVAC设备经常有感性负载切换。
3. 固件实现:从寄存器配置到温度换算
3.1 ADS122U04的初始化顺序
ADS122U04通过UART发命令字配置。上电后建议按这个顺序来:
- 复位(发RESET命令0x06),等至少50μs;
- 配置寄存器0:选择MUX通道、增益、PGA使能;
- 配置寄存器1:数据率、工作模式、转换模式;
- 配置寄存器2:IDAC电流大小、IDAC路由、参考选择;
- 配置寄存器3:IDAC2路由、断线检测等。
关键寄存器位要理解清楚。比如增益设置,PGA增益和IDAC是两回事,别混。增益64意味着输入满量程是±2.048V/64=±32mV,RTD的138mV信号在增益4(±512mV)下就够,增益太高反而容易饱和。
3.2 单次转换还是连续转换
温度测量推荐用单次转换(single-shot)模式,每次需要时触发一次,读完进低功耗。连续模式适合高速采样,但温度场景没必要,还费电。单次模式下,发START/SYNC命令启动,等DRDY拉低或者读状态,再读3字节数据。
数据是24位二进制补码,读回来要拼装:
int32_t raw = ((int32_t)buf[0] << 16) | ((int32_t)buf[1] << 8) | buf[2]; if (raw & 0x800000) raw |= 0xFF000000; // 符号扩展3.3 从ADC码值到电阻再到温度
比例式测量下,RTD电阻的计算是:
Rrtd = Rref * (Code / Gain / 2^23) / (1 - ... )实际更简单的做法是用比例关系:因为RTD和Rref流过同一电流,ADC测的是两者压降之比(通过切换MUX分别测,或者用差分参考)。如果参考直接取Rref上的压降,那么:
Rrtd = Rref * Code_rtd / Code_ref前提是两次测量增益一致。很多实现是让参考电压就来自Rref,这样ADC读数直接正比于Rrtd/Rref,激励电流完全约掉。
拿到Rrtd后,用Callendar-Van Dusen方程换算温度。0℃以上用:
R(t) = R0 * (1 + A*t + B*t^2)反解t用求根公式或者查表插值。0℃以下还要加C项(t-100)t^3。A=3.9083e-3,B=-5.775e-7,C=-4.183e-12。
实际固件里我一般用分段线性插值加二分查找,比实时解四次方程省事,精度也够。建一张0.1℃步进的表,Flash占用不大。
3.4 三线制引线电阻补偿的实现
三线制的意义在于补偿引线电阻。假设三根线电阻都是Rl,接法让其中一根线的压降被另一路测量抵消。固件里要做的是:分别测量带引线补偿的通道和参考通道,做差值。具体实现依赖硬件接法,常见的是用IDAC2给补偿线供电,然后MUX切换测量。
如果偷懒用两线制,引线电阻直接加进RTD读数。一根1米长的普通铜线约0.02Ω,折合温度约0.05℃。线长了、线细了误差更大。所以工业场合老老实实上三线制,四线制更好但接线成本高。
4. 实测中的噪声、漂移与断线问题排查
4.1 读数跳动大,先查这几处
第一次调试时如果发现读数末几位乱跳,按这个顺序排查:
- 激励电流和参考是否真的匹配。用万用表量Rref和RTD上的实际压降,算比值看和ADC读数是否一致;
- 数据率是不是设太高。20SPS下ADC内部数字滤波强,噪声低;设到1000SPS噪声明显上来。温度测量没必要高速;
- 输入端RC滤波是否合适。截止频率设在几Hz到几十Hz,能压掉工频和高频干扰;
- 电源是否干净。ADC的AVDD要用LDO单独供,别和数字电源混,加磁珠和去耦电容。
我遇到过一次读数跳±0.5℃,最后发现是IDAC走线和RTD走线平行太长,形成了耦合。把两根线拉开、缩短环路后立刻稳定。
4.2 温漂问题的定位方法
温漂表现为:常温校准好了,一加热或者环境温度变化,读数就偏。定位方法:
- 把整板放进温箱,从-20℃到70℃扫一遍,记录读数偏差;
- 如果偏差和温度强相关,先怀疑参考电阻的温漂;
- 再查ADC本身的失调漂移,ADS122U04的失调漂移典型值很低,一般不是主因;
- 最后查RTD引线和焊点,不同金属接触会产生热电势。
比例式测量能约掉大部分激励漂移,但约不掉参考电阻的漂移。所以Rref的选型是温漂控制的第一道关。
4.3 断线检测怎么配
ADS122U04内置断线检测(burn-out current source)。配置寄存器里使能后,会往输入端注入一个小电流,如果RTD断线,输入会被拉到一个轨,读数异常。固件里判断读数超出合理范围就报断线故障。
但要注意:断线检测电流会影响正常测量,所以要么在测量间隙做检测,要么用专门的检测周期。我一般每N次正常测量插一次检测,避免干扰主测量。
4.4 通信异常的处理
UART通信偶尔丢字节是常事。固件里要做:
- 每条命令后校验返回;
- 读数据时校验状态字节;
- 加超时重试,连续失败几次报通信故障;
- 关键配置寄存器定期回读比对,防止被干扰翻转。
RA4M1的SCI有FIFO和错误标志,用中断方式收发比轮询可靠。
5. 现场部署与长期稳定性经验
5.1 校准策略:单点还是多点
出厂校准建议至少两点:0℃(冰水混合物)和100℃(沸水,注意当地气压修正)。要更高精度就加中间点。校准的本质是修正R0和增益误差。单点校准只能修R0,增益误差修不了,所以至少两点。
现场如果没法拆探头,可以用已知温度的参考探头做比对校准,但精度受参考探头限制。
5.2 长期漂移和自热的管理
长期运行后读数慢慢偏,常见原因是RTD本身老化(铂丝晶粒变化)和焊点氧化。工业场合建议每年校准一次。自热方面,如果探头插在静止空气里,激励电流要保守;插在流动液体或金属套管里,散热好,可以适当加大电流换信噪比。
5.3 和上位机通信的工程细节
HVAC系统里常见Modbus RTU。RA4M1做从站,把温度值放到保持寄存器。注意:
- 温度用定点数传,比如放大10倍存成int16,避免浮点传输的兼容问题;
- 寄存器地址和字节序要和上位机约定清楚,大端小端搞反是经典坑;
- 加看门狗,通信卡死时能自恢复。
5.4 我踩过的最深的一个坑
有一次批量出货后客户反馈低温下读数偏高约1℃。查了很久,最后发现是PCB上RTD接线端子的焊盘和走线在低温下热胀冷缩导致接触电阻变化,加上用了两线制,误差直接进读数。改成三线制并换了更可靠的接线端子后问题消失。这件事让我彻底放弃了在工业场合用两线制的念头。
6. 几个能直接抄的配置参考
6.1 寄存器配置速查
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 增益 | 4~8 | 匹配RTD信号幅度,别饱和 |
| 数据率 | 20SPS | 温度场景足够,噪声最低 |
| 转换模式 | 单次 | 省电,按需触发 |
| IDAC | 1mA | 兼顾信噪比和自热 |
| 参考 | 外部Rref | 比例式测量 |
| 滤波 | 输入RC约10Hz | 压工频和高频 |
6.2 温度换算的定点实现思路
浮点在M4上虽然快,但为了跨平台一致,我常用定点。把Rrtd放大1000倍存成int32,用预计算的系数做多项式,最后输出0.01℃分辨率的int16。这样上位机解析简单,也不会有浮点舍入的跨编译器差异。
6.3 上电自检清单
- 读ADS122U04的配置寄存器,确认写入成功;
- 测一次已知参考电阻,验证读数在合理范围;
- 检查IDAC是否正常输出(可测Rref压降);
- 断线检测触发一次,确认能报故障;
- 通信回环测试。
这套自检跑通,基本能挡掉大部分装配和焊接问题。
整体用下来,ADS122U04加R7FA4M1AB3CFM这套组合在工业和HVAC温度测量里属于"够用且稳"的档位。ADC的24位分辨率和内置IDAC省掉了不少外围,M4的算力让线性化和协议栈都不吃力。真正决定成败的往往不是芯片本身,而是比例式电路的搭建、参考电阻的选型、三线制的坚持,以及固件里那些不起眼的校验和重试逻辑。把这些细节做扎实,精度和稳定性自然就上来了。