2018电赛程序实现---电流信号检测装置
把程序主要分为三个部分,第一个部分是vga显示,第二个部分是ad7106的驱动程序,第三个部分是fft程序
vga显示
vga显示这部分是我队友写的,主要功能显示输入信号的频谱和正弦信号的频率,非正弦信号的谐波幅值,其实这个频谱是经过处理之后显示的,如果输入的是单一频率的正弦波,那么只显示一根谱线,假设输入的是谐波,那么只显示谐波对应频率下的谱线,本来是想把所有的频谱给显示出来的,但是由于vga分辨率是1440X900,fft变化点数是8000个点,屏幕分辨率不够,所以当时没有全部显示,显示效果下图所示:
AD7606驱动
我们一开始采用的是ads828这个10bit70M采样率,但是这款ad有两个问题,测量10mv的信号时准确度低,原因在于利用的有效位少了,这个当时我们想了两种解决思路,第一种是100MA1A的电流直接经过ad处理,10ma100ma的电流先经过放大,然后再经过ad处理,这样ad的有效数据位就利用了起来。第二种方案是采用精度更高的ad,我们最后是采用的第二种思路。另一个是这个ad828在硬件设计是加入了运算放大器,导致他的输入电压和输出值并不是线性关系,不过这个可以通过软件补偿进行弥补,先测试100组数据,然后再通过线性拟合补偿。
ad7606采用的是spi接口,当时是老师帮我们从网上下载了一份verilog程序,结果还挺好用的,节省了大量的调试时间。
FFT
fft分为采样速率模块控制采样率,fifo控制不同的时钟域,fft出来的数据进行转换,最后利用转换出来的数据进行测频率和幅值。
ip核使用注意事项
- ad输入进来的数据并不是实际电压值,如果要转换成幅度,需要将ad的数据量化成电压值。
- 关于缩放因子:缩放因子最高位是1则将数据向左移动相应的位数,否则向右移动相应的位数。
- 缩放完数据 x N/2是原始数据的幅值。
- ad产生的数据如果有直流分量要减去直流分量。
- fft在matlab仿真中采整数个周期出来的结果才正确,但是在实际工程中,采整数个周期对采样率要求比较严格,实际上只要采样的周期数量足够多的话,就算不是整数个周期,最终的误差影响很小。
- fft出来的结果不要最后一个点。
采样率
一开始我们是采用的4K采样率和4K个点,这样频率分辨率1Hz,但是经过我们后期分析,频率分辨率是0.5hz,所以后来又把变化点数提高到8k个点,根据F = Fs / N频率分辨率就变成了0.5hz。
4k的采样率一开始是直接在ad驱动程序里设置成1/4k的延时,但是这样不准,ad信号出来时都会有一个busy信号的等待,因为这个时间不固定,所以实际出来的频率小于4khz,这样也会导致fft变换完数据的不准确。一开始,fft出来的结果,当频率变高时,幅值误差很大,我当时以为是采样率太低了,最高被测信号是1khz,4k采1khz,一个周期才测四个点,其实4k的采样率也能满足要求,因为我们变化的8K个点,已经可以恢复出原始信号。由于测试的产生的幅值数据不准,老师给我们提供了一个思路,先把ad7606提高到最高采样率200khz,先对被测数据进行过采样,然后用4k采用率进行抽取进行fft变化,如果大于频率大于800hz采用时域求幅值的方法,频率小于则采用频率测量的方法。当我采用过采样然后抽取的方法时,误打误撞,非常惊喜的发现求出来的数据全部都符合题目要求的精度。
FIFO控制
fft变化的时钟是50Mhz,采样时钟是4k,所以中间采样了一个异步fifo进行缓冲。
FFT控制
fft里的数据都是有符号位,当时有效数据标志位开始时,对实部和虚部平方相加然后求根,然后通过缩放因子进行移位,对数据除N/2之后,ad数据转化之后就是实际的电压值。
测频
fft设置的是8k个点,因为频谱是对称的,所以只测前4000个点即可。所测的频率的在谱上的幅值最大,所以进行比较大小,即可求出被测信号中能量最大的信号。
电赛学到的知识
- 用excel统计大量数据,使用公式行计算求误差,进行拟合。
- 学会了之前fft没有搞懂的地方,也就是ad转换数据部分。
经验总结
- 题目下来几天后,也不知道自己在忙啥,感觉最题目还是理解的不到位,最后还是经过老师带着分析之后才搞懂的,搞懂题目才可以做题,要不然理解错了,做的都是无用功。
- 从网上传出一份评分表,但是老师不一定完全按照评分表来评测数据。
- 好几个组做一道题目,方案不要完全一样,起码显示可以改一下,一个用vga,另一个用led显示屏或者数码管。否则老师可能会压你分数。
- 如果对评测要求不确定,可以准备两套方案,通过按键调整。