数据采集系统的设计.docx

上传人:b****8 文档编号:11384878 上传时间:2023-02-28 格式:DOCX 页数:28 大小:145.43KB
下载 相关 举报
数据采集系统的设计.docx_第1页
第1页 / 共28页
数据采集系统的设计.docx_第2页
第2页 / 共28页
数据采集系统的设计.docx_第3页
第3页 / 共28页
数据采集系统的设计.docx_第4页
第4页 / 共28页
数据采集系统的设计.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

数据采集系统的设计.docx

《数据采集系统的设计.docx》由会员分享,可在线阅读,更多相关《数据采集系统的设计.docx(28页珍藏版)》请在冰豆网上搜索。

数据采集系统的设计.docx

数据采集系统的设计

概述

在电子设计技术领域,可编程逻辑器件(如PLD,GAL)的应用,已有了很好的普及。

这些器件为数字系统的设计带来极大的灵活性。

由于这类器件可以通过软件编程而对其硬件的结构和工作方式进行重构,使得硬件的设计可以如同软件设计那样方便快捷。

这一切极大地改变了传统的数字系统设计方法、设计过程、乃至设计观念。

随着大规模集成电路技术和计算机技术的不断发展,在涉及通信、国防、航天、医学、工业自动化、计算机应用、仪器仪表等领域的电子系统设计工作中,EDA技术的含量正以惊人的速度上升;电子类的高新技术项目的开发也依赖于EDA技术的应用。

即使是普通的电子产品的开发,EDA技术常常使一些原来的技术瓶颈得以轻松突破,从而使产品的开发周期大为缩短、性能价格比大幅提高。

不言而喻,EDA技术将迅速成为电子设计领域中的极其重要的组成部分。

本次设计的目的是使用可编程逻辑器件设计一个专用的A/D转换器的控制器,取代常用的微控制器,用于数据采集。

本文讲述对A/D进行数据采样控制。

设计要求用一片CPLD/FPGA,模数转换控制器ADC和LED显示器构成一个数据采集系统,用CPLD/FPGA实现数据采集中对A/D转换,数据运算,及有关数据的显示控制。

课题除了学习相应的硬件知识外,还要学习如何使用VHDL语言设计可编程逻辑器件。

 

第一章设计要求

本设计要求用一片CPLD/FPGA、模数转换器ADC和数模转换器DAC构成一个数据采集系统,并用CPLD/FPGA实现数据采集中对A/D转换、数据运算、D/A转换以及有关数据显示的控制。

 

第二章设计方案

2.1数据采集和控制系统概述

数据采集和控制系统是对生产过程或科学实验中各种物理量进行实时采集、测试和反馈控制的闭环系统。

它在工业控制、军事电子设备、医学监护等许多领域发挥着重要作用。

2.2数据采集和控制系统总框图

系统的组成框图如图1所示,其功能如下:

(1)系统按一定速率采集输入电压U1,经ADC0809转换为8位数字量DATA。

(2)输入数据与通过预置按键输入数据采集控制器内的标准数据相减,求得带极性位的差值±ΔU(数字量);差值之绝对值送至DAC0832转换为ΔU,它和特定的极性判别电路共同输出±ΔU。

(3)数据采集和处理均在数据采集系统控制器的管理下有序进行。

工作速率由时钟信号CLK的速率决定。

图1数据采集系统组成框图

 

2.3数据采集和控制系统整体组装原理图

根据系统设计要求,数据采集系统控制器SJCJKZQ可由四个模块组成:

A/D转换控制模块ADZHKZ、数据运算与处理模块SJYSCL、D/A转换控制模块DAZHKZ以及有关键盘输入与数据显示控制模块JPXSKZ,其组成框图及有关接口如图2所示。

图2数据采集系统总体组成原理图

 

第三章设计思路

数据采集系统控制器SJCJKZQ可由四个模块组成:

A/D转换控制模块ADZHKZ、数据运算与处理模块SJYSCL、D/A转换控制模块DAZHKZ以及有关键盘输入与数据显示控制模块JPXSKZ。

3.1A/D转换控制模块ADZHKZ

ADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。

ADC0809的分辨率为8位,转换时间约100μs,含锁存控制的8路多路开关,输出由三态缓冲器控制,单5V电源供电。

图3是ADC0809的管脚及主要控制信号时序图。

图4是ADZHKZ模块生成的符号。

图3ADC0809的管脚及主要控制信号时序图

图4ADZHKZ模块符号

对于ADC0809模数转换的控制程序段的VHDL设计,根据ADC0809的A/D转换控制要求,我们可用一个状态机来实现,其状态转换如图5所示。

图5状态转换图

3.2数据运算与处理模块SJYSCL

表1是在ADC0809的基准电压(Vref)为5.12V时,模拟输入电压与输出电压的对应关系表,其中最小电压准位是5/28=5/256=0.2V。

