基于ADS122U04与R7FA2L2094CFM的工业温度采集方案

发布时间:2026/11/5 6:26:47
基于ADS122U04与R7FA2L2094CFM的工业温度采集方案 做温度采集项目很多人上来就怼MCU内部ADC接个PT100、再软件滤波好像也能测。可一旦走进工业现场或者HVAC系统你会发现根本不是那么回事信号线长、干扰大、传感器类型多要求分辨率高、自校准还得出稳定数据。最近我做完的一个工业/HVAC温度测量节点核心方案就是用TI的ADS122U04IPWR——一颗带UART接口的24位Delta-Sigma ADC配合瑞萨R7FA2L2094CFMRA2L1系列Cortex-M23内核MCU把PT100、K型热电偶的信号统一采集进系统。这个组合看起来低调但实际用下来非常稳测温度这件事能做得既省事又专业。这篇文章就把整套方案从选型逻辑、硬件接法、固件配置到现场调试踩坑的过程完整写出来给正在做温度采集或者楼宇自控项目的朋友作参考。1. 方案概览为什么是这个组合1.1 先把需求拆开再选型接手一个温度测量项目我第一件事不是打开EDA画原理图而是把需求一条条写清楚。工业HVAC场景里的温度采集和实验室里完全是两码事传感器可能被拉出去几十米处于变频器、风机、水泵旁边供电电压波动主板空间有限还要考虑成本和后续维护。具体到我手上这个项目要求大概是这样的支持PT100三线制也支持K型热电偶两种传感器要走同一个采集节点。温度范围覆盖-30到150摄氏度精度优于0.5摄氏度现场有长期稳定性的要求。主控和采集电路放在一个紧凑箱体里不能为了采集温度就搞出一块很大的模拟板。通信接口要简单考虑到后续可能接入Modbus RTU总线主控和ADC之间最好用串口这类常见接口不要额外占用太多IO。把这些需求摆出来选型逻辑就很清晰了。如果只用MCU内部ADC增益、偏置、冷端补偿、恒流源全部得自己搭。RA2L1是有12位ADC但12位配上模拟前端要做到0.5摄氏度精度很难尤其量程覆盖100多度时分辨率根本上不去。与其在模拟前端上花大功夫不如选一颗专用ADC把信号调理和转换一次做完。1.2 ADS122U04IPWR 到底强在哪ADS122U04IPWR的最大特点是“模拟前端集成度高UART接口”。它内部集成了多路复用器、可编程增益放大器PGA、24位Delta-Sigma调制器还有两个匹配的激励电流源IDAC专门给PT100/PT1000提供恒流激励。传感器来的微小信号直接进ADC内部放大转换不需要外搭仪表放大器也不需要外加精密恒流源。更关键的是接口它不走SPI、不用I2C而是走UART。这一点在工程上很实用主控MCU几乎都带SCI/UART外设而且UART本身就是单端两根线不用像SPI那样考虑时钟极性和毛刺问题。对R7FA2L2094CFM来说UART驱动是现成的直接用官方FSP配置好串口就行省去了大量底层时间。另外这颗ADC的功耗很低供电范围宽2.7伏到5.5伏都能工作内部还有温度传感器和基准电压监测用来做热电偶冷端补偿很方便。24位的分辨率配合可配置的PGA增益既能读mV级的热电偶信号也能读PT100经过激励电流产生的几十毫伏压降灵活性很高。1.3 R7FA2L2094CFM 在系统里扮演什么角色R7FA2L2094CFM是瑞萨的RA2L1系列MCUArm Cortex-M23内核主频跑48MHz。它的定位很明确低功耗、高性价比、控制逻辑和小型协议栈全都能装下。在这个项目里它主要负责三件事第一通过UART与ADS122U04IPWR通信下发配置命令、读取转换结果。第二把原始码值换算成实际温度包括PT100的线性化、热电偶的冷端补偿查找表计算。第三跑Modbus RTU从站协议把温度数据以标准寄存器的方式供上位机或DDC控制器读取。RA2L1的Flash和RAM对于这种任务完全够用而且它的外设时钟配置简单FSP图形化配置工具生成底层代码后我只需要写应用层开发效率高了不少。选这个MCU还有一个原因它在低功耗模式下依然能维持串口唤醒和定时采样对需要做电池供电或低功耗节能的HVAC设备很有价值。虽然这个项目是用市电供电但设计之初我也为后续变体留了余地。2. 系统设计与硬件实现2.1 模拟输入通道的接法RTD和热电偶我这次一共规划了4路模拟输入但并非全接同一种传感器。实际分配是这样的通道传感器类型接法说明CH0PT100 三线制用于冷冻水/热水管温度CH1PT100 三线制用于回风温度测量CH2K型热电偶用于设备表面高温监测CH3预留单端备选NTC或0-10V信号PT100三线制接法是这类方案里最值得讲的。原理其实不复杂两路由IDAC输出的激励电流分别流入RTD和导线第三根线用来作电压采样参考。因为电流源是匹配的导线电阻带来的误差可以被抵消掉。接线上RTD一端接IDAC1输出另一端接AIN0正输入同时通过另一根导线回到AIN0负输入附近的公共点IDAC2则模拟同样的导线电阻回路。这样在AIN0正负之间测得的电压只反映RTD本身电阻产生的压降而不会把线缆电阻算进去。热电偶的接法更简单热偶正负极直接进第二个差分通道。但前提是冷端必须处于已知温度点工程上最方便的办法就是用ADS122U04内置的温度传感器来推算冷端温度。注意热电偶信号是微伏级别的K型大约每摄氏度只有40微伏所以PGA增益要选高一些同时布线要远离数字开关信号否则最后几位会跳得很厉害。实操时有几个细节IDAC电流我选的是0.5mA因为500微安流过PT100在0摄氏度时正好产生50毫伏电压这个量级落在PGA增益8到16的合适输入范围内。如果你用的是PT1000可以把电流降到0.25mA这样同样阻值范围下电压相同功耗更小。电流太大RTD会因为自热效应发热造成测量偏高。2.2 电源、基准与PCB布线ADS122U04的模拟供电AVDD、数字供电DVDD我统一用了3.3伏用一颗低噪声LDO从24伏现场电源降压后再供电。要注意它并不是不能5伏工作但3.3伏可以和MCU共用逻辑电平减少电平转换的麻烦。基准电压方面这颗ADC支持内部基准也可以外部基准。对于这个项目我直接用内部基准就行了。因为采用比例式测量思路IDAC电流、基准电压和ADC的转换都是相对同一个参考即使基准有温漂PT100电阻测量的比例关系也不会变。这种“比率测量”是工业电阻测温精度的一个重要来源。PCB布线我踩过的坑比较多这里重点说几条模拟输入和激励电流走线尽量短而且IN和IN-要平行走线减少环路面积。数字UART线不要和模拟输入线平行长距离走会使转换噪声明显增大。模拟地AGND和数字地DGND在ADC下方单点连接电源入口加磁珠和10uF0.1uF电容组合。热电偶输入可以加一个小电容做差分滤波比如说10nF放在靠近ADC引脚处。还有一点容易被忽略ADS122U04的参考电压输入引脚的滤波电容尽量靠近芯片用1uF的X7R或C0G电容。如果外部走线长电容小了会造成转换码值抖动。2.3 与R7FA2L2094CFM的UART对接细节R7FA2L2094CFM有多个SCI通道我用的是SCI0作为UART。波特率我配成了9600虽然这颗ADC支持更高波特率但现场线缆如果较长9600更稳。UART连接只要注意TXD和RXD交叉就可以逻辑电压都是3.3伏不需要额外电平转换。软件上我用FSP配置UART设置8位数据、无校验、1位停止位。RA2系列FSP生成的UART驱动有回调函数机制数据收进来之后放到环形缓冲里主循环解析命令。这样读写命令都不会阻塞主流程后续跑Modbus RTU也不会互相卡顿。有一点需要特别提醒ADS122U04不是一上电就自动出数据的。它上电后处于待机状态必须先发送命令进行配置然后发送启动转换命令之后根据设置决定是读取单次数据还是连续数据。很多第一次用这颗芯片的人代码里只配置了ADC寄存器忘了发启动命令结果读回来永远是零这个坑后面还会详细讲。3. 固件实现全过程3.1 驱动初始化和寄存器配置我在R7FA2L2094CFM上的固件分三层UART驱动层、ADC命令层、应用换算层。UART驱动层直接由FSP生成ADC命令层封装了Reset、读寄存器、写寄存器、发送数据等函数。初始化流程大概是这样// 复位ADS122U04 adc_uart_send_cmd(CMD_RESET); delay_ms(10); // 写CONFIG0设置PGA增益和测量通道 adc_uart_write_reg(REG_CONFIG0, 0x00); // 写CONFIG1选择数据输出速率和转换模式 adc_uart_write_reg(REG_CONFIG1, 0x00); // 写CONFIG2配置IDAC电流大小和使能 adc_uart_write_reg(REG_CONFIG2, 0x00); // 写CONFIG3保留按默认配置 adc_uart_write_reg(REG_CONFIG3, 0x00); // 启动连续转换 adc_uart_send_cmd(CMD_START);这段代码里的具体寄存器值我就不展开到底哪些bit了手册里写得非常清楚不同版本的片子定义略有区别。我想强调的是配置思路先把PGA增益设成项目实际需要的值再配置数据输出速率最后才是IDAC电流。顺序错了或者写寄存器后没有等待内部稳定读回来的数据就会很奇怪。这个项目中PGA增益我分传感器走PT100用增益8热电偶用增益32。速率统一用20SPS因为温度本来就变化慢20SPS的噪声抑制反而更好工频干扰滤得更干净。如果需要现场快速响应也可以提到90SPS甚至更高但分辨率会略降需要取舍。3.2 启动转换与连续读数ADS122U04支持单次转换和连续转换两种模式。我选用连续模式省得每次都要发启动命令。代码逻辑是uint8_t rx_buf[3]; // 每次需要新温度值时发送读取数据命令 adc_uart_send_cmd(CMD_RDATA); adc_uart_read_bytes(rx_buf, 3); int32_t raw (int32_t)((rx_buf[0] 16) | (rx_buf[1] 8) | rx_buf[2]); if (raw 0x800000) { raw | 0xFF000000; // 符号扩展 }三个字节是有符号24位。由于我是连续转换模式芯片内部的数据寄存器会被不断刷新读数据的时机会影响结果。稳妥的做法是发送RDATA命令后芯片返回当前寄存器的数据快照主控读走就行。不用太担心读到新旧交界的数据因为UART读取本身是即时锁存的不像SPI那样有延迟对齐问题。读出来的24位码值换算成电压的公式是电压 码值 / 2^23 × VREF / PGA举个例子内部基准按2.048伏算PGA8码值1638400时对应输入电压电压 1638400 / 8388608 × 2.048 / 8 0.05伏这个0.05伏正好是500微安电流流过100欧姆PT100产生的电压对应的温度就是0摄氏度。整个过程逻辑很简单但非常有用调试时可以先算好预期码值再去对ADC读数能迅速定位硬件问题。3.3 温度换算与线性化的实际算法PT100的电阻-温度关系不是纯线性但工程师常用多项式或查表法处理。我的项目对精度要求中等、存储空间也够所以采用查表加线性插值把-50到200摄氏度的温度点每隔1摄氏度存一个电阻值形成201个表项每个表项两个字节总共也就400字节左右RA2L1完全扛得住。实际换算步骤是根据采集到的电压反推RTD当前电阻值。在查找表里找到两个邻近温度点对应的电阻值。用线性插值算出当前温度。如果你不想维护查表也可以用Callendar-Van Dusen方程直接解但计算量比查表大。ARM Cortex-M23做浮点运算虽然也没问题但考虑到低功耗场景查表加整数运算更省电。代码片段如下float temp; float r_rtd voltage / IDAC_CURRENT; int idx find_table_index(r_rtd); float t0 table[idx].temp; float r0 table[idx].res; float r1 table[idx 1].res; temp t0 (r_rtd - r0) / (r1 - r0);这个做法对PT100这种近似线性的传感器精度足够尤其是-30到150摄氏度区间误差可以控制在0.2摄氏度以内。如果做宽量程或者要做高精度计量那就得用更高阶的多项式或分段线性拟合原理一样表格更密集。3.4 热电偶冷端补偿与自校准热电偶测温本身测的是热端和冷端的温差冷端补偿做得不好精度直接崩。ADS122U04内部温度传感器是接在芯片封装附近我用它作为冷端参考。做法分三步每隔固定周期读取内部温度传感器的码值换算成芯片温度作为冷端温度Tc。根据热电偶类型反查其在冷端温度Tc时对应的热电势。把测量到的热端热电势加上冷端热电势再正查总热电势对应的温度。用到代码里就是两个查表函数float emf_cold lookup_emf_by_temp(Tc, TC_TYPE_K); float emf_hot voltage_from_adc * 1000.0f; // 转成mV float emf_total emf_hot emf_cold; temp lookup_temp_by_emf(emf_total, TC_TYPE_K);注意热电偶的冷端补偿精度基本决定了整条链路的精度。内部温度传感器虽然省事但误差有正负1到2摄氏度。如果要更准可以用外部精密NTC贴着冷端但这又会复杂化。我的处理是把补偿结果做一个软件偏移在恒温槽里校准一次然后把校准值存进Flash。实测下来现场重复性很好。4. 实测数据与问题排查4.1 温度精度实测硬件完成后我做了一轮系统测试用恒温槽和精密温度计对比。下面是一组有代表性的结果目标温度摄氏度精密温度计读数本系统读数误差-20-20.1-19.90.200.050.0-0.052525.0225.10.086060.160.30.210099.95100.30.35150149.9150.50.6注意150摄氏度时误差变大这是因为PT100在这个温度区间非线性更强而我的查表表项是每1摄氏度一个点插值带来的误差会累积。如果对这个点不满意可以把表项加密到0.5摄氏度一档误差会明显下降。热电偶通道测试我用了一个小型干体炉300摄氏度时误差约1.5摄氏度这已经算中规中矩主要误差来源还是冷端补偿和热电偶本身的精度等级。如果现场人员要求高精度我会建议选用更高等级的K型热电偶或改用PT100。4.2 调试中遇到的典型问题这次项目调试比较顺利但有几个坑非常典型单独拿出来说一下。第一个坑是UART完全不通。上电以后主控发命令芯片没反应用逻辑分析仪一看TXD是有波形出去的但RXD永远没数据。排查之后发现问题出在复位引脚ADS122U04有个复位/RESET引脚我在硬件上让MCU的普通GPIO控制它但固件初始化里没有把这个引脚拉高并延时。芯片一直处于复位状态自然不响应任何命令。重新上电后先拉高复位脚等10毫秒再通信问题解决。第二个坑是数据码值乱跳。PT100读数在稳定温度环境下有一次发现最后十几位码值抖动非常厉害算成温度能跳0.5摄氏度。检查后发现是我布的I2C总线从旁边走过数字信号耦合进了模拟输入。后来把UART线移到板子的另一侧并且给模拟输入加了差分电容抖动就消失了。这属于纯布线教训。第三个坑是热电偶显示温度明显偏低。K型热电偶在百米外的一台设备上现场用表量热端电压是准的但系统显示低了好几度。原因就是冷端温度传感器被系统电源加热了芯片附近比实际环境温度高3摄氏度。我把冷端补偿的温度源做了软件滤波并且把MCU和ADC通信频率降低减少数字电路发热最终误差控制在范围内。4.3 常见问题速查表最后整理一个现场排查速查表按出现频率排序现象可能原因处理方法读不到任何数据复位引脚未释放UART没有交叉连接波特率配置不对检查复位时序示波器确认TX/RX波形转换结果一直为0未发送START命令寄存器写失败手动发起始转换命令写寄存器后读回校验数值跳动大数字干扰激励电流不稳增加输入滤波调整布线检查LDOPT100温度整体偏高IDAC电流偏大接触电阻未完全补偿校准实际电流改用更高精度电阻热电偶显示低几度冷端补偿不准做单点偏移校准或改用外部NTC数据更新过慢SPS设置过低UART读取周期太长提高数据输出速率优化读取时序5. 实操经验这套方案做完我的最大体会是专用模拟前端芯片的价值不在于“分辨率高”这一点而在于把复杂的模拟信号调理问题变成可配置、可复制的数字操作。用ADS122U04IPWR配合R7FA2L2094CFM硬件的调试工作量比传统“运放M CU分立恒流源”方案少了至少一半而且后期换传感器类型只需要改配置不用改板子。如果让我重新调整我会把查表温度表做成外部可更新数据通过Modbus写入Flash这样现场校准就不用烧录程序了。另外UART接口虽然方便但在抗干扰能力上比RS485还差一档如果系统距离超过三米建议在UART后面加隔离/差分转换芯片这个升级非常值得。最后再分享一个小技巧调试时永远先发一个读寄存器命令把ADC当前的配置读回来对比。这一招能救你很多次因为所谓“配置写不进去”往往只是你写的那条命令被噪声或时序破坏了读回校验是成本最低的定位手段。

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询