数据采集是指将温度、压力、流量、位移等模拟采集转换为数字量,然后由计算机存储、处理、显示或打印的过程。相应的系统称为数据采集系统。随着科学技术的进步,人们对采样频率、分辨率等数据采集的要求也越来越高。基于单片机的数据采集系统数据处理能力相对较低,无法满足某些要求。随着科学技术的不断创新和半导体产业的发展,我们将可编程逻辑器件的技术应用于数据采集系统的研究。同时使用CPLD 强大的数字处理功能和高密度集成的特点降低了硬件成本,简化了电路设计,具有良好的经济和社会效益。由此可见,数据采集系统越来越成熟,应用越来越广泛,发展前景相当广阔[1]。
如今,随着计算机的广泛应用,数据采集的重要性十分明显。它是计算机与外部物理世界连接的桥梁。在工业、工程、生产车间等部门,特别是在信息实时性能要求较高或较差的数据采集环境中,其应用的必要性更加突出。这就要求数据采集系统提供更多的原始数据,必须有更高的采样频率和分辨率。以往的数据采集系统一般以单片机为核心。随着数据采集要求的不断提高,以单片机为核心的数据采集系统已不能满足要求。随着科学技术的进一步发展,高速数据采集系统出现了。随着各种先进武器系统的装备部队 ,也出现了各种各样的问题 ,特别是在各种武器装备的信号检测中,都涉及到数据的收集。本课题要求收集和显示某个武器系统的多个弹出数据,如压力和温度,并要求采样频率1MHz,10位分辨率显示在小数点后[2]。
基于以上,本文设计了一个基础CPLD控制高速AD转换器的数据采集系统。该系统可以大大提高数据采集的速度和精度,满足高速数据采集的要求。
现代数据采集系统具有以下主要特点:
(1)现代采集系统一般由计算机控制,大大提高了数据采集的质量和效率,节省了硬件投资。
(2)软件在数据采集系统中的作用越来越大,这增加了系统设计的灵活性。
(3)数据采集与数据处理的结合越来越紧密,形成了从数据采集、处理到控制的数据采集与处理系统。
(4)数据采集过程一般具有实时的特点实时性是指基于计算机的工业数据采集系统能够在有限的时间内响应外部事件的特性。工业控制计算机和监控管理软件具有时间驱动能力和事件驱动能力,即在一定时间内对所有事件进行检查和扫描时,可以随时响应事件的中断要求。实时要求计算机具备多任务处理能力,将测控任务分解为多个并行执行的任务,加快程序执行速度。变化不明显,即使不及时响应也不会造成影响或损坏事件,作为顺序执行任务,根据一定的检查周期,维护时间短,需要计算机及时响应事件,作为中断请求源或事件触发信号,特别编写处理程序,确保计算机在事件触发时立即响应[3]。
(5)随着电子技术的发展和电路集成度的提高,数据采集系统的体积越来越小,可靠性越来越高,甚至出现了单片数据采集系统。
(6)总线广泛应用于数据采集系统,总线技术在数据采集系统结构的发展中起着重要作用。
(7)数据采集系统的适应性。无论是大规模的生产过程采集系统,还是普通的多路信号采集系统,都可以通过选择合适的智能模块设备来构成相应规模的系统,易于扩展和维护。在计算机、数据采集和控制设备正常运行的情况下,如果电源正常,通信线路畅通,设备状况良好,系统可以长期稳定可靠运行。此外,采集系统和上位机之间的数字信号传输可以克服电磁干扰、差模和共模信号干扰,以适应在恶劣环境下工作[4]。
传统的数据采集系统一般由信号输入部分、信号调节部分、数据采集部分、数据传输部分数据显示部分组成。通过调节电路输入传感器的模拟量 AD 将收集到的数据转换为数字量,然后通过传输通道到单片机进行数据处理,最后显示采样结果。
在这个系统中,单片机作为主控芯片来控制外围芯片和数据采集 AD 转换是由单片机通过软件控制的,这样势必会引起系统的频繁中断,减弱了系统的数据运算能力,使得数据采集的速度降低,单片机本身的缺点制约了整个系统的性能。
本文设计了基于数据采集系统的性能 CPLD 与传统采集系统相比,采用高速数据采集系统 CPLD 该装置作为主控芯片,能轻松实现高速、低成本、易扩展、高可靠性的数据采集,代表了现代数据采集系统的发展趋势。
其中,信号输入部分是传感器传输的各种模拟信号。信号调节部分由放大电路和滤波器电路组成。其主要功能是放大输入信号并过滤其电压AD在采样电压范围内。AD采样部分将输入的模拟信号转换为数字信号。AD采样的电压范围和位数决定了采样的精度。我们选择高速采集数据,以提高系统采集数据的频率AD,这样,以大大提高采集速度。数据采集和传输控制电路的开发主要集中在 CPLD 上,在这个系统中,CPLD 用于控制AD 转换和对 AD 转换后的数据显示span style="color:#000000;">[9]。
2.3.1 信号调理部分
在数据采集系统中,量化误差的引入是不可避免的。量化误差成了评价数据采集系统的一个重要指标。一般来说AD转换器的位数越长则量化噪声越小,精度越高。可是在AD芯片的设计过程中,要想把数据转换分辨率提高一位,则AD转换器中的比较器数量必须增加一倍,其增加的成本可想而知。但是通过对信号调理电路的合理设计,可以减小引入的量化误差,这可以使整个数据采集系统的性能得到进一步的提高[10]。
本系统中调理电路由滤波器电路构成。其主要作用是除去信号中的各种干扰成分,使输入信号的幅值尽可能接近 AD 的输入范围 Vmax,获得尽可能大的信噪比,提高数据采集的精度。
当前的数据采集系统已有很多,有很多基于单片机的成熟的数据采集卡,由于单片机的频率难以做的太高,这使得其构成的系统的采集数据的频率难以提高。所以我们选择CPLD 作为处理 CPU,此外我们选择高速 AD、高速 RAM 来采集数据,这样采集速度就可以大大提高。数据采集电路的实现也有两种方案。方案 1 是用单片机完成数据采集及控制。方案 2 是用可编程逻辑器件 CPLD 来实现。
单片机的速度相对较慢,而当前武器设备电子系统对频率的要求越来越高,如在一些实时的音频,视频处理中频率可达到上百兆,这样的频率对于单片机来说是无能为力的。如果采用单片机来控制 AD 芯片和数据显示,将显著降低整个系统的工作速度。随着微电子技术的发展,CPLD 器件的容量变得越来越大,速度变得越来越快,高端产品的速度已经达到几百兆[11]。采用 CPLD 器件来完成高速 AD 芯片的控制和数据显示,使系统的速度成倍提高。传统的系统除了单片机外还有大量的中小规模集成电路,在高速,强电磁干扰等恶劣条件下,芯片的数量越多,受到干扰的可能性就越大,造成单片机频繁出现程序跑飞,系统复位。采用 CPLD器件可减少系统受干扰的几率,显著提高系统的可靠性。该系统要求进行高速的数据采集,用普通单片机难以实现。所以,我们使用方案 2 实现数据采集电路。
本章主要介绍该系统的电路设计。详细论述了系统各个模块设计方案,包括相关芯片的选择、电路连接、接口设计、电源设计等。
系统框图如图3.1所示:
图3.1 系统框图
AD 转换就是模数转换,顾名思义,就是把模拟信号转换成数字信号。AD 进行数据采集有两个主要过程:采样和量化。采样是指每隔 T 秒所记录的 x(t)的幅值。设 x(t)是模拟信号,将采集到的幅值用 x(kt)表示,其中 k 表示数据序列中的采样位置,k=0,1,…N-1,(N 是数据序列总的采样数)。T 称为采样间隔,采样频率为 1/T(Hz)。
AD 采样时必须满足采样定理。香农采样定理给出了低通型带限信号的最低采样频率,即采样频率 fs 必须大于被测信号最高频率的两倍,即 fs≥2fmax。fs/2 称为纳奎斯特频率(Nyquist frequency)[12]。
采样定理的出发点是从采样数据中能够完全恢复原始信号,可是在实际运用中,将连续的模拟信号转换成离散的数字信号势必会造成一定的失真和误差。特别是当信号中包含频率高于奈奎斯特频率的成分,信号将在直流和恩奎斯特频率之间畸变使得采集的信号失真。为了避免这种现象的发生,采样频率一般取信号最高频率的3-5 倍,有时为了较好地还原波形,甚至会取信号最高频率的 10 倍[13]。
量化就是用有限长度的二进制数来逼近离散的模拟信号。由于量化的结果是把尾数按四舍五入处理,对于有 m 位、输入电压范围是 Vmax的 A/D 转换器,有 0 至 2m-1 共 2m 个等级,每个等级的增量为 δ=Vmax/2m-1,那么,量化的最大误差就是 emax(nT)= ±δ/2。
AD 转换器的位数越长则量化噪声越小,精度越高。在 AD 的位数确定的情况下,应该使输入信号的幅值尽可能接近 AD 的输入范围 Vmax,获得尽可能大的信噪比,提高数据采集的精度。AD 的选择,首先看精度和速度,然后看输出是多少路,输出是怎样的,比如 SPI 或者是并行的,差分或者单端输入,输入范围是多少,这些都是选 择AD 转换器时需要考虑的[14]。
AD976为高速、低功耗、16位模数转换器(ADC),采用5 V单电源供电AD976的吞吐速率为100 ksps。器件均内置一个逐次逼近型开关电容ADC、一个2.5 V内部基准电压源和一个高速并行接口。最大功耗均为100 mW。该ADC经过工厂校准,所有线性误差均被降至最小。模拟满量程输入为±10 V的标准工业范围。信噪比(SNR)和总谐波失真(THD)等交流参数,以及失调、增益和线性度等一般参数均经过全面测试。AD976采用ADI公司专有的BiCMOS工艺制造,兼有高性能双极性器件和CMOS晶体管的优点。提供超小型28引脚DIP、SSOP和SOIC三种封装[15]。
3.1.1 封装及管脚功能
AD976/AD976A的封装如下图所示,为窄28脚DIP形式,两列管脚间距为0.3英寸。
主要管脚功能如图3.2所示:
图3.2 AD976管脚图
(1)电源:2,5,14,27,28脚,分别为数字或模拟地以及电源。模拟地于数字地及模拟5V和数组5V之间,最好通过小磁珠再连接到一起。
(2)模拟接口:1脚,模拟信号输入端,与模拟信号之间须接一200欧电阻
3脚,参考电压输入端,可外部输入,也可利用内部2.5V电压基准。无论以上那种情况,均须将该脚通过一2.2μF电容接到AGND1。
4脚,参考缓冲输入,须通过一2.2μF电容接到AGND2.
(3)数据接口:6~13和15~22分别对应16位数据的D15到D0
(4)控制接口:24脚,R/C,为读取数据/模数转换选择控制信号;
25脚,CS,为片选端;
26脚,BUSY,用于指示转换是否完成;
23脚,BYTE,为转换结果输出高低字节选择控制端。
3.1.2 工作过程及转换结果
AD976/AD976A要开始一次转换,首先要将CS信号置低,之后R/C信号的下降沿使得内部采样/保持单元进入保持状态并开始一次转换,BUSY信号在开始一次转换时变为低,且在转换结束前保持为低。BUSY信号为高时标明转换已经结束,BUSY的上升沿可以用来所存输出数据。此时,将R/C置高,即可把转换结果输出到数据总线上,数据有效可用。BYTE为低时,高8位从D15~D8输出,低8位从D7~D0输出,为高时相反;高8位从D7~D0输出,低8位从D15~D8输出。时序如图3.3所示:
图3.3 A/D976转化器时序图
其中Module Name就是输入的“one2two”,下面的列表框用于对端口的定义。“Port Name”表示端口名称,“Direction”表示端口方向(可以选择为input、output或inout),MSB表示信号的最高位,LSB表示信号的最低位,对于单位信号的MSB和LSB不用填写。定义了模块端口后,单击“Next”进入下一步,点击“Finish”按键完成创建。这样,ISE会自动创建一个Verilog模块的例子,并且在源代码编辑区内打开。简单的注释、模块和端口定义已经自动生成,所剩余的工作就是在模块中实现代码。填入的代码如下:
module one2two(x_in, flag, y1_out, y2_out);
input [7:0] x_in;
input flag;
output [7:0] y1_out;
output [7:0] y2_out;
//以下为手工添加的代码
assign y1_out = flag ? x_in : 8'b0000_0000;
assign y2_out = flag ? 8'b0000_0000:x_in;
Endmodule
鉴于篇幅,不可能对该软件的其他功能进行详细介绍,我们应该在实际工作中学习并熟练掌握。
定义端口:
CS:片选(低电平有效);
R/C:为读取数据/模数转换选择控制信号;
BUSY:高电平, 表示本次A /D转换完成, 控制电路可将数据取走。
数据采集时序可分成4个状态: S0、S1、S2、S3, 每个状态的动作如下:
S0: CS=0、RC=0、BUSY=0(由控制电路发出信号,要求A/D开始进行A/D转换)。
S1: CS=0、RC=0、BUSY = 1 (A/D进行转换动作,转换完后将BUSY信号从低电平降至高电平)。
S2: CS=0、RC=1、BUSY=1(由控制电路发出读信号)。
S3: CS=0、RC=1、BUSY=1(数据被读取到DB0~DB15上)。
下面给出部分主要源程序:
PROCESS ( CP, RST)
BEGIN
IF RST = '1';Then
nCS < = '0'; //片选(置低)
nRC< = '0'; //写信号(置低)
nBUSY < = '0'; //读信号(置低)
EC < = '0';
State < = S0;
Else IF CP Event And CP = '1 'Then
CASE State IS
WHEN S0=>
nCS < = '0';
nRC < = '0';
nBUSY < = '1';
EC < = '0';
State < = S1; //开始AD转换
WHEN S1 = >
nCS < = '0';
nRC < = '1';
nBUSY< = '1';
EC < = '0';
If nIN = '0'Then //转换结束
State < = S2;
End if;
WHEN S2=>
nCS < = '0';
nRC< = '1';
nBUSY< = '1';
EC < = '1';
State < = S3; //传送数据
WHEN S3 = >
nCS < = '0';
nRC < = '1';
nBUSY < = '1';
EC < = '0';
State < = S0;
WHEN OTHERS= >
State < = S0;
END CASE;
ENd If;
END PROCESS;
AD转换流程图如图4.7所示:
图4.7 AD转换流程图
下面的VHDL 程序片段描述了七段扫描驱动显示电路, 包括扫描信号产生电路和十六进制码与七段显示码转换电路。
SignalQ: STD_LOGIC_VECTOR(15 DOW NTO 0) ;
PROCESS (CP) //CP为系统时钟
Beg in
IF CP Event AND CP= '1'then
Q<=Q+1; //加法计数器
END IF;
END PROCESS;
ST<=Q(15 DOWNTO 14);
SEL<= "110" WHEN ST= 0 ELSE
"101" WHEN ST= 1 ELSE
"011" WHEN ST= 2 ELSE
"111";
NUM <= Value(3 DOWNTO 0) WHEN ST=0 ELSE
Value( 7 DOWNTO 4) WHEN ST = 1 ELSE
Value( 11 DOWNTO 8);
SEG < = " 0111111" WHEN NUM = 0 ELSE //十六进制转换成
"0000110" WHEN NUM =1 ELSE //七段码
"1011011" WHEN NUM = 2 ELSE
"1011011" WHEN NUM = 3 ELSE
"1011011" WHEN NUM = 4 ELSE
"1011011" WHEN NUM = 5 ELSE
"1011011" WHEN NUM = 6 ELSE
"1011011" WHEN NUM = 7 ELSE
"1011011" WHEN NUM = 8 ELSE
"1011011" WHEN NUM = 9 ELSE
"1011011" WHEN NUM = 10 ELSE
"1011011" WHEN NUM = 11 ELSE
"1011011" WHEN NUM = 12 ELSE
"1011011" WHEN NUM = 13 ELSE
"1011011" WHEN NUM = 14 ELSE
"1110001" WHEN NUM = 15 ELSE
"0000000";
用VHDL和CPLD设计数字系统具有传统方法无可比拟的优越性, 最大的优点是调试极其方便。基于自顶向下的数据流描述方法, 可以使设计者不必关心具体的电路细节, 而是由综合系统来具体实现, 这样可以使设计者主要关心系统级的算法设计, 从而能有效地提高系统的综合性能。它减少了设计成本, 缩短了设计周期, 已成为大规模集成电路设计最有效的手段之一。