您的当前位置:首页正文

数据采集与监控系统

2021-09-05 来源:好走旅游网


数据采集与监控系统

一、设计要求

用AD对所有通道循环检测,当测出有规定数值时,进行声光报警。

二、设计思路

系统主要实现以下功能:首先对ADC0809的八路通道的数值进行循环检测,并显示每路的当前采样值。当检测到有任何一路的值大于预设值的时候就进行报警,并显示出所超出规定值的通道数。如无任何通道的输出超出预设值时,就由主控器控制进行通道0到通道7的循环检测,当需要对数据进行处理时,通过切换键将控制单元的功能转换到数据处理功能(暂时只包括将采样信号放大到2倍、缩小到1/2和保持采样信号不变这三种基本功能)。在数据处理完之后,将数据输出给DAC0832,再将数字信号转换为模拟量输出。

数据采集系统的设计主要包括数据输入单元、数据处理及监控和数据输出单元。 数据输入单元的设计主要是通过ADC0809的常规应用来实现的。ADC0809的CLOCK信号是由外部接入的,没有固定的数值要求,只要足够高就可以了。但是START信号的频率不宜过高,要小于1khz。数据处理及监控单元主要是通过软件来实现,主要包括循环检测与监控模块和数据处理模块。循环检测及监控模块主要实现对输入电压值进行循环检测,将检测值与设定值进行比较。当检测到超出设定电压值时,产生报警信号,并通过数码管显示出当前通道数;数据处理模块主要实现将信号放大2倍、缩小到1/2和保持不变三种处理方式。数据输出单元主要功能就是将处理后的数字信号经过DAC0832再转换为模拟量输出。

图1 数据采集系统设计的基本框架

在设计中,采用多进程描述的方法来进行程序设计,通过使用进程可以把整体的功能局部化、分块设计。多个进程通过进程间通信机制互相配合、达到设计要求。当进程比较多的时候,它们之间的配合问题就比较复杂,因此在设计之前应该合理规划安排。

编译和仿真时要选择合适的芯片,不同的芯片其速度等级是不一样的。选择速度等级高的芯片,仿真时延就小,这样便于分析时序波形。否则,将给时序分析带来一些不必要的麻烦。编译结束时,要注意认真分析芯片资源的利用情况,这其中主要包括芯片管脚和逻辑单元的利用率,如果没有充分利用资源就要重新选择芯片,争取实现性价比的最大化。

所以大致流程是先进行主程序的输入/输出模块,数据处理及监控模块的设计。然后对各程序进行修改、编译、仿真,并对出现问题的程序进行程序修改和调试。

三、设计内容

A、数据输入模块

(一)数据输入单元的设计

数据输入单元的设计是通过ADC0809的常规应用来实现的,其具体的实现如图所示。其中ADC0809的CLOCK信号是由外部输入的。此信号的输入没有固定的要求,只要足够高就可以了,通常信号频率为640KHZ、750KHZ等。ADC0809的START信号也是由外部接入的,但是此信号的频率不宜过高,要小于1KHZ。将ADC0809的输出作为CPLD的输入。

ADC0809是一种比较典型的8位8通道逐次逼近式A/D转换器CMOS工艺,可以实现8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存用译码电路,其转换时间为1us左右,采用双排28引脚封装.ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。其引脚说明如下:

IN0~IN7:8路模拟量输入通道

ADDA~ADDC:地址线用于选择模拟量输入通道

ALE:地址锁存允许信号

START:转换启动信号

D0~D7:数据输出线

OE:输出允许信号,低电平允许转换结果输出

CLOCK:时钟信号输入引脚,通常使用500KHZ

EOC:转换结束信号,为0代表正在转换,l代表转换结束

Vcc:+5V电压

(二)模块功能实现

此系统是用ADC0809对模拟信号进行采样,转换为数字信号,由可编程逻辑器件读入,再送到DAC0832,将数字信号转换为模拟信号。用可编程逻辑器件实现对ADC0809的控制,由于采用查询信号EOC的方式,所以可达到ADC0809的最高速度(注:ADC0809和DAC0832都不能对负电压进行操作)。主要包括分频模块和ADC控制模块。总体框图如图所示:图中OE为输出允许信号,高电平允许转换结果输出;EOC为转换结束信号,为0代表正在转换,1代表转换结束;DIN [7..0]为8路模拟量输入通道;DOUT[7..0]为转换后的8路数字信号输出通道

