1. 项目概述与选型逻辑先说结论这是一套典型的“高精度ADC 工业级MCU”组合方案用于工业和HVAC场景下的温度采集链路。核心链路是ADS122U04IPWR负责把传感器信号变成数字量再通过UART把数据丢给PIC18F86K90去做处理、显示和上报。ADS122U04IPWR是TI出的一款24位Δ-Σ型ADC重点不在“24位”这个噱头上而在于它有几个专门为温度测量设计的东西内置可编程增益放大器PGA、两个匹配的激励电流源、内部基准源以及一个UART通信接口。后面这个“UART接口”才是这颗料最特殊的地方。市面上大部分精密ADC都是SPI接口像ADS1220、ADS124S08这些而ADS122U04直接用UART这对于用的MCU资源紧张、或者想把ADC放在离传感器很近的地方的场合来说是个很实际的解法。PIC18F86K90这边选它的理由也很直白Microchip 8位MCU里带片上LCD驱动模块的型号不算多这颗料集成了LCD驱动器和较多的I/O加上几个EUSART跟ADS122U04UART对接正好不需要再折腾SPI引脚复用。另外它在低功耗模式下的电流表现也不错在HVAC温控器这种需要长期待机的设备里有明显优势。还有一个实用原因很多老的工业控制板已经在用PIC18系列固件工程师熟迁移成本低。再说场景。工业和HVAC里的温度测量不像实验室那样环境可控往往要面对长线缆、强干扰、温度漂移和工作电压不稳这些现实问题。ADS122U04的优势就在于它能把模拟前端PGA、激励源、基准和数字接口集中在一个封装里传感器那头只要做好滤波和防护剩下的事情交给ADC内部处理。配合PIC18F86K90做线性化计算、比例换算和显示驱动整个温度采集模块的BOM就非常清爽不需要额外的高精度仪表放大器也不需要独立基准芯片这对成本敏感的项目来说节省非常多。这套方案适合谁我的经验是大多数人不会真的从零画一个温度采集板而更关心“用现成的芯能搭出什么效果”。这里面有两类人价值最大一类是要做温控器、数据记录仪、盘柜温度监测的硬件工程师想确认芯片间的配合细节另一类是固件工程师想搞清楚ADS122U04的寄存器配置、数据读出和线性化处理到底怎么落地。下面我把硬件的接法、寄存器的配置、通信时序和固件实现一层层拆开讲。2. 硬件电路设计要点ADC选型只是第一步真正决定采集精度的往往是外部电路。ADS122U04再强传感器侧的激励、滤波和引线处理搞砸了读数一样会飘。2.1 RTD测温的几种接线方式RTD热电阻是工业和HVAC里用得最多的温度传感器铂电阻PT100、PT1000都很常见。RTD本身是阻值随温度变化的元件测量原理就是把恒定的激励电流灌进去测它两端的电压再反推温度。ADS122U04内部有可配置的激励电流源不用外挂恒流源这个设计很省事。接线方式决定精度这一点是硬件设计里最关键的取舍。两线制接法最简单一根线送电流同一根线也负责测电压。但问题在于导线自身有电阻这个电阻会跟RTD的阻值串在一起造成固定的正偏差。比如100米长的铜导线线阻可能有5到10欧对应到PT100上就是十几度的误差。所以两线制只适合传感器到ADC距离很近、精度要求不高的场合。三线制是工业现场的标配。它的原理是两根线给RTD提供激励电流回路第三根线单独用来测量电压。因为第三根线不流过电流线上不会产生压降测量电压的回路里就没有线阻引入的误差了。不过严格来说它还需要ADC内部的匹配电阻网络来抵消两根电流线之间的差异ADS122U04针对这个需求提供了专门的RTD测量模式可以自动切换通道来测量参考电阻两侧的电压从而把导线电阻的影响压到最低。四线制精度最高一根线送电流另一根线测电压电流回路和电压回路完全分开电压测量线上几乎不流过电流所以线阻误差理论上是零。代价是多一根线接线端子也贵一点。我的建议是如果传感器是焊在PCB上的用两线就够了如果是走现场的、线缆长于3米直接上三线制计量级场合才考虑四线制。2.2 热电偶与冷端补偿HVAC里热电偶用得不如RTD多但工业设备表面温度测量经常会碰到。热电偶输出的是毫伏级的微弱电压且必须知道冷端温度才能算出热端温度。ADS122U04内置了一个温度传感器可以让冷端补偿的测量在ADC内部直接完成减少外部元件。具体做法是把热电偶的J型或K型线接到ADC的AINP和AINN通道上同时ADC内部温度传感器读到的就是芯片附近的冷端温度然后把热电偶电压加上冷端对应的热电势再从分度表里查出热端温度。这样做最大的好处是冷端和ADC的温度高度一致避免了冷端放在PCB不同位置导致温差引起的补偿偏差。需要注意的一点是热电偶输出的电平极低K型热电偶大约41uV/℃24位ADC的LSB尺寸在PGA增益为1时大概是0.6uV左右所以直接把增益打到64或128把信号放大后再采样分辨率能达到0.01℃级别这个参数对于工业温度记录来说是足够的。2.3 电源与去耦还有滤波ADS122U04的数字电源和模拟电源分开供电更稳。我习惯用AVDD接一个低噪声LDO的输出DVDD如果系统里有3.3V数字电源可以直接接但建议串一个小磁珠隔离一下。去耦电容选1uF和0.1uF的组合放得离电源引脚越近越好。传感器侧面的RC滤波特别容易被人忽略。激励电流源驱动的是RTDRTD的等效阻抗只有100到1000欧左右如果在激励回路里串了较大的RC滤波电阻恒流源会在滤波电阻上产生压降这个压降会直接损耗掉ADC的输入范围。所以在RTD激励路径上要做RC滤波的话电阻值不能大常见取几十欧电容取1nF到10nF折中滤波效果和建立时间。3. ADS122U04寄存器配置与UART通信实现ADS122U04和传统SPI接口ADC最大的区别在于通信协议。它用UART帧格式可以配置寄存器操作靠着一个命令字节加上数据字节来搞定。很多人第一次接触这颗芯片时会被它的命令结构绕晕我先把它拆开。3.1 UART帧格式与命令字ADS122U04默认的UART波特率可以设置常用的是9600、19200、38400最高可到若干Mbps但实际项目里我一般用9600或19200稳而且不挑MCU。每个数据帧由命令字节CMD和可选的数据字节组成。读取数据这条命令最常用主机发出RDATA命令后ADS122U04会返回24位转换结果按高字节、中字节、低字节的顺序发出来。还有一个RDATAC命令是连续读模式开启后ADC会持续把最新的转换结果自动发出来主机不用反复发命令这样能降低UART上的指令开销适合连续采样型的数据记录仪。如果需要改变配置则发SDATAC退出连续读模式。寄存器配置命令是WREG后面跟着要写的寄存器数量减一和寄存器内容RREG则用于回读寄存器调试的时候非常有价值。我提个建议开发阶段一定写一段RREG回读函数寄存器写进去再读回来核对一遍能省去非常多排查“到底配没配进去”的时间。3.2 关键寄存器配置剖析ADS122U04有四个主要配置寄存器配置寄存器0到3。我挑几个重点说一下这些寄存器位是决定采集链路行为的关键。配置寄存器0里的PGA_BYPASS位决定了输入信号是否经过内部PGA。如果接热电偶这种微弱信号必须关掉旁路让PGA介入同时设置增益倍数。测量RTD时增益设成1到4就够了因为RTD输出的是相对较大的电压信号没必要把增益拉高。增益越高等效输入噪声越低但输入范围也越小这个取舍要根据传感器类型定。配置寄存器1里最重要的是转换模式位。单次转换模式下ADC完成一次转换后自动进入低功耗状态这在电池供电的温湿度记录仪里非常有用。连续转换模式则适合实时性要求高的HVAC控制器每一个转换周期都会有新的数据。另一个关键位是滤波器设置ADS122U04内置的Δ-Σ调制器配合数字滤波器可以通过寄存器选择工作在50Hz和60Hz同时抑制的模式这对中国和欧美市场的工频干扰场景特别有意义。配置寄存器2里有两个激励电流源IDAC电流大小可配。测RTD的时候激励电流建议选250uA或者500uA。大电流的好处是信号幅度大信噪比好但坏处是RTD自己会发热导致自热误差。PT100在500uA下自热功率大约是0.05mW在空气中会引起大约0.1℃的温升这个量级在普通HVAC应用里可以接受但高精度测量就要降到100uA以下。配置寄存器3主要处理参考源和通道选择这部分跟着RTD接法走既要保证参考电压的稳定又要让测量通道和激励通道匹配。3.3 完整配置序列示例下面给一套典型的PT100三线制配置流程。假设我们使用IDAC1通道接到AIN0作为PT100的激励源IDAC2接到AIN1AIN2和AIN3作为参考电阻的测量通道转换结果从AIN0和AIN1差分对输入。配置写入顺序是先发SDATAC确保退出连续读模式然后连续写入配置寄存器0到3。配置寄存器0写入0x02表示为内部PGA使能增益为4配置寄存器1写入0x14设置单次转换模式内部滤波器开启数据速率设置得当配置寄存器2写入0xA0使能IDAC1和IDAC2电流设为500uA配置寄存器3写入0x20使能内部基准源并将参考电阻接到对应基准输入引脚。写入完成后发RC命令启动一次转换然后等待DRDY引脚变低。DRDY是ADS122U04给出的一个关键握手信号每次转换完成它都会拉低一段时间。主机检测到这个下降沿再发RDATA命令就能取回稳定的24位数据了。这套流程我实测下来一个完整读数周期包含配置时间在内大约几十毫秒完全能满足HVAC温控器的5到10秒采样周期要求。3.4 DRDY引脚与数据就绪判断一定要用好DRDY。很多初学者只盯着UART数据流忽略了硬件握手结果发现读取的数据时而对时而错。根本原因是读取命令和数据转换周期不同步——转换没结束就把数据读出来了。DRDY是一个推挽输出引脚转换完成时产生低脉冲。正确做法是用PIC18的外部中断或查询方式去捕获这个引脚的电平变化。在单次转换模式里每次启动转换后可以轮询DRDY直到它拉低然后立刻发RDATA。在连续转换模式里DRDY会周期性地拉低主机跟着它的节奏取数就行。如果项目里不方便接DRDY引脚也可以完全靠延时判断配置完寄存器后等一个完整的转换周期根据数据速率算出来再去读。这个方法能用但稳定性差当环境温度变化导致时钟偏移时偶尔会读到转换周期切换期间的中间数据。所以我的建议非常明确DRDY引脚必须接别省。4. PIC18F86K90 侧驱动与数据处理ADS122U04把模拟信号处理完了剩下的工作就是PIC18F86K90怎么把读到的24位裸数据和温度对应起来。4.1 初始化EUSART与通信参数PIC18F86K90上UART对应的外设叫EUSART。初始化需要注意三件事波特率发生器配置、帧格式匹配和收发中断。波特率方面如果系统时钟选8MHz内部振荡器想得到9600bps的UART波特率SPBRG寄存器的值要根据公式算出来注意误差控制在2%以内。对于EUSART这种硬件UART常见的是设置为8位数据位、无校验、一位停止位即8N1格式跟ADS122U04默认配置对齐。收发中断建议全部打开。读数据的时候用接收中断把三个字节收进环形缓冲区主循环只管解析缓冲区内容这样不会因为ADC连续输出的速度过快而来不及处理。发送中断在配置寄存器阶段也可以提高交互效率但配置动作频率低用阻塞式发送也可以接受。实测下来只要波特率误差在允许范围内通信稳定性是可靠的。4.2 读取ADC数据的固件流程固件主流程分几步上电延时等ADS122U04内部基准稳定然后发配置寄存器序列再进入一个循环等待DRDY引脚拉低后发RDATA命令收三个字节。数据解析这里有个容易踩的坑ADS122U04输出的是二进制补码格式。如果读到的最高字节最高位是1说明结果是负值需要先取反加一再做有符号数处理。很多工程师忽略了这一点一旦测量的温度低于零点或者热电偶接反就会得到完全离谱的读数。数据收齐后要拼成一个32位有符号整数再映射到ADC码值对应的电压。ADS122U04内部基准默认是2.048V在PGA增益为G的情况下满量程范围就是±2.048/G。每个LSB对应的电压等于满量程电压除以2的23次方后续温度计算就基于这个电压值展开。4.3 从电压到温度的计算RTD的温度非线性要用Callendar-Van Dusen方程来做。PT100在0℃以下和以上分别使用两组不同的多项式系数在0℃以上电阻与温度的关系近似为Rt等于R0乘以一加上alpha乘以t减去beta乘以t方等等其中alpha在PT100的标准里通常是0.00385055。这个多项式工程上非常好用精度足以覆盖-50℃到200℃的HVAC区间。在具体实现时不要直接用浮点运算硬算高阶多项式MCU的资源很宝贵。我的做法是先算出一个粗略的查表点然后用牛顿迭代法或者直接分段线性插值逼近。具体来说把整段温度区间按1℃分格预先把每个温度点对应的电阻值存在Flash里。实测值是电压换算出的电阻值在表里二分查找找到最接近的两个温度点再做一次线性插值。这样温度分辨率能轻松达到0.1℃而且程序运行时间比直接浮点算多项式快两倍以上。热电偶的处理则是反过来算。先读出ADC电压加上冷端温度对应的热电势得到补偿后的热端电压再用分度表反向查温度。K型热电偶的分度表数据量不大拟合多项式需要用到高阶项但查表法仍然是主流选择。4.4 LCD显示与数据上报PIC18F86K90的片上LCD驱动器可以直连玻璃LCD屏内部的电荷泵保证低电压下也能维持显示对比度。驱动LCD的固件部分把计算出来的温度值格式化成字符串再调用LCD写字符函数即可。给温度值格式化的时候建议多留一位小数格式字符串用定点和填充处理防止显示错位。HVAC场景下的温度显示0.1℃的精度已经能给人很好的体验过犹不及。5. 常见问题与排查技巧实录这部分是我实际调这块板子踩过坑以后总结出来的。每一类问题都是真实发生过的排查的路径也是按照性价比排序的。5.1 UART通信超时与乱码这是最常见的现象表现为读回来的数据永远是一堆0xFF或者0x00或者偶尔读到正确值但很快又变成乱码。第一步检查波特率误差。如果MCU主频不是晶体而是内部振荡器温漂会导致波特率偏差长时间运行后偶发通信错误。我习惯用外置晶振给PIC18F86K90提供时钟同时在配置里尽量把波特率误差算到0.5%以内。第二步检查TX/RX是不是接反了。ADS122U04的DIN接MCU的TXDOUT接MCU的RX。不少人在这个上面翻了车。还有一个隐藏问题ADS122U04的UART引脚和PIC的EUSART引脚如果共用一个电平域要注意两者的高电平判断电压是否兼容如果不一致就需要加电平转换。如果通信偶尔正常但大部分超时问题往往出在DRDY时序。建议在发送RDATA命令前先确认DRDY已经拉低而不是延时盲读。加了DRDY检查以后通信稳定性会有质的提升。5.2 温度读数跳动大或者漂移读数波动大先看电源和基准。ADS122U04内部基准噪声会影响转换结果如果AVDD上带有较大的纹波读数会周期性抖动。这时候用示波器看AVDD波形通常可以发现几十毫伏的工频纹波加强去耦电容或者换低噪声LDO能解决大半问题。另一个常见问题是RTD自热。激励电流选得太大PT100自己发热读数会缓慢上升最终稳定在一个偏高的温度上。这个问题很难从数据处理端解决只能降低激励电流或者改善传感器散热条件。还有一类读数漂移来自参考电阻的温漂。如果参考电阻用的是普通厚膜电阻它的温度系数可能高达50ppm/℃环境温度变化5℃测温结果就会出现较大偏差。硬件选型时参考电阻必须选精密电阻精度0.1%起步、温度系数25ppm/℃以下最好用金属箔电阻。5.3 参考电阻与引线电阻带来的系统误差很多项目用了三线制RTD但读数在长线下还是不准。原因通常是参考电阻和RTD激励电流的匹配问题。ADS122U04的激励电流源IDAC1和IDAC2虽然经过匹配但长线缆的电阻不一样导致两路电流在各自线路上压降不平衡这个误差会在参考电阻上体现出来。解决思路有两条路。一是改用四线制RTD从物理上消除引线电阻的影响。二是针对三线制做软件校准在系统校准时把RTD替换成已知精度电阻测出一组修正系数后续每个读数乘以这个系数即可。这个方法我试下来效果不错常温下能把零点几欧的引线误差压到很小的量级。真正的系统校准确认必须在恒温槽里做。把RTD探头放进恒温槽设定几个温度点记录ADC读数对应的温度拟合出偏移曲线。校准后的系统在0到100℃区间内整体误差能做到0.2℃以内这对HVAC场合已经相当理想了。5.4 低功耗模式下的唤醒时序记录仪类产品通常会使用单次转换模式。ADS122U04完成转换后会自动进入低功耗待机但它的UART模块是否保持监听取决于具体的配置。实测时我发现一个坑进入单次转换睡眠前如果把UART也一起关掉那主机后续发RDATA命令就完全收不到响应。解决方案是让UART始终在接收使能状态而ADC在空闲时进入低功耗。具体实现时要注意ADC的START命令和唤醒命令通过同一根UART线发送时序上必须先唤醒再发命令。我习惯的做法是检测到DRDY低脉冲之后延时1ms再发RDATA确保ADC内部的转换结果寄存器已经稳定锁存。5.5 常见问题速查表下面把上述问题整理成一个快速排查表方便现场调试时对照。现象可能原因排查方法解决措施通信一直超时TX/RX接反、波特率不匹配示波器看UART波形交换TX/RX重新计算SPBRG读数固定为0xFFFFFF转换未完成即读数据检查DRDY时序改为DRDY下降沿触发读取读数缓慢升高RTD自热查看激励电流设置降低IDAC电流改善散热读数随温度漂移参考电阻温漂用精密电阻替换选用低温度系数参考电阻长线时读数偏大引线电阻不平衡短接传感器测量线阻三线制软件校准或改四线制低功耗唤醒失败UART被关闭检查寄存器设置保持UART监听只关ADC转换6. 实测心得这套方案到底怎么样项目做到最后阶段我拿了一块自己画的测试板做了一轮完整的评估。测试条件是环境温度25℃用恒温槽把RTD探头从0℃逐步升到120℃记录系统的显示温度和恒温槽的标准仪表读数比较。整个测试下来全量程最大误差出现在低温段大约0.15℃中温段基本在0.1℃以内。这个结果对HVAC应用绰绰有余对于工业设备表面测温也足够参考。功耗方面系统待机状态进入低功耗模式后整体电流大约能压到很低的水平。如果是电池供电的数据记录仪配合5到10秒的采样周期续航可以做到一年以上这对现场部署来说非常有说服力。再分享一个硬件布局上的小技巧。ADS122U04对模拟输入的走线比较敏感把传感器过来的两根差分线等长、并行走同时用地线包围能明显减少共模干扰。参考电阻到基准引脚的走线尽量短而粗不要经过过孔再绕一圈回来。这些细节不一定每次都能看出差别但在现场电磁环境糟糕的地方布局规范与否直接决定系统能否稳定运行。如果后续想扩展这套方案比较简单的是增加第二路ADS122U04通过两个不同的UART接口分别连接PIC18F86K90的EUSART1和EUSART2实现多通道温度采集。另外也可以把ADS122U04换成ADS122U04的兄弟型号比如带更多通道的配合同一个PIC MCU就能覆盖多点温度监测的场景。固件层面线性化代码写得好其实可以做成一个小的温度采集库后面换传感器类型时只改配置项不需要动大框架。最后说一句实在话这套方案真正的价值不在于某个单芯片参数有多亮眼而在于信号链端到端的完整性。从传感器激励、信号放大、模数转换到线性化处理每个环节都有厂商方案兜底工程师要做的只是把各个环节正确对接起来。做扎实了它就是一个可靠、低功耗、精度够用的通用温度采集模块放到工业盘柜、HVAC控制箱或者暖通数据采集项目里都能直接落地。