数据采集与监控系统
一、设计要求
用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
因篇幅问题不能全部显示,请点此查看更多更全内容