资讯详情

资讯详情

基于ADS122U04与PIC18F4685的HVAC温度采集节点设计

如果你搞过楼宇自控或者工业现场的温度采集多半遇到过这种场景温度探头装在几十米外的风管里、冷冻水管上控制柜里的PLC或DDC等着要这个温度值。线放长了模拟信号衰减、受干扰用SPI接口的ADC吧布线受限地线处理一不注意就读数飘。我第一次看到ADS122U04IPWR这颗芯片的时候眼前一亮——一颗24位的Δ-Σ ADC竟然用UART和MCU通信再配上一颗带CAN接口的PIC18F4685正好能在HVAC系统里组成一个“远端数字化采样、总线化传输”的完整温控节点。这篇文就围绕这个组合聊聊我当时是怎么选型、搭电路、写固件、排故障的希望能给正要搞工业或HVAC温度采集的工程师省点弯路。1. 方案定位这个组合到底解决了什么问题1.1 工业与HVAC里的温度测量到底难在哪温度测量本身不复杂难的是工程条件。空气处理机组里新风温度、回风温度、送风温度、盘管进出水温度再加上冷水机组、车间管道上的测点离控制柜少说十几米远了上百米。传统做法是PT100三线制直接拉线进PLC模拟量模块或者用4-20mA变送器。这两种方案成熟但各有各的痛点。直接电阻信号拉长途导线的温漂和感应噪声都会叠加进去精度等级拉不高。尤其现场还有变频器、接触器这类干扰源模拟信号线走位稍微不好控制器里看到的温度就来回跳。4-20mA变送器方案抗干扰确实好但每个测点都要挂一个变送器回路供电、逐点校准成本不低而且后期维护也多一层麻烦。SPI接口的ADC方案在近距离时很香板级或者几十厘米内的采样都没问题但距离一旦超过一两米SPI时钟和片选信号的完整性就比较难看SCK快了容易误码除非把主控也挪到传感器附近。ADS122U04IPWR加PIC18F4685这个组合的思路是把ADC尽可能贴近传感器采样后通过UART需要长距离就再接RS-485把数字结果送回主控主控再通过CAN总线把数据汇聚给上层系统。ADC负责模拟量的精度PIC负责协议和组网各干各的老本行整个链路从传感器到控制器都是数字信号干扰问题被大幅压缩。1.2 为什么UART接口的ADC值得关注市面上绝大多数24位ADC都带SPIADS122U04IPWR特意把接口做成UART说白了就是允许你把ADC板扔到距离主控几十米外。UART本身是异步协议对时钟同步不敏感做成长距离传输时只需挂一对RS-485电平转换芯片信号走差分之后抗共模干扰能力比单端模拟信号强得多。这对大规模HVAC项目很有价值单个AHU现场十几个测点布线像蜘蛛网一样SPI方案很难撑住UART信号走差分之后就轻松了。另外带CAN的PIC18F4685负责对上通信。楼宇和工业现场常见要求把温度数据挂到CAN总线上汇到中央控制器PIC自带CAN 2.0B控制器不用额外挂MCP2515这类外部CAN芯片BOM成本省一截可靠性也高。整套系统可以做成一个独立的温度采集节点一个节点管一路或几路温度多个节点挂在同一条CAN总线上后面接网关或者直接进DDC。1.3 与几种常见方案的直观对比方案优点缺点适用场合4-20mA变送器抗干扰强、传输远每点需变送器、成本高、校准繁琐已有大量模拟量模块的旧系统PT100直连PLC模块简单、维护方便线长精度下降、易受干扰短距离、精度要求不高的场合SPI接口ADC采样板精度高、响应快布线距离受限、地线讲究板级或近距离传感器ADS122U04IPWR PIC18F4685远端数字化、CAN联网、精度高需要写固件、前期开发量大HVAC多点分散、需要总线汇聚我是站在产品化的角度选的最后一种。前几种方案可能硬件上更省事但放到二三十个测点的项目里调试、校准、抗干扰的综合成本反而更高。2. ADS122U04IPWR 的核心要点拆解2.1 24位Δ-ΣADC与内部集成能省外围ADS122U04IPWR是20脚TSSOP封装引脚不多但内部集成度相当高。4路输入多路复用器、可编程增益放大器PGA、两个可编程激励电流源IDAC、内部2.048V基准、内部温度传感器全都在一颗芯片里。24位的Δ-Σ架构本身带数字滤波器对工频干扰有天然的抑制能力。对温度采集来说PGA和IDAC是最有用的两个模块。PGA能把毫伏级的传感器信号放大后再进ADC分辨率可以做到很高IDAC则可以直接用来给PT100这类电阻型传感器提供激励电流省掉外部恒流源电路。内部温度传感器则是给热电偶做冷端补偿用的读一下ADC内部结温就不用在探头附近额外放NTC了。我做热电偶输入时这个内部温度传感器帮了大忙省一路通道也少一个校准源。内部基准源是2.048V带低温漂特性适合大多数温度测量场景。如果对精度要求更高或者要用比例式测量法也可以直接用外部基准后面详说。2.2 UART接口怎么用才顺ADS122U04的UART接口波特率支持9600、19200、38400、57600常用8-N-1格式。看数据手册的时候重点要弄清楚命令字节和时序要求这和普通UART收发不太一样它是一问一答式的主机发一条命令ADC执行后返回对应字节流。实际使用中我习惯把它配置成连续转换模式然后等DRDY信号拉低后再用RDATA命令读数据。PIC18F4685的EUSART模块直接对接非常方便。如果ADC板和主控板距离较远中间挂一颗RS-485收发芯片就行了A、B端别接反终端电阻按线长和波特率加上。注意串口波特率两边必须严格一致。PIC18F4685如果使用内部振荡器建议先校准偏差超过2%时ADC返回的数据可能整帧错位这时不是芯片坏了是波特率对不上。2.3 数据速率、滤波与50/60Hz抑制ADS122U04的数据速率从20SPS到2kSPS可调不同速率对应不同数字滤波模式。20SPS时滤波器对50Hz和60Hz同时有很好的抑制特别适合工频干扰严重的现场。我实测过HVAC的温度变化本来就很慢风管温度一分钟能波动1°C都算快的20SPS完全够用噪声能压到零点几μV级别。如果项目需要快速响应比如做保护逻辑可以把速率调到100SPS以上但代价是噪声变大。低速高分辨率采集温度高速低分辨率做控制这是一般经验。另外要注意数据速率变了建立时间也跟着变改完配置后要等几个转换周期再读数否则会取到新旧配置混在一起的数据。3. 传感器前端硬件设计与参数计算3.1 PT100接口比例式测量为什么香PT100在0°C时是100Ω灵敏度约0.385Ω/°C。测PT100本质是测电阻最简单的方法是恒流源激励再测电压但恒流源的精度和温漂直接影响结果。ADS122U04有内部IDAC配合外部精密参考电阻可以做成比例式测量。比例式的原理是这样IDAC输出一个电流同时流过PT100和参考电阻Rref。PT100上的电压作为ADC的输入信号Rref上的电压作为ADC的基准电压。ADC转换结果是信号与基准的比值也就是ADCcode 2^23 × (Rrtd / Rref)这个式子一出来关键点就清楚了只要IDAC电流是同一个电流电流的绝对值变化会被同时抵消。IDAC漂移、电源电压波动对测量结果几乎没有影响。这是我推荐用比例式测量的根本原因它把“测量一个绝对电压”变成了“测量一个电阻比值”精度完全由Rref和PT100本身决定。在实际HVAC项目里我习惯用三线制PT100。三线制比两线制多一根线但能把导线电阻带来的误差压到很小。接线方式IDAC1电流从RTD高侧进RTD低侧回到公共地第三根线用于补偿导线电阻流经IDAC2。Rref放在RTD低侧回路里作为基准。两线制最简单的做法是只接两根线但导线电阻会直接叠加在RTD电阻上。一根1Ω的导线两线制来回就是2Ω折算成温度约5°C误差这还没算导线自身随温度的变化。所以两线制只适合短距离、精度不高的场合。3.2 激励电流与参考电阻的计算例子我做一个HVAC送回风温度节点时用的参数是IDAC 1mARref 250ΩPGA增益设为1。计算一下Vref 1mA × 250Ω 0.25V即基准电压250mV满量程对应的RTD电阻 250ΩPT100在-40°C时约84.27Ω在150°C时约157.31Ω也就是说这个配置的测量范围从0Ω到250Ω覆盖了-200°C到大约390°C的PT100范围HVAC领域常用的-40°C到150°C区段完全够用而且只用了ADC量程的一小半分辨率反而更高。Rref的选择很关键。我用的250Ω精度0.1%温漂10ppm/°C。为什么强调温漂因为Rref直接参与比例计算它变了输出温度也跟着变。普通贴片电阻温漂50ppm/°C环境温度变化10°C就会引入0.5‰误差折算到温度测量上已经有可感知的影响了。所以Rref值得用好一点的精密电阻。自热效应也提一下。1mA电流流过100Ω的PT100功耗只有0.1mW。常见SMD PT100的自热系数大约0.03°C/mW到0.1°C/mW算下来自热误差极小。如果是小尺寸探头或者放在不流动的空气中可以把电流降到250μA代价是信号幅度变小需要在PGA上加增益。3.3 热电偶冷端补偿思路如果项目不测PT100而是测热电偶ADS122U04一样能接。热电偶输出的是毫伏级电压需要PGA放大。冷端补偿靠内部温度传感器读ADC结温再在固件里做电压补偿即可。K型热电偶约41μV/°CPGA增益用64或128信号放大后再进入24位ADC分辨率完全不是问题。冷端补偿的准确度取决于内部温度传感器的精度通常能控制在±1°C以内这对大多数工业测温场景够用了。如果追求更高精度可以在接线端子上放一颗外部精密温度传感器然后把这个温度值参与补偿计算。注意热电偶输入要加分压偏置电阻让输入共模电压落在ADC允许的范围内。ADS122U04内部有输入偏置选项配置寄存器里有对应位这个细节别漏不然在PGA高增益下会出现共模电压超限的问题。3.4 保护、滤波与布线工业现场线缆长传感器端子容易受到静电放电和浪涌影响。我的习惯是在输入端加RC低通滤波电容放在靠近ADC引脚的位置电阻值按带宽需求选。RC截止频率设在几百赫兹以内配合ADC自带的数字滤波工频干扰基本能压住。ESD保护元件很有必要特别是外壳非金属的传感器节点人体或设备接触探头线时会产生静电。输入端加TVS二极管参考地和大地之间的连接做合理的单点接地处理。还有一点模拟电源和数字电源要分开走ADC的模拟地引脚单独引回主电源地不要在数字地路径上串模拟信号。实操建议ADS122U04的输入引脚走线尽量短而粗参考电阻到REFP和REFN引脚的走线要对称REFP和REFN之间不要走高速数字信号。这两条线是比例测量的“基准尺”如果它们被干扰污染读出来的温度数据再滤波也救不回来。4. PIC18F4685 固件实现要点4.1 系统整体架构PIC18F4685做主机固件逻辑其实不复杂。整体架构是初始化后进入一个大循环周期性地给ADS122U04发命令、读转换结果、换算温度值、往CAN总线上发数据帧。中间用状态机管理避免阻塞等待ADC响应导致其它任务卡死。状态机可以划分成这几个状态初始化、配置ADC、等待转换完成、读取数据、温度换算、CAN发送。每个状态的持续时间很短ADC转换等待期间MCU可以顺带处理通信、错误标志这些杂事。主循环伪代码 while (1) { adc_state_machine(); // 温度采集与换算 can_task(); // CAN报文发送与错误处理 comm_health_check(); // 通信超时监测 }这套结构的好处是直观出问题也好定位。ADC采集状态里加超时判断比如连续发指令后1秒内没等到DRDY就认为通信异常置一个故障标志位。CAN发送出错时不重试先把错误状态记录下来下一轮再发防止总线拥塞。4.2 与ADS122U04的命令交互流程ADS122U04的命令格式以数据手册命令表为准。我写固件的流程是上电后延时给ADC一个稳定时间发送复位命令把芯片恢复到默认状态写配置寄存器0、1、2、3设置输入通道、PGA、IDAC、基准、数据速率启动连续转换等待DRDY引脚拉低发送RDATA命令连续读3个字节拼成24位有符号数据// 示意代码具体命令字节以手册为准 uint8_t cfg[4] {0x00, 0x00, 0x00, 0x00}; uart_send_byte(CMD_WREG); // 写配置寄存器命令 for (int i 0; i 4; i) { uart_send_byte(cfg[i]); } wait_drdy_low(); uart_send_byte(CMD_START); // 启动连续转换 wait_drdy_low(); uart_send_byte(CMD_RDATA); // 读取转换结果 int32_t raw 0; for (int i 0; i 3; i) { raw (raw 8) | uart_read_byte(); } // raw为24位二进制补码注意符号扩展注意读写寄存器命令后面要不要跟寄存器地址、数据长度不同器件版本略有区别务必对着手册确认。ADS122U04是4个8位配置寄存器我一次写完4个字节效率最高。PIC18F4685的UART配置很简单设波特率寄存器BRG、使能发送接收、开接收中断。跟ADC交互时建议用查询或中断配合不要用延时死等。DRDY信号如果接到MCU的普通IO口用IO中断触发最可靠如果IO紧张也可以轮询DRDY电平但轮询间隔要小于数据速率对应的转换周期。4.3 温度换算从原始码到摄氏度如果使用比例式测量温度换算首先把原始码变成电阻值Rrtd (raw / 2^23) × Rref得到RTD电阻后查表是最稳妥的做法。我把-40°C到150°C的PT100分度表做成查找表每1°C一个点线性插值精度足够。HVAC应用没必要上Callendar-Van Dusen公式公式推导出来的值在低温和高温段准确但代码复杂、可读性差查表法一眼就能看懂也容易维护。查表前先判断raw的数值范围超出上限或下限直接置故障。这个简单操作能避免传感器开路短路时输出一个离谱的温度比如PT100开路时RTD阻值极大换算出来可能是几千度控制系统看到这种值容易做错误判断。如果传感器不是PT100而是NTC或热电偶换算逻辑类似只是分度表换一下。建议把所有传感器类型和对应的查找表做成数组通过配置字节选择这样同一套固件可以兼容多种探头产线调试时省不少事。4.4 CAN上报与错误处理PIC18F4685内置CAN模块报文格式我用标准帧ID按节点地址分配。每帧数据里放两样东西温度值放大10倍的整数避免浮点数占用总线时间和状态字节。状态字节标识传感器是否正常、通信是否超时、固件版本。CAN的发送周期不用太快HVAC温度变化慢我一般1秒发一帧。总线上挂了十几二十个节点每节点每秒一帧负载很小不会占用总线带宽。如果某些温度用于保护逻辑需要快速上报可以单独把对应节点的发送周期改成200ms。错误处理这块重点看两点。一是ADS122U04通信超时连续几次读不到DRDY就把状态位置为故障同时重新初始化ADC。二是CAN发送失败比如总线离线或仲裁丢失要清掉错误标志等待下一周期再发。PIC的CAN模块有错误中断可以在中断里记录错误类型方便现场定位问题。5. 常见问题与排查实录5.1 读数跳字、噪声大这个问题我调试时经常遇到大多数情况不是ADC的问题而是前端和布线的问题。先看PGA增益是不是太高输入信号小增益高噪声被放大得也明显。其次看RC滤波电容位置滤波电容要靠近ADC引脚放在电阻后面别为了走线方便把电容放得离芯片远远的。还有一点检查参考电阻的走线。参考电阻两端如果有一根长线跨过数字信号区域噪声会直接耦合进基准电压里。我遇到过读数稳定跳3到4个字的情况最后发现是REFP旁边的走线与一个PWM信号线平行走了5厘米拉开距离后问题消失。如果软件上还没加滤波建议在固件里做滑动平均或中值滤波。温度信号变化慢取8次平均值噪声基本能压到1个字以内。5.2 通信失败、命令无响应排查顺序先量供电ADS122U04的电源引脚上有没有正常的3.3V或5V再查UART的发送接收引脚有没有接反然后检查波特率PIC18F4685用内部振荡器的话先确认振荡器校准值有没有写对。我踩过一个大坑PIC的BRG寄存器算出来的波特率不是整数和ADS122U04要求的波特率差了1.5%短距离通信容易正常但线一长或者温度一变化就开始概率性丢字节。后来我把PIC换成外部晶振问题消失。所以长距离项目建议用晶振别省这个成本。还有一个常见问题配置寄存器写入以后没有等待足够时间就启动转换结果读回来的数据还是旧配置下产生的。改配置后要延时几个转换周期或者直接等待DRDY变化。5.3 温度值整体偏高或偏低如果测量值整体偏一个固定值优先怀疑参考电阻Rref的精度。Rref标称250Ω实际是249.8Ω还是250.2Ω直接决定整体偏差。换成0.1%精度的电阻然后做一次两点校准能修正大部分误差。如果偏差随温度变化非线性增长那可能是PT100接线方式的问题。两线制改三线制导线电阻误差会大大降低。还有PT100探头的自热效应在小电流时不太明显但激励电流偏大时空气不流通的环境会造成正偏差把IDAC从1mA降到250μA试试。校准方法我比较推荐冰水浴和沸水浴两点校准。冰水浴用冰水混合物稳定在0°C沸水浴在标准大气压下是100°C但海拔高时沸点会降这时候改用恒温槽或者用高精度温度计做参考更靠谱。校准后的补偿系数存在PIC的EEPROM里生产时每台设备写一次。5.4 批量生产时的校准思路批量做节点时逐点校准不现实效率太低。我的做法是硬件上把Rref用精密电阻确保批次一致性软件上支持校准系数写入EEPROM产线用一台标准温度源灌两个温度点自动算出增益和偏置补偿写进每台设备的EEPROM里。这一套流程跑下来整机精度可以稳定在±0.2°C以内对于HVAC应用来说已经相当好了。校准工装的设计要注意探头充分接触热源等温度稳定后再读数不然校准本身就会引入误差。常见问题速查表现象可能原因解决措施读数跳字RC滤波位置不对、PGA增益过高电容靠近引脚、降低增益、软件平均通信间歇失败波特率偏差、线长干扰换外部晶振、减小波特率、检查接线温度整体偏高Rref不精确、IDAC偏大换精密电阻、两点校准、降低激励电流温度随距离漂移导线电阻未补偿改三线制、启用IDAC2补偿上电读不到数据供电时序、复位时间不足加延时、检查电源引脚去耦最后分享一个小技巧调试ADS122U04时先把波特率降到9600把RC滤波电容加大把所有可变的因素先固定在最保守的状态确认通路能跑通后再逐步放开。这样做的好处是出问题时需要排查的变量范围小不会一上来就被噪声、时序、配置几个问题同时困住。这套组合我从原型做到量产整体体验是ADC够稳、PIC够皮实、CAN联网省心如果你手头的项目也是“传感器分散、环境有干扰、最后要总线汇聚”的模式完全可以照这个思路搭一套。
觉得有用,分享给同行:

为您的企业打造数字门面

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

立即咨询 →