图3 总体框图

1、分频模块FEN如图4所示。它是一个八分频模块,其中CLK为输入时一钟信号,q为实现分频后的输出信号,变量cnt可取整数值0-3。

图4 分频模块FEN

(1)原理程序如下:

library ieee;

use ieee.std_logic_1164.all;

entity fen is

port (CLK: in std_logic;

Q: out std_logic);

end entity ;

architecture bhv of fen is

begin

process(CLK)

variable cnt :integer range 0 to 3;

variable x:std_logic;

begin

if clk'EVENT and clk='1' then

if cnt<3 then cnt:=cnt+1;

else cnt:=0;

x:= not x;

end if;

end if;

Q<=x;

end process;

end bhv;

(2)原理图如图5所示:

图5 分频模块原理图

(3)仿真结果

图6 分频模块仿真图

2、控制模块CONT如图7所示,实现对ADC0809的控制,送出START和ALE信号后查询EOC信号。当转换完成后,即EOC变为高电平时,送出OE信号,读取数据,完成一个,转换周期。

图7 控制模块CONT

(1) 原理程序如下:

library ieee;

use ieee.std_logic_1164.all;

entity cont is

port(clk,eoc:in std_logic;

din:in std_logic_vector(7 downto 0);

start,oe,ale:out std_logic;

dout:out std_logic_vector(7 downto 0));

end cont;

architecture a_arc of cont is

begin

process(clk)

variable x,y:std_logic;

variable state:integer range 0 to 2;

begin

if clk'event and clk='1'then

if x='0'then

case state is

when 0=>ale<='1';

state:=1;

when 1=>start<='1';

state:=2;

when 2=>ale<='0';

start<='0';

state:=0;

x:='1';

end case;

else

if eoc='0'then Y:='1';

end if;

if y='1'then

if eoc='1'then

case state is

when 0=>oe<='1';

state:=1;

when 1=>dout<=din;

state:=2;

when 2=>oe<='0';

state:=0;

x:='0';

y:='0';

end case;

end if;

end if;

end if;

end if;

end process;

end a_arc;

(2)原理图如图8所示:

图8 控制模块原理图

(3)仿真结果

图9 ADC0809控制模块波形仿真图

(4)结果分析

图9所示的是实现对ADC0809的控制,先送出START信号,开始进行模数转换。再送出ALE信号将地址信号锁存,然后查询EOC信号,若EOC变为高电平,则说明转换已结束。此时送出OE信号,读取数据,完成一个转换周期。

B、数据处理及监控模块

(一) 数据处理模块DEAL设计

模块DEAL如图11所示。此模块为核心控制模块,实现题目要求的逻辑功能。因为ADC0809可将0~+5V电压转换成数字量,要实现电压增大到2倍,DAC0832的输出要达到0~10V。在这两个器件中实现了增大到2倍的功能(调节运放的反馈电阻实现)。d为输入变量,取值范围0~7。clk是时钟信号,k1用于选择工作模式,当k1为0时器件工作于循环检测报警模式,当k1为1时器件工作于数据采集及处理模式。sel为输出逻辑变

量,取值范围为0~3,主要用于计数控制,当计数到3时信号实现翻转。程序功能简要如下:模块首先工作于循环检测工作模式(k1=0),如果x=0,则将cnt的计数值赋给sel,此时器件工作于选择通道模式。接着器件开始转入循环检测模式,检测输入电压是否超过设定电压,超过时报警(alm=1),并停止循环检测,数码管显示当前通道数。未超过时不报警,x重新赋值为0,器件又工作于选择通道模式,如此循环。当k1=1时,工作于数据采集及处理模式。此时fun用来选择工作模式,fun为00时器件工作于放大2倍的方式,fun为01时器件工作于缩小1/2的方式,fun为10和11时则对所采集进来的数据不加处理就输出。

图11 处理模块模块DEAL

1、原理程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity deal is

port(d:in std_logic_vector(7 downto 0);

clk,k1:in std_logic;

fun:in std_logic_vector(1 downto 0);

sel:out std_logic_vector(2 downto 0);

q:out std_logic_vector(7 downto 0);

alm:out std_logic);

end entity deal;

architecture a_arc of deal is

begin

process(clk)

variable x:std_logic;

variable cnt:std_logic_vector(2 downto 0);

begin

if clk'event and clk='1'then

if k1='0'then

if x='0'then

sel<=cnt;

