实验12TLC549采样控制 下载本文

内容发布更新时间 : 2024/12/30 1:17:04星期一 下面是文章的全部内容请认真阅读。

实验十二 TLC549(A/D)采样控制

一.

1. 2. 3.

实验目的

掌握模/数转换芯片TLC549的使用方法

掌握利用有限状态机实现一般时序逻辑分析的方法 掌握一般状态机的设计与应用。

二. 准备知识

TLC549封装如图A.1所示,是一个8位的串行模数转换器,ANALOG_IN为测量信号;REF+为转换所需的正电压基准(最大测量电压);REF-为转换所需的负电压基准(最小测量电压);DATA_OUT为转换数据输出;CS为片选信号。

图A.1 TLC549封装示意图

A/D的转换时间最大17us,I/O时钟频率可达1.1MHz如图A.2所示为TLC549的时序,从图中可以看出当片选信号CS为低电平时,ADC的前一次转换数据(A)的最高位A7立即出现在数据线DATA_OUT上,之后的数据在时钟I/O_CLOCK的下降沿改变,可在I/O_CLOCK上升沿读取数据。读完8位数据后,如果片选信号CS置为高电平,ADC开始采样、保持、转换、锁存转换结果,以便下一次读取。

图A.2 TLC549工作时序图

在进行采样控制时,要注意操作时序之间的时间间隔要足够长,以使ADC能完成其相应的工

38

作。如:tSU(CS)为CS拉低到低电平后I/O_CLOCK第一个时钟到来时的时间,至少要1.4us;tCONV为ADC的转换时间,至少17us; I/O_CLOCK为系统时钟信号,不能超过1.1MHz。其他参数请参照数据手册。

由于ADC是8位的,且硬件电路上的REF+为2.5V,REF-接GND,所以采样的电压值为V=D/255*VREF。

包括扫描显示部分,最后完成的电路如图 所示。其中adc3为AD549的采样模块,需要说明的是:可以使用其它的方式完成采样,所给出的参考程序并不是最好的,使用的状态较多,但是在读取转换数据的流程相对比较清晰;显示结果为ASCII码显示,没有进行十进制处理。

在实际应用中,尤其是单片机控制中,使用串行AD的频率比较高,主要是因为串行AD所需要的管脚相对较少。

DIV400HzPIN_28k48mdat_inINPUTVCCINPUTVCCadc3clk48Msdat_inad_clkcs_ndata_out[7..0]instd[7..0]OUTPUTOUTPUTOUTPUTPIN_132ad_clkcsclk48Mclockmodulus 120000q[16..0]inst4up counterq[16..0]PIN_131d[31..8]PIN_134GNDdig[7..0]CNT16q[16]clockinst6up counterSCANLEDDECODE7SEL[2..0]DIN[31..0]DIG[7..0]DSEL[3..0]DIN[3..0]OUTPUTq[2..0]PIN_214PIN_213PIN_216PIN_215PIN_161PIN_162PIN_159PIN_160PIN_164PIN_163PIN_166PIN_165PIN_168PIN_167PIN_170PIN_169reg[7..0]d[31..0]inst5inst3DOUT[7..0]

图A.3 TLC549的采样控制顶层原理图

三. 实验步骤

1、 新建工程

新建文件夹,在该文件夹下新建工程tlc549。 2、 编写低层HDL文件

根据原理图A.3的内容,编写各个功能模块的HDL文件。 3、编写顶层原理图文件

新建原理图文件,并添加各个模块。

设定为顶层文件,进行编译,如有错误,纠正直至成功为止。 3、 锁定管脚

按表 锁定管脚,并重新进行编译,把管脚信息编译到下载文件中。 4、 下载

下载后,调节电位器RW1,观察数码管的数值变化是否正确。

四. 实验参考程序

程序清单 adc3.VHD

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;

39

USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL;

ENTITY adc3 IS PORT( clk48M: IN STD_LOGIC;--系统时钟

sdat_in: IN STD_LOGIC;--TLC549串行数据输入 ad_clk: OUT STD_LOGIC;--TLC549 I/O时钟 cs_n: OUT STD_LOGIC;--TLC549 片选控制

data_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--AD转换数据输出 ); END;

ARCHITECTURE one OF adc3 IS

SIGNAL tsu_number: STD_LOGIC_VECTOR(2 downto 0);--tsu延时累加器 SIGNAL clk_count: STD_LOGIC_VECTOR(3 downto 0);--24次分频累加器

SIGNAL con_number: STD_LOGIC_VECTOR(5 downto 0);--等待转换延时累加器 SIGNAL clk2M,con_ready,read_ready,reset_con,reset_tsu,can_read: STD_LOGIC; SIGNAL data_reg: STD_LOGIC_VECTOR(7 downto 0);--读数结果寄存器

TYPE states IS(st0,st1,st2,st3,st4,st5,st6,st7,st8,st9,st10,st11,st12,st13,st14,st15,st16); SIGNAL c_state,n_state:states; BEGIN

PROCESS (clk48M) BEGIN IF RISING_EDGE(clk48M) THEN IF clk_count =\ clk_count<=\ clk2M<=not clk2M;--2M的时钟信号 ELSE clk_count<=clk_count+1; END IF; END IF; END PROCESS;

PROCESS (clk2M) BEGIN IF RISING_EDGE(clk2M) THEN c_state<=n_state; --主控时序进程 END IF; END PROCESS;

40