我根据ads8861手册中给的参考电路来进行数据采样,ths4521的输入分别为一个2.5V参考源和输入信号(0-5V范围),OCM为2.5V。后面接ads8861采样。可以读取到信号。但是当输入信号为2.5V时,也就是和参考源相同时,会读取到的数据中会出现毛刺,如下图,拉开来看这个毛刺其实就只有一个点。如果输入信号比2.5V高1mv,就不会发生这种情况。而且奇怪的是这个毛刺不管是向上还是向下的高度都是固定的。请教下这个问题怎么解决,谢谢!
user151383853:
很奇怪的现象
我找了手册的相关部分, 没有见到这个问题的描述或相关的原因.
如果是数据溢出, 那么后面的数据也应该是连续的, 不会就出现这一点
John11513:
纵轴单位是什么?显示的数据是处理过的还是原始数据?
Zhen Gu:
回复 John11513:
纵坐标是把补码转换成源码,然后又根据参考电压转换为绝对值的数据,数据转换是没问题的,和用示波器测量的结果匹配的上。
而且用示波器测了输入的信号,是没有这个毛刺的
Zhen Gu:
回复 user151383853:
有段时间以为是前面模拟电路的问题,后来用示波器测试后发现,到AINP和AINM输入的地方都是没有毛刺的。
数据采样是用的FPGA,通过usb传到电脑上再进行转换。转换过程应该也没有问题,我是把16位的数据拆成2个byte通过usb传上来,再在C#里面用一个union拼合,再转成数据。现在只有0点处会有这个问题,而且发现这个毛刺都是40 mV 左右的一个数,参考电压是5V。
下面是用C#写的数据转换的代码,
public struct short_u { public byte u_low; public byte u_high;}[StructLayout(LayoutKind.Explicit)]public struct Short2Bytes { [FieldOffset(0)] public short_u su; [FieldOffset(0)] public short value; [FieldOffset(0)] public ushort uvalue; }
Short2Bytes tempBytes;private float MakeData(byte high, byte low){ tempBytes.su.u_high = high; tempBytes.su.u_low = low; float tmp = (tempBytes.uvalue > 0x7fff) ? (0xffff – tempBytes.uvalue) : (-tempBytes.uvalue); return ((-tmp + 32768) / 65536 * 10000 – 5000);}
Zhen Gu:
回复 user151383853:
我研究了一下传到电脑的数据,向上和向下的尖刺分别是0x00ff和0xff00,感觉是采样的问题了,
fpga的程序应该是没有问题的,采集其他数值的数据都完全没有毛刺
考虑到0x0000和0xffff都是在0点的,难道是芯片的bug?
John11513:
回复 Zhen Gu:
到目前为止,还没发现芯片有bug。下图是我用评估板在输入不接信号(相当于短路)时,连续采集65536个点的波形图。可以看到,数据只在-6到-4间跳动。
John11513:
回复 John11513:
你可以试试给输入外加一个很小的正电压,看看还有上述现象吗?
Zhen Gu:
回复 John11513:
如果不是在0点,我的板子也不会出现毛刺的现象毛刺的现象只有出现在0点上下1-2个bit的时候短路的话是不是芯片内部也会有个offset的?如果外部给个offset补偿到0点呢?
John11513:
回复 Zhen Gu:
从这一点看,我认为很可能是你软件中做代码转换时出了问题。