FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现
- 原因
- ADS111x连续采样实现
- 连续采样功能说明
- iic读取adc的数据速率 VS adc连续采样的速率
- adc连续采样的速率
- iic读取adc的数据速率
- 结论分析
- FPGA读取adc数据
- 问题一:读取adc数据过快造成数据多余
- 问题二:fpga没有那么多空间存储取回来的全部数据
原因
每次调用iic驱动的时间间隔太长了,adc连续采样的速率高且没有多的寄存器缓存数据,所以用户得及时取数据,否则就会产生数据丢失;于是就需要一个快速的取数据方式,而fpga的时间以8ns为单位,它可以做到快速取数据;但是用户没法这么快的从fpga那边取数据,于是就需要用DMA,给fpga存放数据,最后用户再从DMA中取数据。
下面将来介绍一个实际的案例详细说明。
ADS111x连续采样实现
连续采样功能说明
主要获取信息:
- 在连续转化模式中,ADC 一旦上一个转化完成了 就会自动开始下一个转化;
- 连续转化的速率 等于 编程的数据速率;数据能在任意时刻被读取 并且 数据总是对应着最近完成的转化(也就是数据会不断得刷新成新的)
- 编程(可理解为设置)的数据速率。下图就是ads111x可编程(可理解为设置)的数据速率:
- 编程(可理解为设置)的数据速率。下图就是ads111x可编程(可理解为设置)的数据速率:
结论:
所以就是我们要实现连续采样(即及时得把adc每次转化的数据取出来)的话,我们读取adc的数据速率 就得跟得上 adc连续采样的速率,这样才不会丢失adc转换的数据。
iic读取adc的数据速率 VS adc连续采样的速率
adc连续采样的速率
从上图可以看到最高的转化速率是860SPS(即每秒钟采集860个电压点),转换电压间隔是 1s / 860个 * 1000ms/s= 1.16279ms/个
iic读取adc的数据速率
根据试验,两次iic通讯操作间隔时间是3ms左右;意味着iic取数据的速率大概 3ms/个。
结论分析
-
用iic去取数据的速率时 3ms/s (间隔3ms才取1个数据),ads 在860SPS的转换速率下 3ms / 1.16279ms/个 = 2.58个,这样子的话每次都会丢1.58个数据,即用iic取数据的话,流失数据率是 1.58 / 2.58 = 61.2%。
-
假如在860SPS速率下,每秒860个,iic成功获取只有 860 * (1- 0.612) = 333.68 个,将近流失了 2/3 的数据点
-
所以得用一种跟得上860sps 速率的取数据方式:FPGA
FPGA读取adc数据
fpga读取数据的速率可以高于adc的连续采样速率。
问题一:读取adc数据过快造成数据多余
但是取数据的速度太快的话也会出现问题:同一个数据会被多次获取,造成数据错误多余
解决方案
就是在取数据的速率 高于 adc转换速率时,FPGA并不是一直取数据,而是当得知adc每次转换完成后,fpga再去取数据
如何得知adc转换完成了呢?adc正好有这个功能
- 就是adc可以配置功能:使得一个特定的芯片引脚 空闲时得外部接上拉电阻进行上拉,每当adc转换时会拉低这个引脚,转换完成会释放(就会有一个上升沿,检测这个上升沿就可以知道adc转换完成)引脚。
- FPGA只要检测adc的这个引脚(相当于触发中断) 得知转换完成后 进行 取数据就好了
问题二:fpga没有那么多空间存储取回来的全部数据
开辟内存空间,FPGA就把取回来的数据存放在dma当中,通过dma存放到内存空间,最后用户再从内存空间中获取全部数据即可。