本次与大家分享的是世健和ADI联合举办的《世健·ADI工业趴:放飞思路,解封你的超能力》主题活动的一等奖文章:《LTC2991在严苛环境电源控制领域的应用与问题分享》。
作者: qinyunti
01
前言
1.1 背景
在各类工业控制等应用领域,ADC模拟量采集是重要的一环,尤其是严苛环境下的ADC采集非常重要。一般模拟量采集与应用涉及信号采集-信号处理-执行决策等几个方面。
在本人参与的某个项目中,就涉及模拟量的采集与应用。信号采集是整个系统的基本保障,只有可靠、稳定、准确的采集信号,才能为后续模块提供正确的输入信息,才能执行后续正确的信号处理,执行决策过程。本文在此分享LTC2991在严苛环境电源控制领域的案例。
在该系统中信号采集主要包括模拟量、数字量、其他通讯协议的信息量等。其中某些应用模拟量甚至几乎占了整个输入的90%。而模拟量采集,全部使用了LTC2991进行,包括温度、电压、电流等信号的采集。每个电源管理单元,都需要采集几十路模拟信号,整个系统使用了二十多片LTC2991采集了100多路模拟信号。
如此重要的信号采集部分,得益于LTC2991本身的性能和可靠性,和我们系统平台的可靠性设计,虽然过程有一些问题,但是都解决了,最终结果是完美的。
可以说LTC2991可靠的、高精度的信号采集为整个能源管理系统的可靠运行打下了重要的基础,而能源管理系统是整个系统的生命保障系统,所以LTC2991也可以说是重中之重,为整个系统的可靠运行立下了汗马功劳。
所以本文也分享下该过程,尤其是LTC2991在严苛环境平台上的应用,以及其亮眼的表现。当然也分享发现的问题和解决的过程。
1.2 LTC2991简介
LTC2991是一款8通道,用于电压,电流,温度测量等应用场景的ADC芯片,具备以下特征:
• 测量四个远程二极管温度
• 0.7℃(典型)精度,0.06°C分辨率
• 1℃(类型)内部温度传感器
• 无需串联电阻
• 14位ADC测量电压/电流
• PWM温度输出
• 3V至5.5V电源工作电压
• 八个可选地址
• 内部10ppm/℃参考电压
• V1至V8输入ESD额定为6kV HBM
• 16-Lead MSOP封装
• 适用于亚毫伏电压分辨率、1%电流测量和1℃温度精度或三者任意组合的系统
• 支持单端和差分输入
• IIC接口,8个可配地址,可以一个IIC接口挂多个LTC2991.
• LTC2991I工业级工作温度范围–40°C to 85°C
从上可以看出,LTC2991具备高温度稳定性,和静电防护能力,这都是高可靠性的保证。同时精度性能也非常好。
典型应用图和PIN如下,更详细的参数和应用可以参考手册。
02
LTC2991在严苛环境领域的应用
在我们的系统中,LTC2991主要用于电压,电流,温度等模拟量信号的采集。
使用了多片LTC2991,配置为不同的地址,使用单端模式。
得益于LTC2991的高集成度,外围器件电路也比较简单,模拟前端使用电压跟随器做阻抗匹配,然后单端接入LTC2991进行采集即可,ADDR配置为不同的地址,一条IIC总线最多可接8片LTC2991,电源增加一个滤波电容即可。
简单的电路,节省了BOM成本,遵循“简单即是美”的设计哲学,少的器件,少的电路,相对的也减少了出问题的可能性。我们可以使用低成本的冗余来提高可靠性,来替代复杂的设计实现的高可靠性,这也是选用LTC2991等经过验证可靠的器件的原因。其典型应用原理图参考上图和手册说明。
03
应用中问题与解决过程分享
LTC2991的操作很简单,就是通过IIC接口,配置寄存器,读寄存器值。但是在严苛环境应用领域不仅仅是功能正确即可,更重要的是高可靠性。所以我们进行了大量的环境试验,性能测试,压力测试等。当然这个过程是持久的,也不是完全没有问题的,本文主要篇幅其实也希望是在这一部分,即问题的发现与解决上,只有发现每一个可能存在问题的点才能保证可靠性。
分享一个问题比不分享问题更具备价值,告诉别人怎么避免一个坑,比告诉别人怎么做无问题更重要。这也是本文分享的一个重要意义。
以下就是偶尔出现采集错误的问题的整个处理过程的分享。
3.1 现象与初步分析
某块板的LT2991的某些通道采集偶尔出现异常值。高低温测试时数据统计如下现象:
在高低温的几天,对测试数据进行分析,统计出了错误信息,错误值总共出现了12次,其中11次是在输入电压,1次是预留的电流采集。分别对应是地址为0x90 的LTC2991第1路采集,以及地址为0x90的L2991第1路采集(本次的程序是一次性采集8路值)。该两路都无输入正确值应该是0。
对数据进行统计分析,可以看出,出现问题不限定于某一块芯片,但是出现问题的都是第一路。(对于随机问题,大量的统计数进行分析,寻找规律是一个通常的定位方法,后续也会验证该现象,该现象也会成为问题的佐证)。
另外,在之前其他板测试时现象与上述现象一致,但是出现问题的不都是第一路,也有其他路的。
但是之前的程序是一次读取1路值,与本次程序一次读取8路值不一样(该不同操作方式导致的不同现象也会成为问题的佐证)。
这里的不同作为后面详细分析的一个线索,后续详细描述(见3.1)。
3.2 问题复现分析
3.2.1 问题初步分析
从现象倒推,考虑了几种可能存在的原因(考虑传递路径:源错误-处理错误-中间传输过程错误)。画出错误路径鱼骨图倒推,怀疑到以下路径:
1. IIC通讯问题,通讯错误导致采集错误。
2. ADC对应通道电压本身存在干扰,所以采集的是干扰异常值。
3. LTC2991本身的某些原因输出异常值。
对于1和2可以通过逻辑分析仪和示波器抓取信号进行直接验证,对于3不能直接验证,我们通过一些其他线索和信息进行交叉验证。
从现象倒推原因是分析问题的通常思路,原理上存在的可能都不能放过,都需要去验证排除。错误鱼骨图原理分析也是常用的方法。
3.2.2 设计测试环境
有了初步的分析和怀疑,如何设计验证测试环境是重要的一环,如何设计软件、硬件,去发现错误、捕获错误、记录错误、加快错误出现的概率等等都是重要考虑点。我们从软硬件两个角度去考虑。
3.2.2.1硬件测试环境设计
对于3.2.1提到的1.和2.可以通过示波器和逻辑分析仪进行直接的验证。
对于1) 使用示波器直接监控对应的电压采集点(即一.现象中,分压点输入电压),为了保证能直接和LTC2991的采集值对比,所以直接监控了LTC2991芯片对应的引脚,同时也监控了前段分压之前的电压点。
对于2)用逻辑分析仪监控IIC的SCL和SDA。为了排除线上传输的问题(因为中间有缓冲芯片),我们将LT2991芯片引脚端和控制芯片引脚端的SCL SDA都引出。
对于3)没有直接验证手段只能通过其他信息分析,后面再详叙。
3.2.2.2软件测试环境设计
方式1:按照正常运行程序,一次读取一个芯片的8路,循环采集4个芯片,遇到异常值时停止打印,这样逻辑分析仪最后监控到的数据就是异常时的IIC数据。采集间隔约200mS。
打印如下(第一列为运行时间,grp[x]代表第x块芯片,后面是8个通道数据,每个通道2字节):
逻辑分析仪监控如下:
方式2:只采集出错较多的分压点输入电压对应的芯片,也是一次读取8路。打印如下:采集间隔约1.75mS。
逻辑分析仪记录如下:
3.2.3 测试分析过程
根据前面的测试环境设计分别验证。
3.2.3.1 确认信号质量
示波器查看IIC和电压监控点波形正常。
IIC波形
电压监控点 0V
逻辑分析仪记录IIC总线数据正常。控制芯片端和LT2991端时序一样,说明中间电路没影响,正常。
控制芯片和LT2991端IIC数据 时序一致无相位差
3.2.3.2 排除ADC对应通道电压本身存在干扰的问题
测试过程:用示波器对分压点输入电压对应LT2991芯片引脚端进行监控。设置上升沿约100mV触发。
实际采集到异常值,打印停止时,示波器并没有触发。说明采集到异常值时对应通道电压本身没有干扰,可以排除该问题。平常用示波器监控也没发现波形有异常,但是偶尔会出现异常干扰(见后面附图)该现象与本次问题无关需要硬件去分析是否有问题)。
在监控过程中有出现示波器触发的情况,但是此时采集没有异常。波形如下:
另外发现在设备所在实验桌附近的插座插拔设备,开关插排都有干扰,如下:
3.2.3.3 排除IIC通讯问题
总共测试了两天,抓取到了5次异常采样值。
每一次的打印值和逻辑分析仪的记录值都是一样的说明,控制器和LT2991的通讯本身没问题。总线上的数据和控制器采集的确实是一样的,异常值确实就是LT2991输出的值。
如下是五次中的一次采集到异常时的记录(另外四次也是一样控制器采集值和逻辑分析仪一致)。
(控制器采集值 80 ff 80 2e ff ff ff ff ff ff 80 08 ff ff ff ff)
(逻辑分析仪记录值80 ff 80 2e ff ff ff ff ff ff 80 08 ff ff ff ff (注逻辑分析最后一个字节显示R实际手动解析也是0xFF)
另外从软件上考虑,由于此时是读数据,SDA为读状态,所以也不可能对总线产生干扰,另一方面LTC2991的采集是在一个线程运行不存在其他地方操作该引脚,资源也严格检查不存在引脚误操作的情况。
综上异常值只可能是LTC2991确实输出的值就是这个异常值。
3.2.3.3 分析LTC2991为什么会输出异常值
根据前面的五次测试记录(每一次都是2h内出现),统计如下:
注: 采样值为16位,bit15=1表示数据有效否则表示数据无效。bit14表示符号位,实际上bit0-bit14即补码形式数值。由于没有接外部输入,所以采样值应该为0。即80 00(0),ff fe(-2) ff ff(-1)都是有效的(实际采样会在0左右波动)。
而ff 00(-255) 80 ff(255) 80 fe(254)是异常值,而7f ff bit15=0为无效值。
根据以上异常值反推是否和记录对应:
-255 255 254(程序中负数会转为正数处理),即按照255计算。
根据程序中的换算公式:
预留的采集电流:255*0.778-15=183.39/20 + 0.5 取整=9
由于递减放大了20倍所以显示20*9=180
分压点输入电压:255*6.7984=1733.592 /200 + 0.5取整=9
由于递减放大了200倍所以显示20*9=1800
上述和一.现象看到的数据是对应的。
从以上可以总结几点规律:
1.间隔时间长200mS间隔采样时,基本无无效数据,间隔时间长1.75mS采样时,无效数据变多,这可能和LTC2991的转换时间和读间隔有关,根据LTC2991手册描述,转换时间约1.5mS 最大1.8mS。
2. 在1.75mS间隔采集时,异常值前都是无效值,而200mS采集无异常值。
3. 异常值不是随机值,而是有效值的高低字节的组合。
通过上面整理分析猜测如下:
对第五次异常值进行分析,上一次读取到的是无效值7f ff。本次读到的是异常值80 fe。
猜测:7f ff读到无效值时应该是LTC2991正在更新数据ff fe,由于这个冲突所以返回了无效值7f ff。
而下一次新的数据0x8000 正好在更新时,又进行了读,但是本次是在更新高字节0x80后锁定数据,没有返回无效值,而是返回了本次的高字节和上一次的低字节.0x80 fe。
第一次到第4次异常值也可以按照该猜测合理解释。
按照手册描述,在读操作时,LTC2991会锁定数据寄存器,直到读完成。并且高低字节是同步同时更新的。对于具体什么时候锁定数据寄存器,比如是接收到读命令后的第一个CLK边沿,还是要等下一个字节(比如我们猜测的,下一个字节后锁定),手册没有描述,不得而知。什么时候会返回无效值手册也没有描述,但是从上述记录读周期和更新周期差不多时,也就是读时正在更新数据可能出现概率很大。
另外对于高低字节同时更新,我们根据实际的测试怀疑也可能并不是的,这些都是猜测,但是从测试现象和后面的修改验证都能很好的解释这个猜测。
根据上述分析,猜测出现异常的情况如下:
3.3 现象与实际测试的相互印证
3.3.1 连续读8路时,为什么只有第一路出现问题;而每次读一路时,其他路也有问题
根据2.3.3的分析,一次读8通道时问题只会出现在读命令后的第一个数据,因为锁定延迟最多只会出现一个字节,读完第一个通道后,后面的通道数据寄存器肯定已经完成了锁定。
而每次读一路时,每次都是一次新的读,每一次都是读命令后的第一个数据,所以都有可能出现。
3.3.2 为什么没接输入源时有异常值,而接入输入源的没有发现有异常值
根据前面的测试,我们发现有异常值的都是实际没接输入源的,也就是理论上应该是0的。
由于输入为0,实际采集值在0附近可能是-1(ff ff)也可能是0 (80 00),如果上一次是ffff本次是8000,按照上述分析的异常,读取到本次的高字节80。上次的低字节ff就是80ff(255)。这种概率是比较高的,因为0的左右差1都是突变。
255和正常值0就差别比较大一眼就能发现了。
如果接了输入源,那么就会是一个离0比较远的正数,那么获取的本次的高字节和上次的低字节组合成突变的值概率会小一些(但是也会存在比如01ff和0200这种在低字节进位的情况下,组合可能是0100或02ff也会差255)。但是较0的左右,0不管左或者右都容易突变,正数只在低字节为0xff左右会突变,概率小很多。并且采样值的抖动一般都只有几个数值。
所以只有在值的低字节接近0xFF时才容易突变,比如0xfe,0x00等在0xff左右变化。概率会小很多。
另一方面实际也没具体去统计其他有输入源的数据的异常值,因为相对于0值的异常不是一眼就能看到,只是初略看遥测数据没有看到明显异常值。
所以这个现象其实也和猜测相符。
3.3.3 为什么每次值都是1800 或180
根据2.3.3的分析和实际计算,显示值1800和180实际对应的LTC2991的采样值就是255左右。
而对于实际无输入0v的正常值为0左右,比如ff ff(-1) 和08 00(0),如果按照前一次值和本次值的高低字节取,出现的错误值就是ff 00 (-255)或者80 ff(255)由于程序取了绝对值所以都是255所有,换算就是180(放大20倍)或1800(放大200倍)了。实际我们统计的也都是实际值是0值的异常值,根据3.2的分析,异常突变就是255左右所以换算出来就是1800或者180。
3.3.4 为什么间隔200mS采集没有无效值,间隔1.75mS 无效值较多
因为LTC2991转换时间约为1.5mS,而间隔1.75mS去读,很可能读的时候LTC2991正在更新新的数据。由于LTC2991转换周期和读间隔周期差不多,碰上的概率就会大很多。而间隔200mS去读这种概率会小很多。
无效数据的出现和LTC2991正在更新数据时单片机去读数据有无关系,手册上没有明确说明,但是从测试各方看应该是有关系的,比如四.修改后的验证应该也能说明有这种关联。
3.4 修改验证
根据2.3.3的分析,如果修改读的逻辑,即在第一个通道数据前多读几个字节,让LTC2991在读第一个通道数据前就确保锁定数据寄存器,那么就可以避免该问题。
如下图所示,在8通道数据前读其他字节,这样LTC2991在接收到读命令0x91之后一个字节就会完成锁定,后面读8通道数据时肯定是锁定的数据。避免了读数据时数据寄存器正在更新导致读错的问题。
连续测试两次,一次连续运行5小时,一次连续运行了40多个小时均无错误,按照之前的五次测试,都是2个小时内就出现了错误:可以确定问题得到解决。
修改后同时也发现没有了无效值,说明无效值的出现应该与读数据时正在更新数据有关或者跟锁存数据逻辑有关,与之前的现象印证。
3.5 总结与结论
1.对比逻辑分析仪抓取到的实际数据与采集到的数据,完全一致;抓取到的实际数据换算后与看到的值一致,说明问题得到复现,并且和LTC2991的IIC通讯无问题。通过示波器确认异常值也不是由于电压有干扰导致的。
2. 根据前面的分析,猜测很大概率是读数据时LTC2991的数据寄存器高低字节锁定逻辑有缺陷导致的,即存在读数据时读到本次结果的高字节和上次结果的低字节的情况,导致值异常。
3.针对2.的原因,修改采集方法(一次性读出所有寄存器,使得读数据寄存器之前有足够时间锁定数据寄存器),修改后通过长时间验证(连续运行40h以上),问题没有再现(修改前每次都是2h就出现问题),可以确认问题得到解决。
04
总结
对于严苛环境领域应用,对问题要零容忍的,必须解决所有的问题,并且是找到根本原因彻底解决,而不是消除现象,所以本文重点放在了解决问题上。而前面的应用实际不涉及太复杂的技术,一切用结果说话,从上述应用结果来说,LTC2991展现了其性能和可靠性,这也是ADI在模拟领域绝对的权威的展现。
1. LTC2991完全满足在严苛环境应用平台上的可靠应用,通过上述案例已经得到了非常好的验证。
2. LTC2991的除了上述分享的问题外,没有发现其他问题,瑕不掩瑜,确定问题原因后可以简单的方式避免,同时知道了原理也可以比较放心的使用了。
全部0条评论
快来发表一下你的评论吧 !