最近在调试板子的时候,ADC采集出现了问题。一开始并不能确定是软件问题还是硬件问题(在做的功能是将ADC的数据采集,使用fifo进行储存,再通过串口传输)
串口传输的结果如下图所示
串口传输的结果是10位ADC采集后补零,通过两次串口发送得到的结果。图中大部分为“02 02”,“02 03”转换为10进制就是514,515左右,如果用图形显示的话,就是一个直流信号。
并且,不管如何改变信号发生器的输出,得到的结果都是一样的。
直到去学习了quartus的signal tap功能,得到如下结果
这就很奇怪了,后来用示波器测量,得到信号发生器到ADC输入引脚都没有问题。
观察ADC原理图部分,使用的ADC芯片为AD9215。设计时,只将数据位D0-D9,ADC_CLK,PDWN与FPGA连接并控制,ADC的参考电压由内部提供为1V。将这些引脚再一一检查,没有发现问题。直到看到输入端的这个东西(以下仅为示意图):
这四个电阻,是师兄设计的类似于跳线帽的功能。目的是:当输入信号是正信号时,直接将信号输入进VIN+,参考电压ADC1_REF接入VIN-,最后采集得到的为正信号;而当输入信号为负信号时(比如核脉冲信号),则将信号输入进VIN-,参考电压ADC1_REF接入VIN+。只是跳线帽用0Ω电阻进行功能的实现,但是在给SMT封装时,这四个电阻在硬件上全部连接,也就是说,每条电路都是通的。
下面我们再来看一下得到的数据,绝大部分都是512,这其实是一个比较敏感的数字。已知ADC是10位的,即最大能输出的数字为1024,512与1024是什么关系?是一半的关系!
再回到原理图上,当四个0Ω电阻全部焊接上,可视为所有部分都是导线,等效图即为下图
也就是说,参考电压不仅连接到了VIN-,同时还与VIN+与信号输入连接,则不管输入怎么变化,都会被ADC1_REF钳位到1V,得到的也就是1V的直流信号,则VIN+与VIN-的差值为0。当ADC在双极性输入模式下,ADC的输入范围通常覆盖 正负对称电压。此时,输入差值为 0V 时对应输出值的中间点:512。
为什么双极性输入,VIN+ = VIN-,得到就是中间值呢?下面举一个例子:
双极性输入模式就像一个天枰:
- 左侧托盘(VIN+):代表ADC的正输入端
- 右侧托盘(VIN-):代表ADC的负输入端
当两侧放上 相同重量 时,天平指针指向正中间(即差值0V)。此时双极性ADC的输出值就是中间点(如10位的512)
将硬件上的R185与R186取下后,ADC采集正常,问题解决。
经验总结:
①测试ADC最关键的一点,应该首先判断ADC的输入引脚是否正常!本次测试时,由于前端只有一些简单的电阻电容,没有运放加入,就理所当然认为信号输入引脚正确从而ADC的输入引脚也正确,从而花费了大量时间检查其他电路!如果首先测ADC的输入引脚,那会很快找到原因。
②不管是quartus的signal tap还是vivado的ILA,这种在线调试助手都必须学会并灵活使用,否则出问题了根本无法判断是在哪一步出错的。
2930

被折叠的 条评论
为什么被折叠?



