基于ADS122U04IPWR与STM32F303RE的高精度温度采集系统设计

发布时间:2026/11/5 1:09:47
基于ADS122U04IPWR与STM32F303RE的高精度温度采集系统设计 干这行久了你就会发现温度测量是工业现场最容易被低估的环节。很多设备看起来是逻辑控制问题最后排查下来其实是温度采样的底子没打好。之前做一套控制器改造磁珠、热电阻、热电偶信号混在一起用MCU内置ADC根本没法看噪声能盖掉好几度。后来换了ADS122U04IPWR STM32F303RE这套组合把K型热电偶和PT1000采样一起做掉才算是把数据稳定下来。ADS122U04IPWR是TI的24位ΔΣ ADC自带可编程增益放大器PGA、内部基准源和激励电流源非常适合直接接热电偶和RTDSTM32F303RE有FPU、有多个SPI和UART处理浮点滤波和通信都得心应手。这篇文章就把从硬件接法到软件驱动、再到现场调试的完整过程捋一遍给正在搭温度采集系统的工程师一个直接能参考的方案。1. 整体设计与选型思路1.1 这个组合到底解决什么问题工业和HVAC里的温度测量难的不是电路原理而是信号幅度小、共模干扰大、通道需求杂。以K型热电偶为例它的灵敏度大约是41μV/℃。常温附近测温0.1℃的分辨率对应的是4.1μV的电压变化。MCU内置12位ADC的LSB在3.3V参考下大约是806μV根本不够用。就算把信号放大到运放能处理的范围运放的输入失调和温漂也会在长时间运行中慢慢吃掉精度而且每一路信号都要配一颗精密运放板子上的器件多、成本高调试点也多。ADS122U04IPWR 这类24位ΔΣ ADC 就是为了这个场景设计的。它把可编程增益放大器、24位采样内核、内部基准源、激励电流源都集成在一颗芯片里。热电偶毫伏级信号进来内部PGA直接放大省掉外围运放PT1000这类阻性传感器内部IDAC电流源提供激励接上电阻就能测不用单独做恒流源。四路差分输入能同时接两路热电偶加一路RTD或者按需求自由分配成多路单端输入灵活性比常见的单通道ADC高出一截。STM32F303RE在这套方案里做控制和数据汇聚主频72MHz带单精度FPU算24位原始数据的线性化、冷端补偿和滤波效率很够。它自带多个SPI接口其中一个和ADS122U04IPWR对接剩下的还能挂显示屏、按键或者通信芯片。F303系列内部还带了模拟外设虽然这块用不到但如果你后续想在主控端顺便做电流采样或者电压比较这个型号留了余地。1.2 器件选型对比做温度采集方案市面上的高精度ADC并不少我拿几颗常用芯片做个对比芯片位数通道数内部PGA内部基准激励电流源接口适合场景ADS122U04244差分/单端1~128有有SPI/UART热电偶、RTD多通道采集ADS124S082481~128有有SPI通道数要求更高的系统ADS12562481~64无需外部基准无SPI通用高精度采集需外配基准和激励MCP35612421~64有无SPI成本敏感的两通道测量选ADS122U04IPWR而不是ADS124S08主要是因为四通道够用价格更低封装更小。和ADS1256相比最大优势是内部基准和恒流源都集成在片内省掉外围电路。ADS1256精度确实不错但做RTD测量时还要自己加外部基准源和恒流源电路PCB面积和BOM成本都上去了工业现场器件越多故障率越高。F303RE的选择逻辑也很简单项目需要同时驱动一个OLED、一路RS485通信和温度采集F303系列有多个UART和SPI不需要抢资源。芯片带FPU对浮点算温度多项式是实打实的加速虽然主频不高但算起来不卡。如果你手头只有F103或者国产GD32F103系列也能跑这套软件只是滤波处理和浮点换算会慢一些实测下来还是推荐带FPU的型号。2. 硬件设计——接口、电源与传感器接入2.1 SPI通信接口怎么接ADS122U04IPWR的SPI接口时序很标准连接方式不复杂但有几个细节需要注意。芯片的SPI信号线是SCLK、DIN对应主机的MOSI、DOUT对应主机的MISO、CS。DRDY引脚必须接MCU的外部中断输入不要为了省引脚把它悬空或接固定电平。数据转换完成时DRDY会拉低MCU收到下降沿再启动SPI读取这样保证读到的都是稳定的最新转换结果。如果靠轮询寄存器里的状态位代码可能会在数据更新瞬间读到高低字节的混合状态出现偶发的大跳变。我用SPI1对接接线表如下ADS122U04IPWR引脚STM32F303RE引脚说明SCLKPA5SPI1_SCK时钟信号速率建议2MHz左右DINPA7SPI1_MOSI主机输出从机输入DOUTPA6SPI1_MISO从机输出主机输入CS/SSPA4GPIO输出片选低有效DRDYPB0EXTI输入转换完成信号下降沿触发中断CS用普通GPIO控制不用硬件NSS这样更灵活也方便和多个SPI器件共用总线时分时操作。SPI模式必须与ADC的时序要求匹配标准配置是CPOL0、CPHA1模式1。如果你用CubeMX初始化把这两个参数对好别的按常规来。2.2 电源和基准电压处理ADS122U04IPWR的模拟电源AVDD和数字电源DVDD建议分开供电。我在板上用了一个低噪声LDO给AVDD供电型号是LP5907这类输出3.3V纹波噪声在几十μV级别。DVDD可以和MCU共用一路3.3V但中间串一颗磁珠减少MCU开关噪声窜入模拟电路的风险。AVDD和DVDD之间数据手册通常建议同一个来源加上磁珠隔离即可不需要两个独立电源树。内部基准电压可以选2.048V或4.096V由寄存器配置。选哪个看你的信号范围。热电偶信号经过PGA放大后通常在参考电压的一半以内用2.048V配合PGA64足够如果是测RTD信号幅度稍大用4.096V更合适能留出更大的余量。精度要求高的时候建议外部基准。内部基准的温漂大约是几个ppm/℃对于0.5℃精度的系统没问题。但现场环境在-20℃到70℃之间波动时内部基准的温漂会直接反映在测量结果里。我做的那套控制器要求高温段误差不超过±0.3℃就直接加了REF5025外部基准芯片基准漂移控制在3ppm/℃效果比软件校准省心。2.3 传感器接线方式热电偶信号是毫伏级的接法上要特别注意线材和滤波。K型热电偶的引线如果比较长现场容易感应工频干扰所以从端子上到ADC输入端之间建议加一个RC低通。我用的是差分输入各串联10Ω电阻然后两条线之间并联一个1nF电容构成差分滤波。这个RC截止频率大约是几十kHz已经能压掉大部分高频噪声。注意电容不要选太大的如果RC过低会拖慢ADC内部采样电容的建立时间反而引入增益误差。冷端温度补偿是热电偶测量里的关键环节。热电偶测的是热端与冷端的温差电动势想要得到绝对温度必须测出冷端也就是接线端子处的温度然后补偿回去。我直接用板上的一颗热敏电阻或者二极管放在接线端子附近连接到ADC的一组输入通道用IDAC电流源激励测温芯片内部有专门针对冷端补偿的配置项。这样硬件上不需要额外电路软件里查表加多项式即可。RTD接法分两线制和四线制。两线制简单但导线电阻会直接叠加到测量结果里我后面会详细讲到误差抵消的办法。四线制用四根线连接传感器激励电流走两根电压测量走另外两根完全消除线阻影响适合对精度要求高的PT100测点。3. 软件驱动——从寄存器到底层数据解析3.1 SPI初始化与底层读写基于STM32的HAL库SPI初始化代码很直接。但有一点需要注意每次读转换数据时片选信号要完整地拉低→写命令→读数据→拉高不要图省事一直把CS拉低。ADS122U04IPWR在CS持续低电平时也能工作但这样如果中间有一次通信时序被打乱比如被高优先级中断插了一脚整个通信状态就乱了而且不好恢复。所以每次访问ADC都重新拉低CS操作完立即拉高可靠性最好。底层读写函数我一般写成这样uint8_t ads122u04_read_write(uint8_t byte) { uint8_t rx 0; HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(hspi1, byte, rx, 1, 100); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); return rx; }虽然看起来简单但整个通信时序的基础就是它。底层函数里我没有在每次操作之间加延时实际通信时钟用的是2MHz写寄存器、读数据都很快不需要额外等待。个别批次芯片对por上电时间有要求上电后最好等100ms再开始配置寄存器不然后端读取的第一个寄存器值可能是默认值容易出现“配置写进去了但没生效”的假象。3.2 寄存器配置要点ADS122U04IPWR的寄存器配置直接决定了测量模式和精度我是按下面的顺序来设置的Config Reg0PGA增益和输入模式选择。热电偶K型接差分输入PGA设置为64倍。如果是PT1000直接测电压PGA可以设成4或8倍避免小信号被噪声淹没。Config Reg1数据速率和通道选择。常用20SPS这个速率下50Hz工频干扰有不错的抑制效果积分周期正好与工频周期对齐同时分辨率也够高。通道选择成AIN0-AIN1作为差分热电偶输入AIN2-AIN3用作板温冷端补偿输入。Config Reg2基准源选择。用外部REF5025时选外部基准输入用内部基准则选内部基准。同时配置IDAC电流源输出引脚和电流大小。PT1000的激励电流一般设250μA功耗小自热效应可以忽略。Config Reg3IDAC方向和电流源设置。此寄存器还包含热电偶开路检测的配置如果检测到传感器断线可以把报警结果发给MCU方便现场运维人员排查。写入寄存器后强烈建议读回校验一遍。我用的是“写配置寄存器后读同一寄存器比对结果一致才继续进行后续操作”的方式。虽然会多花几十微秒但能有效避免因为时序问题导致的“哑配置”。3.3 数据读取与补码解析ADS122U04IPWR是24位ΔΣ ADC输出数据是二进制补码格式。读取过程是CS拉低发送读取命令连续读取3个字节MSB在前CS拉高。拿到这3个字节之后最重要的坑就是符号扩展。如果直接把这3个字节拼成uint32_t最高位是符号位不处理的话负温度会变成巨大的正数。我见过好几份项目代码死在这一步排查半天发现是因为忘了补码转有符号数值。补码转真实电压的完整处理int32_t raw (buf[0] 16) | (buf[1] 8) | buf[2]; if (raw 0x800000) { raw - 0x1000000; // 符号扩展 } float lsb 2.048f / (1 23) / 64.0f; // 参考电压2.048VPGA64 float voltage raw * lsb;其中LSB的计算要记住参考电压是2.048V时24位ADC的满量程对应±2.048V/PGA。所以每个LSB代表的电压就是 2×参考电压/(2^24)/PGA代码里按2.048/(123)/64计算就是单边满量程2^23个码对应的值。这个公式看着绕但一定要自己推一遍不然数据出来偏一个固定倍数都不知道问题在哪。3.4 冷端补偿与软件滤波冷端补偿是热电偶测量里最容易被忽略的部分。简单说热电偶测到的电压是热端和冷端的温差对应的电动势冷端温度变化会直接造成相同幅度的误差。很多新手把热电偶接上就测发现读数反复漂移其实就是忽略了冷端温度。我的做法是在PCB接线端子旁放一颗高精度NTC热敏电阻用另一路ADC输入测它得到冷端温度。软件流程是这样的读取NTC的ADC值换算成冷端温度Tc。查NIST热电偶分度表或者用多项式近似算出在Tc温度下K型热电偶对应的毫伏电压E_c。用这个E_c加上从ADC读到的热端毫伏电压E_meas得到补偿后的总电动势E_total。再用E_total反查分度表得到真实热端温度。这个过程听起来麻烦但代码实现后运行起来非常稳定。查表时可以预先用程序把分度表存成数组MCU里做线性插值1kHz的采样率下随便跑。分段多项式拟合也是一种做法但我不推荐很多人直接用的三阶多项式全局拟合温度范围宽的时候拟合误差会到几度。老老实实分段查表最稳妥。滤波方面我用的是“滑动平均一阶IIR”的组合。原始数据20SPS滑动平均窗口取4个点相当于每秒输出5个有效值然后又加了一个系数为0.2的一阶低通进一步平滑。实测下来原本读数会有±0.2℃左右的跳动叠加滤波后能稳定在±0.05℃以内。真要响应速度可以等稳定后把窗口调小或者搞自适应滤波按现场需求取舍。4. 实测场景——工业现场与HVAC应用4.1 工业现场变频器附近的K型热电偶测温工业现场最常见的干扰源就是变频器它输出的PWM波形会在空间产生强烈的电磁辐射。我测试的工况里控制柜内同时装了一台4kW变频器和温度采集板距离不到20cm。初始测试时热电偶屏蔽层两端都接地空载时读数稳定变频器一启动读数直接跳了1.5℃。问题出在屏蔽层的接地方式上。热电偶屏蔽层如果两端都接地会形成地环路变频器通过地线注入的共模电流在屏蔽层上产生压降又被热电偶差分输入检测到一部分。后来改成屏蔽层靠近ADC板一端单端接地另一端悬空跳变幅度立刻降到0.3℃以内。再配合软件滤波现场结果稳定在±0.1℃内。这个现象很典型很多工程师只关注ADC芯片选型忽略了现场接地策略结果精度怎么也上不去。4.2 HVAC系统风管温度和AHU回水温度采集HVAC场景的特点是距离远、线缆长、测点分散。风管内的温度传感器通常是PT1000采用两线制接法时导线电阻引起的误差不可忽视。比如一栋楼里的风管温度测点从控制柜到传感器可能有30米铜导线0.5mm²的电阻大约是36Ω/km来回线阻接近2Ω。PT1000在0℃时标称电阻1000Ω温度系数大约是0.385Ω/℃所以2Ω线阻带来的误差大概是5.2℃。两线制解决不了线阻问题就只能设法补偿。ADS122U04IPWR的IDAC激励电流有一个好处可以给激励电流配一个校准电阻路径让IDAC电流同时流过已知精度的基准电阻和PT1000通过分别测量两者电压的比例关系把导线电阻的影响用软件消除。实际项目里我在AHU回水温度测点用了四线制PT1000回来细线四根直接接ADC板精度测试下来全量程范围内误差不超过±0.15℃。风管温度测点因为原先管线已布好只有两线用上面说的比例补偿法把线阻误差从5℃拉回到0.2℃左右。这个补偿方法要是没有内部IDAC做起来要外接恒流源麻烦得多。4.3 精度验证与系统校准不管硬件多好出厂前都建议做一次系统校准。我在实验室里用FLUKE的校准仪直接注入毫伏信号来模拟热电偶从0到20mV按1mV步进测了一遍。校准方法很简单校准仪不出信号记录ADC输出的零点漂移值。逐步注入标准毫伏源记录每个点的ADC输出码值。用最小二乘法拟合实际增益和偏置得到两组修正系数。把修正系数写进固件里每次读数先乘增益修正系数再加偏置修正系数。做完校准之后实测下来的数据是温度点误差在0℃附近约±0.05℃在300℃附近约±0.15℃在600℃附近约±0.25℃。误差随温度变大的主要原因有两个一是热电偶的非线性度二是冷端补偿的温度测量误差。如果想要全程±0.2℃以内需要在上位机做多点标定做成分段修正表那就要花更多工夫了。5. 常见问题与排查技巧实录这部分是我在实际开发中踩过的坑整理成一张速查表适合遇到问题的时候按图索骥。现象可能原因解决方法SPI读数据全是0xFFFFFF通道配置没生效或者输入悬空导致输出饱和检查寄存器回读值PGA增益调低把输入引脚接固定电压读数波动大跳变好几度接地环路或屏蔽层两端接地屏蔽层单端接地AVDD和DVDD间加磁珠隔离负温度显示成巨大正数补码没做符号扩展检查代码里的raw 0x800000判断逻辑写入寄存器后行为不变通信时序有问题上电后未等待就配置上电延时100ms再初始化CS操作完整偶尔出现一个大的离群点DRDY读取时机不对数据更新瞬间读了半个新旧数据换成DRDY下降沿中断后再读不用轮询方式PT1000测出来的温度偏高两线制线阻未补偿增加校准电阻比例测量或者改四线制冷端温度不准导致整体偏移冷端传感器离接线端子太远冷端传感器贴到端子用硅胶固定保证热耦合还有一个很实用的技巧ADC输入端虽然没有损坏风险很大但工业现场长线上会有静电和浪涌最好在ADC前面加一级ESD/TVS保护管再串电阻限流。仪表在柜内测试时啥事没有安装到现场连续打雷就坏了一个通道输入排查下来就是接口处没做防护。加了TVS之后到现在没再出过问题。写在最后ADS122U04IPWR和STM32F303RE这套组合最让我满意的其实是它的“省心”——硬件上外围器件少软件上寄存器逻辑清晰不需要为了采样精度去逐级调运放的零点和偏置。真正花时间的地方都在数据解析和补偿算法上而这些恰恰是可以沉淀成通用代码模块的。如果你也正在做温度采集相关的产品我的建议是先别急着堆硬件先把传感器型号、接线方式、隔离策略和补偿方案想清楚再动手画板写驱动。这几个环节要是都理顺了后面就是水到渠成的事。

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询