cnt:=cnt+1;x:='1';

else

if d>\"10000000\"then

alm<='1';

else

alm<='0';

x:='0';

end if;

end if;

else

if fun=\"00\"then

q<=d;

elsif fun=\"01\"

then q<='0'&'0'&d(7 downto 2);

else

q<='0'&d(7 downto 1);

end if;

end if;

end if;

end process;

end a_arc;

2、原理图如图12所示:

图12 数据处理模块DEAL原理图

3、仿真结果

图13 数据处理模块波形仿真图

(二) 二选一模块CH设计

模块CH如图14所示。在两个工作模式下选择通道的方法不同,所以要通过这个二选一模块实现。S为输入标准量,取值0或1,q为输出逻辑变量,s=0时将a值赋给q,s=1时将b值赋给q,从而实现二选一功能。

图14 二选一模块CH

1、原理程序如下所示:

library ieee;

use ieee.std_logic_1164.all;

entity ch is

port(a,b:in std_logic_vector(2 downto 0);

s:in std_logic;

q:out std_logic_vector (2 downto 0));

end ch;

architecture ch_arc of ch is

begin process(s,a,b)

begin

if s='0'then q<=a;

else q<=b;

end if;

end process;

end ch_arc;

2、原理图如图15所示:

图15 二选一模块CH设计原理图

3、仿真结果

图16 二选一模块CH设计仿真结果

(三)报警显示模块DISPA设计

模块DISPA如图17所示。它是七段译码器,不同之处在于,在循环检测模式时,若没有通道超过设置的电压,则不显示。程序中d为输入逻辑变量,用三位二进制数表要显示的通进数。clk为时钟信号,q为输出逻辑变量,用七位二进制数来实现七段译码器的功能,最终显示出报警的通道数,cnt在此为一计数器,主要延时作用。器件首先工作于选择通道模式,记取最初工作的通道数 dl,在计数器cnt从0计到3时,转入循环检测模式,再次检测通道数是否仍为dl,若是,则说明该通道电压值超过所设定的电压值,器件处于报警状态,通过数码管显示当前通道数;若此时检测到通道数为d2(d2不等于d1),则说明器件处于正常循环检测状态,不显示通道数。检测完后,再次进入选择通道模式,如此循环。

图17 显示模块DISPA

1、原理程序如下:

library ieee;

use ieee.std_logic_1164.all;

entity dispa is

port(d:in std_logic_vector(2 downto 0);

clk:in std_logic;

a:out std_logic_vector(2 downto 0);

q:out std_logic_vector(6 downto 0);

cntn:out integer);

end entity dispa;

architecture dispa_arc of dispa is

begin process(clk)

variable x:std_logic;

variable tmp:std_logic_vector(2 downto 0);

variable cnt:integer range 0 to 3;

begin

if clk'event and clk='1'then

if x='0'then tmp:=d;

x:='1';

else

if cnt<3 then cnt:=cnt+1;

else

cnt:=0;

if tmp=d then

case d is

when\"000\"=>q<=\"0111111\";

when\"001\"=>q<=\"0000110\";

when\"010\"=>q<=\"1011011\";

when\"011\"=>q<=\"1001111\";

when\"100\"=>q<=\"1100110\";

when\"101\"=>q<=\"1101101\";

when\"110\"=>q<=\"1111101\";

when\"111\"=>q<=\"0000000\";

end case;

else

q<=\"0000000\";

end if;x:='0';

end if;

end if;

end if;

a<=tmp;

cntn<=cnt;

end process;

end dispa_arc;

2、原理图如图18所示

图18 报警显示模块DISPA设计原理图

3、仿真结果

图19 报警显示模块波形仿真图

4、结果分析

如图19所示,器件首先工作于选择通道模式,记取最初工作的通道数d=0,并将值赋给tmp,即tmp=0。在计数器cnt从0计到3时,再次检测通道数d发现它不等于tmp,说明当前处于正常循环检测状态,数码管显示数为0,同时d重新赋值给tmp,此时tmp=2;如此循环检测,直到第6个周期时检测到trnp=d,说明器件已处于报警状态,器件马上锁定当前通道数0,并通过数码管显示出来。

四、参考文献

(一)肖忠祥,数据采集原理,西北工业人学出版社,2001

(二)王振红,数据采集以及监控系统,北方工业人学出版社,2003

因篇幅问题不能全部显示,请点此查看更多更全内容