这样,当由ADC0809的D[7..0]收到的数据信号是10000110(即86H)时,则对照表8.1时,高4位1000是2.56V,而低4位0110是0.12V,所以最后的电压输出结果是2.56V+0.12V=2.68V。

表1ADC0809模拟输入电压与输出电压的对应关系

图6BCD加法示意图图7SJYSCL模块符号

为了方便后续的电压数据显示,我们应将输出电压表示成12位的BCD码形式。

如上述的2.56V是001001010110,0.12V是000000010010,所以相加的结果2.68V是001001101000,因此必须设计一个12位的BCD码加法程序。

上图是2.56+0.18=2.74的二进制的BCD加法示意图。

从图6中可以看出,二进制BCD码相加时,由最低位4位加起,且每4位相加的结果超过10时需作进位操作。

图7是SJYSCL生成的符号

3.3D/A转换控制模块DAZHKZ

DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要。

图8DAC0832内部结构图

DAC0832的内部结构如图8所示。

DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的锁存信号为ILE;第二级锁存器称为DAC寄存器,它的锁存信号为传输控制信号。

因为有两级锁存器,DAC0832可以工作在双缓冲器方式,即在输出模拟信号的同时采集下一个数字量,这样能有效地提高转换速度。

此外,两级锁存器还可以在多个D/A转换器同时工作时,利用第二级锁存信号来实现多个转换器同步输出。

图9是DAZHKZ模块生成的符号。

3.4键盘输入与数据显示控制模块JPXSKZ

键盘输入与数据显示控制模块JPXSKZ各主要功能模块:

时序产生电路,键盘扫描电路,抖动消除电路,键盘译码电路,按键存储电路。

时序产生电路,由于设计需要不止一个时钟,若输入是ClK,N位计数器的输出位Q[N-l坷,则Q(0)为CLK的2分频脉冲,Q(3)为CLK电路16分频脉冲,Q(N-1)为2频。

Q(5downto4)其脉冲序列是00-0110-11-00-01周期变化,其频率为CLK的32分颇。

由此可得到设计中所需要的频率。

键盘扫描电路用来产生扫描信号,扫描信KY32KYO按照1110-1101-1011-0111-1110……的规律依次变化,通过输出KX22KXO来检测是否有键接下,如扫描信号示1101,表示正在扫描4,5,6这三个键,如果这三个键多没被按下,则KX[2:

0]输出为Ill,如果数字键4按下,口[2:

0]将会输出为011。

按键位置与数码关系如表2所示,图10是JPXSKZ模块生成的符号。

图9DAZHKZ模块符号图10JPXSKZ模块符号

表2按键位置与数码关系

KY[30]111011101110110111011101111110110111011101110111

KX[20]011101110011101110101101110011101110

按键值123456789*0#

 

第四章VHDL源程序

4.1A/D转换控制模块ADZHKZ的VHDL源程序

--ADZHKZ.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYADZHKZIS

PORT(D:

INSTD_LOGIC_VECTOR(7DOWNTO0);

RST:

INSTD_LOGIC;--复位信号

CLK:

INSTD_LOGIC;--转换工作时钟信号

EOC:

INSTD_LOGIC;--0809的转换结束控制信号

ALE:

OUTSTD_LOGIC;--0809的通道选择地址锁存信号

START:

OUTSTD_LOGIC;--0809的转换启动控制信号

OE:

OUTSTD_LOGIC;--0809的输出使能控制信号

ADDA:

OUTSTD_LOGIC;--0809的通道选择控制信号

BCDOUT:

OUTSTD_LOGIC_VECTOR(11DOWNTO0));

ENDENTITYADZHKZ;

ARCHITECTUREARTOFADZHKZIS

TYPESTATESIS(ST0,ST1,ST2,ST3,ST4,ST5,ST6);

SIGNALCURRENT_STATE,NEXT_STATE:

STATES;

SIGNALREGL:

STD_LOGIC_VECTOR(7DOWNTO0);

SIGNALLOCK0,LOCK1:

STD_LOGIC;--转换后数据输出锁存时钟信号

SIGNALVALUE:

STD_LOGIC_VECTOR(11DOWNTO0);

SIGNALCEN:

STD_LOGIC;

SIGNALALE0:

STD_LOGIC;

SIGNALSTART0:

STD_LOGIC;

SIGNALOE0:

STD_LOGIC;

BEGIN--A/D转换控制模块

STATESYSTEM:

BLOCKIS

BEGIN

ADDA<='1';--状态转换控制

PRO:

PROCESS(CURRENT_STATE,EOC)IS

BEGIN

CASECURRENT_STATEIS

WHENST0=>ALE0<='0';START0<='0';OE0<='0';

LOCK0<='0';NEXT_STATE<=ST1;CEN<='0';

WHENST1=>ALE0<='1';START0<='0';OE0<='0';LOCK0<='0';

NEXT_STATE<=ST2;CEN<='0';

WHENST2=>ALE0<='0';START0<='1';OE0<='0';LOCK0<='0';

NEXT_STATE<=ST3;CEN<='0';

WHENST3=>ALE0<='0';START0<='0';OE0<='0';

LOCK0<='0';CEN<='0';

IFEOC='1'THEN--测试EOC的下降沿

NEXT_STATE<=ST3;

ELSE

NEXT_STATE<=ST4;

ENDIF;

WHENST4=>ALE0<='0';START0<='0';OE0<='0';

LOCK0<='0';CEN<='0';

IFEOC='0'THEN

NEXT_STATE<=ST4;--测试EOC的上升沿,=1表明转换结束

ELSE

NEXT_STATE<=ST5;

ENDIF;

WHENST5=>ALE0<='0';START0<='0';OE0<='1';LOCK0<='0';

NEXT_STATE<=ST6;CEN<='1';

WHENST6=>ALE0<='0';START0<='0';OE0<='1';LOCK0<='1';

NEXT_STATE<=ST0;CEN<='0';

WHENOTHERS=>ALE0<='0';START0<='0';OE0<='0';LOCK0<='0';

NEXT_STATE<=ST0;CEN<='0';

ENDCASE;

ENDPROCESS;

PROCESS(RST,CLK)BEGIN

IFRST='1'THEN

CURRENT_STATE<=ST0

ELSIFRISING_EDGE(CLK)THEN

CURRENT_STATE<=NEXT_STATE;--在时钟上升沿,转换至下一状态

ENDIF;

ENDPROCESS;--用于给输出信号去毛刺

PROCESS(CLK)BEGIN

IFRISING_EDGE(CLK)THEN

ALE<=ALE0;START<=START0;OE<=OE0;LOCK1<=LOCK0;

ENDIF;

ENDPROCESS;--数据锁存进程

PROCESS(LOCK1)BEGIN

IFRISING_EDGE(LOCK1)THEN

REGL<=D;--在LOCK1的上升沿,将转换好的数据锁入

ENDIF;

ENDPROCESS;

ENDBLOCKSTATESYSTEM;--A/D转换数据的BCD码转换模块

CONVERSION:

BLOCKIS

SIGNALV:

STD_LOGIC_VECTOR(7DOWNTO0);

SIGNALHB,LB:

STD_LOGIC_VECTOR(11DOWNTO0);

SIGNALC30,C74,C118:

STD_LOGIC;

SIGNALTEMPA,TEMPB,TEMPC:

STD_LOGIC_VECTOR(4DOWNTO0);

BEGIN

PROCESS(REGL)IS

BEGIN

V<=REGL;--将A/D转换后的高4位通过查表的方式用12位BCD码表示

CASEV(7DOWNTO4)IS--FORA/DCONVERSIONDATAHIGHTBYTE

WHEN"1111"=>HB<="010010000000";--4.80

WHEN"1110"=>HB<="010001001000";--4.48

WHEN"1101"=>HB<="010000010110";--4.16

WHEN"1100"=>HB<="001110000100";--3.84

WHEN"1011"=>HB<="001101010010";--3.52

WHEN"1010"=>HB<="001100100000";--3.20

WHEN"1001"=>HB<="001010001000";--2.88

WHEN"1000"=>HB<="001001010110";--2.56

WHEN"0111"=>HB<="001000100100";--2.24

WHEN"0110"=>HB<="000110010010";--1.92

WHEN"0101"=>HB<="000101100000";--1.60

WHEN"0100"=>HB<="000100101000";--1.28

WHEN"0011"=>HB<="000010010110";--0.96

WHEN"0010"=>HB<="000001100100";--0.64

WHEN"0001"=>HB<="000000110010";--0.32

WHENOTHERS=>HB<="000000000000";--0.00

ENDCASE;--将A/D转换后数据的低4位用12位BCD码表示

CASEV(3DOWNTO0)IS--FORA/DCONVERSIONDATALOWBYT

WHEN"1111"=>LB<="000000110000";--0.30

WHEN"1110"=>LB<="000000101000";--0.28

WHEN"1101"=>LB<="000000100110";--0.26

WHEN"1100"=>LB<="000000100100";--0.24

WHEN"1011"=>LB<="000000100010";--0.22

WHEN"1010"=>LB<="000000100000";--0.20

WHEN"1001"=>LB<="000000011000";--0.18

WHEN"1000"=>LB<="000000010110";--0.16

WHEN"0111"=>LB<="000000010100";--0.14

WHEN"0110"=>LB<="000000010010";--0.12

WHEN"0101"=>LB<="000000010000";--0.10

WHEN"0100"=>LB<="000000001000";--0.08

WHEN"0011"=>LB<="000000000110";--0.06

WHEN"0010"=>LB<="000000000100";--0.04

WHEN"0001"=>LB<="000000000010";--0.02

WHENOTHERS=>LB<="000000000000";--0.00

ENDCASE;

ENDPROCESS;--将A/D转换后高低4位的12位BCD码进行加法操作处理

PROCESS(HB,LB,CEN)IS

VARIABLETEMP1,TEMP2,TEMP3:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

IFRISING_EDGE(CEN)THEN

TEMP1:

=HB(3DOWNTO0)+LB(3DOWNTO0);

IFTEMP1>"1001"THEN

TEMP1:

=TEMP1+"0110";

TEMP2:

=HB(7DOWNTO4)+LB(7DOWNTO4)+'1';

IFTEMP2>"1001"THEN

TEMP2:

=TEMP2+"0110";

TEMP3:

=HB(11DOWNTO8)+LB(11DOWNTO8)+'1';

IFTEMP3>"1001"THEN

TEMP3:

=TEMP3+"0110";

ENDIF;

ELSE

TEMP3:

=HB(11DOWNTO8)+LB(11DOWNTO8);

IFTEMP3>"1001"THEN

TEMP3:

=TEMP3+"0110";

ENDIF;

ENDIF;

ELSE

TEMP2:

=HB(7DOWNTO4)+LB(7DOWNTO4);

IFTEMP2>"1001"THEN

TEMP2:

=TEMP2+"0110";

TEMP3:

=HB(11DOWNTO8)+LB(11DOWNTO8)+'1';

IFTEMP3>"1001"THEN

TEMP3:

=TEMP3+"0110";

ENDIF;

ELSE

TEMP3:

=HB(11DOWNTO8)+LB(11DOWNTO8);

IFTEMP3>"1001"THEN

TEMP3:

=TEMP3+"0110";

ENDIF;

ENDIF;

ENDIF;

ENDIF;

VALUE<=TEMP3&TEMP2&TEMP1;

ENDPROCESS;--将经过BCD码转换处理后的数据输出

BCDOUT<=VALUE;

ENDBLOCKCONVERSION;

ENDARCHITECTUREART;

4.2数据运算与处理模块SJYSCL的VHDL源程序

--SJYSCL.VHD

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSJYSCLIS

PORT(CLK:

INSTD_LOGIC;

DABC:

INSTD_LOGIC_VECTOR(11DOWNTO0);

DTA:

INSTD_LOGIC_VECTOR(3DOWNTO0);

DTB:

INSTD_LOGIC_VECTOR(3DOWNTO0);

DTC:

INSTD_LOGIC_VECTOR(3DOWNTO0);

QABC:

OUTSTD_LOGIC_VECTOR(11DOWNTO0));

ENDENTITYSJYSCL;

ARCHITECTUREARTOFSJYSCLIS

SIGNALDA,DB,DC:

STD_LOGIC_VECTOR(3DOWNTO0);

--DAISTHEHIGHESTBIT,DCTHELASTONE

SIGNALDDA,DDB,DDC:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

DA<=DABC(11DOWNTO8);

DB<=DABC(7DOWNTO4);

DC<=DABC(3DOWNTO0);

DDA<=DTA(3DOWNTO0);

DDB<=DTB(3DOWNTO0);

DDC<=DTC(3DOWNTO0);

PROCESSIS

VARIABLETEMPA,TEMPB,TEMPC:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

WAITUNTILCLK='1';

IFDA>DDATHEN

IFDB>DDBTHEN

IFDC>=DDCTHEN

TEMPC:

=DC-DDC;

TEMPB:

=DB-DDB;

TEMPA:

=DA-DDA;

ELSE

TEMPC:

="1010"-DDC+DC;

IFTEMPC>"1001"THEN

TEMPC:

=TEMPC+"0110";

ENDIF;

TEMPB:

=DB-'1'-DDB;

TEMPA:

=DA-DDA;

ENDIF;

ELSIFDB=DDBTHEN

IFDC>=DDCTHEN

TEMPC:

=DC-DDC;

TEMPB:

=DB-DDB;

TEMPA:

=DA-DDA;

ELSE

TEMPC:

="1010"-DDC+DC;

IFTEMPC>"1001"THEN

TEMPC:

=TEMPC+"0110";

ENDIF;

TEMPB:

="1010"-DDB-'1'+DB;

IFTEMPB>"1001"THEN

TEMPB:

=TEMPB+"0110";

ENDIF;

TEMPA:

=DA-'1'-DDA;

ENDIF;

ELSE

IFDC>=DDCTHEN

TEMPC:

=DC-DDC;

TEMPB:

="1010"-DDB+DB;

IFTEMPB>"1001"THEN

TEMPB:

=TEMPB+"0110";

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1