基于FPGA的多路模拟量、数字量采集与处理系统
ADCR寄存器控制A/D采样的通道数的选择以及与A/D采样有关的寄存器的复位控制等,这也是考虑到系统的通用性而设计的:如000C表示采样第11路交流模拟量电压;0011则表示同时采样前六路信号等等。
第二部分为设计产生A/D与CD4051芯片的控制信号。如在图2中,在采样12路交流模拟量的情况下,FPGA需要产生7路控制信号,这7路控制信号应该满足一定的时序要求。图3给出了同时采样前六路信号时FPGA的控制信号时序。
Abcs2[0,1,2]总线信号实际上是多路开关通道选择的3个控制信号selA、selB、selC。需要说明的是,因为要进行修正,在对6路交流信号采样的同时,也对4051的+5V和AGND进行了采样,所以实际上测量的通道数为8路。
从图3可看出,abcs2[0,1,2]总线信号每19.531 25μs加1,每156.25μs重新循环一次,满足8路交流同步采样的要求。
从25μs时刻的局部放大图可以看出,当(23.6μs时刻)4051选择通道1时,ADS774的CS和R/C信号同时为低,延时0.5μs左右CE端出现上升沿(24.1μs),启动A/D转换,这符合ADS774的A/D转换时序。需要指出,如果CE端直接接高电平,那么,R/C的下降沿将直接启动A/D转换。之所以用两个信号来启动A/D转换,是为了减少A/D的误触发。考虑到4051的导通延时,所以在通道切换0,5μs后才启动A/D转换。图3中没有画出4051的INH信号,在采样前6路交流信号时,该信号一直为低。如果同时采样12路信号,那么,abcs2[0,1,2]总线信号每9.765 625μs加1,每78.125μs重新循环1次;INH信号每78.125μs电平变化1次,用来选择哪个4051导通。
第三部分为A/D输入数据缓冲区和数字滤波模块。A/D转换完成后,ADS774的引脚STS给FPGA输出转换完成信号(低电平)。FPGA接收这一信号后,将产生读ADS774的时序,把12位的A/D转换数据读入到数据缓冲区的二维数组datain(abcv)(sampn)中。Abcv为通道号,sampn表示周波信号中所采样的第几个点。将一个周期的12路信号采样完后,置标志ADFLAG为1,进行数据的滤波处理。首先,对datain(abcv)(sampn)的值进行修正;给定sampn,对前6路信号来说,datain(7)(sampn)存储的是AGND的A/D转换值,将datain(i)(sampn)减去datain(7)(sampn)的值存储在datamid(i)(sampn)中(i=1,…,6)。与此类似,后六路的采样值datain(i)(sampn)减去datain(15)(sampn)的值存储在datamid(i)(sampn)(i=8,…,14)。然后,给定abcv,对datamid(abcv)(j)(j=0,…,15)这16个点的数据进行FIR滤波,将FIR滤波后的数据存储在datamd(abcv)(sampn)数组中。
第四部分是均方根有效值计量和FFT谐波分析模块。输入的数据经过处理后,首先进行均方根有效值的计算。给定abcv,先求出datamd(abcv)(j)(j=0,…,15)这16个点的平方和,将其存储到datarsult(abcv)中。为了防止溢出,dataresult(abcv)定义28位的位矢量。然后把dataresult(abcv)中的数据进行平方的运算,结果存储在douts(i)中。开平方是利用函数sqt(a:std_logic_vector;b:integer)return std_logic_vector来实现的。a为要开方的全矢量数据;整数b用来定义输出位矢量的长度。该函数被封装成一个包(package),符合自顶向下(TopDown)的HDL语言设计思想。douts(i)是信号量,由赋值语句douts(i)<=sqt(dataresult (i);16)(i=0,…,15)可以分别求出12路信号的有效值。电压有效值和谐波分析完成以后,清ADFLAG为0。
第五部分为输出缓冲器单元。当DSP对FPGA产生读时序(FPGACS为低电平且RD下降沿来到时),FPGA根据DSP的低五位地址线A0~A4的值(对应于FPGA的chansel:std_logic_vector(4 downto 0)信号量),以及ADOR寄存器中的值,将相应的数据送到数据总线上。比如,若chansel为(00010)2,ADOR中的值为FFFFH,那么,FPGA就会将通道2的有效值douts(2送到数据总线上。
图3 FPGA的A/D控制信号时序图
3 对数字量的控制与管理
在图2系统中,假定要对16个负载进行管理,每个负载包括1个控制输出量和2个状态返回量,因此共有16路的数字量输出,32路的数字量输入。
FPGA对数字量的管理软件结构:
FPGA对数字量的控制管理也设置了三个16位的指令寄存器组。这三个指令寄存器的内部地址为03H、04H和05H.03H为开关量输出允许寄存器(KGER);04H为跳闸闭合寄存器(KGCR);05H为开关量开闭寄存器(KGIR)。
来自负载的总共32个状态反馈信号(DIN00、DIN01……DIN31)分成16组,分别接到FPGA的16个信号量dini上(i=1,2,…,15)。dini是长度为2的位矢量std_logic_vector(1 downto 0),分别对应于1个负载的两个状态反馈位。FPGA用16个进程process(din1)、process(din1)……process(din15)来对输入数字量敏感。当dini的载位电平发生变化时,进程启动,FPGA结合MCU发送的控制指令,判断负载的状态,并记录在输出数据缓冲区中。输出数据缓冲区包括16个数据存储器,这16个数据存储器在FPGA内部的