资讯详情

资讯详情

工业与HVAC温度测量:ADS122U04与STM32F446ZE高精度ADC实战

工业现场的温度测量最让人头疼的从来不是能不能测而是测出来能不能信。热电偶输出往往只有几十微伏每摄氏度铂电阻在0℃时也才100Ω这些信号扔进一个开关电源、继电器、变频器扎堆的HVAC控制柜里随便一点共模干扰就能把读数搅得面目全非。我做过好几个冷库、锅炉房和数据中心精密空调的项目早期用STM32自带的12位ADC直接采结果温度跳变两三度是家常便饭后来换成外置24位ΔΣ ADC才彻底解决。这篇就围绕ADS122U04IPWR配STM32F446ZE这套组合把工业与HVAC温度测量从硬件选型、寄存器配置到软件滤波的完整链路拆开讲清楚适合正在做温控板、数据采集模块或者HVAC控制器的嵌入式工程师参考也适合想搞明白高精度ADC到底怎么用的人。1. 为什么工业温度测量绕不开外置24位ADC1.1 从信号幅度倒推分辨率需求先算一笔账这笔账决定了你选什么ADC。以最常见的K型热电偶为例它的塞贝克系数大约41μV/℃。如果系统要求分辨0.1℃那么需要分辨的电压就是4.1μV。再看铂电阻PT100激励电流1mA时灵敏度约0.385Ω/℃对应电压0.385mV/℃要分辨0.01℃就是3.85μV。这两个数字都落在微伏级别。STM32F446ZE内置的12位ADC参考电压3.3V时LSB是3.3V/4096≈806μV。就算你加个100倍增益的运放把信号放大到806μV以上运放自身的失调漂移、噪声、共模抑制比都会成为新的误差源而且增益电阻的温漂会直接吃掉精度。更现实的问题是工业现场温度范围可能从-50℃到400℃热电偶满量程输出也就十几毫伏放大器的线性区间和零点漂移很难同时兼顾。ADS122U04是24位ΔΣ架构内置PGA增益最高128倍还带激励电流源。它的有效分辨率在增益128、20SPS数据率下能到20位以上折算到输入端噪声只有几十纳伏级别。这个量级才真正匹配微伏级信号的需求。所以选它不是为了高精度而高精度而是信号链的物理下限逼着你必须用这个级别的器件。1.2 工业与HVAC场景的干扰特征HVAC和工业环境的干扰有几个典型特征理解这些才能理解后面为什么要那样配置。第一是工频干扰。50Hz及其谐波无处不在电机、变压器、接触器都是源头。ΔΣ ADC的sinc滤波器在20SPS时对50Hz和60Hz都有很好的抑制这是它相比逐次逼近型ADC的天然优势。第二是共模电压。热电偶的测量端可能和加热器、压缩机共地地电位差能到几伏甚至更高。ADS122U04的共模输入范围是AVDD-0.1V到AVSS0.1V配合差分输入结构只要把共模电压控制在供电轨内就能正常工作。第三是长线引入的噪声。温度传感器往往离控制板几米甚至几十米导线就是天线。这时候差分输入、屏蔽双绞线、RC滤波缺一不可。第四是冷端补偿。热电偶测的是温差必须知道接线端子的温度才能算出实际温度。ADS122U04有两个可编程激励电流源可以顺便驱动一个PT100或者NTC做冷端补偿省掉一颗单独的传感器芯片。2. ADS122U04IPWR的关键特性与选型逻辑2.1 内部结构决定了它能省掉哪些外围器件ADS122U04IPWR是TSSOP-16封装四通道差分输入内部结构里有几个东西直接决定了外围电路的简化程度。它内置了低噪声PGA增益可选1到128。这意味着小信号可以直接进ADC不需要外部仪表放大器。我早期方案用INA333加ADS1115光运放和电阻就占了半张板子现在一颗芯片搞定。它有两个匹配的激励电流源电流值从10μA到1.5mA可编程。这两个电流源可以同时驱动两路RTD或者一路驱动RTD、一路做偏置。做热电偶冷端补偿时用一路电流源驱动PT100另一路空着或者做断线检测。它内部有基准电压但精度一般工业场合建议用外部基准。不过对于HVAC这种±0.5℃精度就够用的场景内部基准的温漂典型5ppm/℃其实也能接受能省一颗REF5025。它支持SPI接口最高时钟可以到很多MHzSTM32F446ZE的SPI外设完全跟得上。注意ADS122U04是U04后缀代表它是SPI版本不是I2C版本别买错了。2.2 数据率与滤波的权衡ADS122U04的数据率从5SPS到2000SPS可调。这个参数不是越高越好它直接和噪声、工频抑制挂钩。在20SPS时芯片的sinc3滤波器对50Hz和60Hz的抑制都在100dB以上同时噪声最低。代价是响应慢一次转换50ms。对于温度这种慢变量50ms完全不是问题冷库温度变化的时间常数是分钟级的。如果你要做多点轮询比如8路热电偶每路50ms就是400ms一轮对于HVAC控制来说也够用。但如果要做快速断线检测或者需要更快的响应可以切到45SPS或90SPS这时候工频抑制会变差需要靠软件滤波补。我的经验是温度测量默认用20SPS除非有特殊响应要求。这个设置下你几乎不用操心工频干扰省下的软件滤波工作量非常可观。2.3 与STM32F446ZE的搭配优势STM32F446ZE是F4系列里外设比较全的型号180MHz主频带FPU做温度补偿算法和滤波绰绰有余。它的SPI接口有硬件NSSDMA支持完善配合ADS122U04的DRDY中断引脚可以做到完全中断驱动CPU占用极低。F446ZE的定时器资源也丰富可以用一个定时器做采样节拍另一个做看门狗。它的浮点单元在做多项式拟合冷端补偿时很省事不用像M0那样费劲做定点运算。另外F446ZE的供电是3.3VADS122U04的DVDD也是3.3V逻辑电平直接匹配不需要电平转换。AVDD可以单独用5V或者3.3V如果追求噪声性能AVDD用干净的5V LDO供电数字部分用3.3V模拟数字分开走线。3. 硬件设计里那些容易翻车的地方3.1 模拟前端与输入滤波热电偶输入端的滤波是必须的但滤波电阻不能随便选。ADS122U04的输入阻抗在PGA增益大于1时会下降增益128时差分输入阻抗大约几十kΩ。如果你在输入端串两个10kΩ的滤波电阻就会形成分压把信号衰减掉还会引入电阻热噪声。我的做法是滤波电阻用100Ω到1kΩ配合差分电容100nF和共模电容10nF。截止频率算一下1kΩ加100nF的差分截止频率约1.6kHz对50Hz几乎无衰减但能滤掉高频噪声。共模电容要匹配两个10nF的误差要小否则共模转差模。注意滤波电容一定要用C0G或者薄膜电容X7R的压电效应和温漂会直接变成测量误差。这个坑我踩过用X7R时温度读数会随板子应力变化换了C0G就稳了。RTD输入端的处理不同。RTD是低阻信号源滤波电阻可以大一些但要注意激励电流在滤波电阻上的压降。如果激励电流1mA滤波电阻1kΩ那压降就是1V直接吃掉动态范围。所以RTD的滤波电阻要小或者用差分滤波结构让电流不流过滤波电阻。3.2 基准电压与激励电流的布局外部基准如果用REF5025它的输出要加10μF钽电容加0.1μF陶瓷电容。基准的走线要远离SPI时钟线和电源开关节点最好用地线包围。激励电流源的走线是差分RTD测量的关键。ADS122U04的IDAC输出要走成对尽量等长远离数字信号。如果驱动远端RTD导线电阻会串入测量所以必须用三线制或四线制接法。三线制要求两根电流线电阻匹配四线制则完全消除导线影响但多一根线。HVAC里通常用两线制PT100因为布线简单。这时候导线电阻直接变成误差每米铜线约0.02Ω10米就是0.2Ω对应0.5℃误差。如果精度要求高必须用三线制或者做导线电阻补偿。3.3 电源与地平面处理ADS122U04的AVDD和DVDD要分开供电。AVDD用低噪声LDO比如TPS7A4700输出5V或3.3V。DVDD可以用开关电源但要在芯片附近加磁珠和电容隔离。地平面处理是重点。模拟地和数字地单点连接连接点选在ADC的AGND引脚附近。SPI信号线下面不要走模拟信号如果必须交叉走成垂直。DRDY引脚是开漏输出需要上拉电阻通常10kΩ到DVDD。这个信号是中断源走线要短避免被干扰误触发。4. 寄存器配置与SPI通信的实操细节4.1 上电初始化顺序ADS122U04上电后不能马上配置要等内部基准稳定。数据手册建议上电后延迟至少50μs再发命令实际我习惯延迟1ms稳妥。初始化顺序我一般这样走拉高CS发RESET命令0x06等待1ms。发WREG命令配置寄存器0到3。配置寄存器0MUX选择通道GAIN设置增益PGA_BYPASS根据信号幅度决定。配置寄存器1数据率20SPS工作模式正常转换模式连续。配置寄存器2基准选择激励电流设置断线检测使能。配置寄存器3IDAC电流值DRDY模式。发START/SYNC命令开始转换。寄存器配置有个坑WREG命令的第二个字节是寄存器起始地址和数量格式是00 rr nnrr是起始寄存器nn是数量减1。我见过有人写成数量本身结果多写一个寄存器把后面的配置覆盖了。4.2 SPI时序与DRDY中断处理ADS122U04的SPI模式是CPOL0CPHA1也就是模式1。STM32的SPI配置要对应。时钟频率不要超过芯片上限虽然手册写可以到很多MHz但实际布线长的时候降频更稳我用4MHz。DRDY是数据就绪信号低电平有效。在连续转换模式下每次转换完成DRDY会拉低读完数据后自动拉高。用STM32的EXTI中断接DRDY下降沿触发。中断里拉低CS读3个字节拉高CS。读数据时要注意ADS122U04输出是24位MSB先出。如果配置成16位模式会丢掉低8位。我建议始终读24位然后在软件里做移位和符号扩展。// DRDY中断服务函数示例 void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line10) ! RESET) { uint8_t rx[3]; HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Receive(hspi1, rx, 3, 10); HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); int32_t raw (rx[0]16) | (rx[1]8) | rx[2]; if(raw 0x800000) raw | 0xFF000000; // 符号扩展 adc_buffer[adc_idx] raw; if(adc_idx BUF_SIZE) adc_idx 0; EXTI_ClearITPendingBit(EXTI_Line10); } }4.3 常见通信故障排查SPI通信不上先查这几个地方CS信号有没有正确拉低。ADS122U04要求CS在整个命令期间保持低电平如果CS提前拉高命令会被截断。时钟极性相位对不对。模式1是CPOL0、CPHA1STM32的SPI_Init里CLKPolarity和CLKPhase要对应。DRDY有没有反应。如果DRDY一直高说明转换没启动检查START命令有没有发或者寄存器配置是不是把转换模式设成了单次。读回来的数据全是0xFFFFFF或0x000000通常是基准没起来或者输入短路。先测基准电压再测输入差分电压。5. 温度换算与冷端补偿的完整实现5.1 热电偶的电压到温度换算ADS122U04读回来的是ADC码值要先转成电压。公式是V (code / 2^23) * Vref / Gain注意24位有符号数的满量程是2^23-1不是2^24。如果用了内部基准2.048V增益128那么LSB就是2.048/(128*2^23)≈1.9nV。这个数字说明为什么它能分辨微伏信号。转成电压后热电偶的电压到温度不是线性的要用多项式或者查表。K型热电偶在0到500℃范围内用NIST的多项式拟合误差可以做到0.1℃以内。我一般用分段线性插值加查表代码简单精度也够。冷端补偿是重点。热电偶测的是热端和冷端的温差电压实际温度 热端温度 冷端温度。冷端温度用PT100或者NTC测接线端子处的温度。5.2 PT100冷端补偿的电路与算法用ADS122U04的IDAC驱动PT100接法用三线制。IDAC输出1mA流过PT100产生电压ADC测这个电压。PT100在0℃是100Ω1mA就是100mV。ADC的增益设1或者2基准用2.048V这样满量程能测到2V左右对应PT100约5000Ω远超实际范围所以增益可以设大一点提高分辨率。PT100的电阻到温度换算0到100℃可以用Callendar-Van Dusen公式简化R R0 * (1 AT BT^2)A3.9083e-3B-5.775e-7。反解T可以用迭代或者查表。我一般用查表加线性插值每10℃一个点精度0.01℃。冷端补偿的误差直接影响整体精度。PT100本身的精度、激励电流的精度、ADC的增益误差都会叠加。如果要求高PT100要用A级激励电流要校准ADC增益误差要测出来补偿。5.3 软件滤波策略硬件配置好了软件滤波是最后一道防线。温度信号慢可以用很强的滤波。我常用的是滑动平均加中值滤波。滑动平均窗口取16或者32中值滤波取5点。中值滤波能干掉脉冲干扰滑动平均平滑随机噪声。如果要求更高可以用一阶IIR低通y[n] α*x[n] (1-α)*y[n-1]α取0.1到0.3截止频率很低对温度信号合适。提示滤波会引入滞后做控制的时候要注意。如果温度用于闭环控制滤波太强会导致超调。我的经验是滤波窗口不要超过控制周期的1/4。还有一种情况是断线检测。ADS122U04有激励电流源可以定期切换电流方向如果测到的电压不变说明传感器断线。这个功能在HVAC里很有用能提前发现故障。6. 实测数据与精度验证方法6.1 用标准源做校准精度验证最靠谱的方法是用标准信号源。热电偶可以用mV信号源模拟PT100可以用电阻箱模拟。我一般取几个点-50℃、0℃、25℃、100℃、200℃、400℃分别记录ADC读数和标准值。校准分两步先做零点校准输入0mV记录ADC码值再做增益校准输入满量程附近的信号记录码值。然后算斜率和截距写进代码。如果不用标准源可以用冰水混合物做0℃参考沸水做100℃参考注意气压修正。这个方法精度差一些但现场够用。6.2 长期稳定性与温漂测试工业产品要测温漂。把板子放进温箱从-20℃到70℃循环记录同一输入下的读数变化。这个变化包括ADC的温漂、基准的温漂、外围电阻的温漂。ADS122U04的失调漂移典型值是几十nV/℃增益漂移是几个ppm/℃。外部基准REF5025是3ppm/℃。如果这些加起来超过你的精度预算就要做温度补偿用板上的温度传感器测环境温度查表修正。我做过一个项目要求全温区±0.2℃最后就是靠温箱标定加软件补偿做到的。标定数据存Flash开机加载。6.3 现场干扰下的表现实验室测好了不代表现场能用。现场测试要关注几个点读数有没有周期性跳动如果有通常是工频干扰检查滤波和屏蔽。多点测量时通道间有没有串扰切换通道后要等建立时间。ADS122U04切换通道后第一个转换数据要丢弃因为PGA和滤波器需要建立。长线测试接100米屏蔽双绞线看读数稳定性。如果跳动大检查屏蔽层接地通常单端接地。7. 从原理图到量产的关键检查项7.1 PCB布局的硬性规则模拟部分和数字部分分区布局ADS122U04放在模拟区中心。基准芯片紧靠ADC走线短而粗。SPI信号线远离模拟输入如果必须交叉垂直交叉。DRDY走线包地。电源去耦电容紧靠引脚0.1μF和1μF并联。AVDD的LDO输出电容按手册要求选ESR要匹配。晶振远离模拟区STM32的晶振尤其要注意它的谐波很丰富。7.2 物料选型与替代ADS122U04IPWR的IPWR后缀是TSSOP-16卷带包装工业级温度范围-40到125℃。如果买不到ADS122U04IPW是管装电气性能一样。基准芯片REF5025可以用ADR4525替代性能接近价格不同。注意封装和引脚要兼容。PT100选A级B级精度差一个档次。NTC选B值公差1%以内的。滤波电容C0G电阻用薄膜或者金属膜温漂25ppm/℃以内。7.3 生产测试与校准流程量产时要设计测试工装。工装提供标准电阻和mV信号通过继电器切换。每个板子测几个点把校准系数写进Flash。测试项包括零点、满量程、断线检测、通道切换、通信。校准系数可以用两点法也可以用多点拟合。注意校准系数要带CRC校验Flash读取时验证防止数据损坏导致测量错误。这个在工业现场很重要我见过因为Flash位翻转导致温度读数漂移的案例。8. 我在实际项目中踩过的坑与经验总结第一个坑是PGA的建立时间。切换增益或者通道后PGA需要时间稳定如果马上读数据会读到错误的码值。我的做法是切换后丢弃前两个转换结果从第三个开始用。第二个坑是IDAC的合规电压。IDAC输出电流时输出端的电压不能超过AVDD-0.9V左右否则电流源会失稳。驱动远端RTD时导线电阻加上RTD压降可能超过这个限制这时候要降低激励电流或者提高AVDD。第三个坑是内部基准的温漂。早期为了省成本用内部基准常温校准后高温下漂了0.5℃。后来换外部基准问题解决。如果精度要求不高内部基准可以用但要做温度补偿。第四个坑是SPI的CS时序。STM32的硬件NSS有时候行为不符合预期我后来都用软件控制CSGPIO拉低拉高时序完全可控。第五个坑是DRDY中断的抖动。如果SPI时钟太快DRDY可能在数据还没准备好时就触发。解决方法是降低SPI时钟或者在中断里加小延迟再读。这套方案我前后用了三年多从冷库监控到数据中心精密空调从锅炉温度到HVAC送回风温度稳定性一直不错。核心经验就一条模拟电路的钱不能省该用外部基准就用该用C0G就用该做屏蔽就做。省下来的成本最后都会变成现场调试的时间和客户的投诉。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →