
ADC0804的管脚图如下所示
图1 ADC0804架构图
它的主要电气特性如下:
●工作电压:+5V,即VCC=+5V。
●模拟输入电压范围:0~+5V,即0≤Vin≤+5V。
●分辨率:8位,即分辨率为1/28=1/256,转换值介于0~255之间。
●转换时间:100us(fCK=0KHz时)。
●转换误差:±1LSB。
●参考电压:2.5V,即Vref=2.5V。
1.ADC0804的转换原理
ADC0804是属于连续渐进式(Successive Approximation Method)的A/D转换器,这类型的A/D转换器除了转换速度快(几十至几百us)、分辨率高外,还有价钱便宜的优点,普遍被应用于微电脑的接口设计上。
以输出8位的ADC0804动作来说明“连续渐进式A/D转换器”的转换原理,动作步骤如下表示(原则上先从左侧最高位寻找起)。
第一次寻找结果:10000000 (若假设值≤输入值,则寻找位=假设位=1)
第二次寻找结果:11000000 (若假设值≤输入值,则寻找位=假设位=1)
第三次寻找结果:11000000 (若假设值>输入值,则寻找位=该假设位=0)
第四次寻找结果:11010000 (若假设值≤输入值,则寻找位=假设位=1)
第五次寻找结果:11010000 (若假设值>输入值,则寻找位=该假设位=0)
第六次寻找结果:11010100 (若假设值≤输入值,则寻找位=假设位=1)
第七次寻找结果:11010110 (若假设值≤输入值,则寻找位=假设位=1)
第八次寻找结果:11010110 (若假设值>输入值,则寻找位=该假设位=0)
这样使用二分法的寻找方式,8位的A/D转换器只要8次寻找,12位的A/D转换器只要12次寻找,就能完成转换的动作,其中的输入值代表图1的模拟输入电压Vin。
2.分辨率与内部转换频率的计算
对8位ADC0804而言,它的输出准位共有28=256种,即它的分辨率是1/256,假设输入信号Vin为0~5V电压范围,则它最小输出电压是5V/256=0.01953V,这代表ADC0804所能转换的最小电压值。
表1列出的是8~12位A/D转换器的分辨率和最小电压转换值。
表1 A/D转换器的分辨率和最小电压值
| 位数目 | 分辨率 | 最小电压转换值 |
| 8 | 1/256 | 0.01953V |
| 10 | 1/1024 | 0.00488V |
| 12 | 1/4096 | 0.00122V |
图2 ADC0804与CPLD&FPGA、8051单片机等典型连接图
频率计算方式是:fCK=1/(1.1×R×C)
若以图2的R=10KΩ、C=150PF为例,则内部的转换频率是
fCK=1/(1.1×10 KΩ×150PF)=606KHz
更换不同的R、C值,会有不同的转换频率,而且频率愈高代表速度愈快。但是需要注意R、C的组合,务必使频率范围是在100KHz~1460KHz之间。
3.ADC0804的控制方法
要求ADC0804进行模拟/数字的转换,其实可以直接由下面的时序图及图2信号的流向来配合了解。
图3 ADC0804控制信号时序图
以图2、图3信号流向而言,控制ADC0804动作的信号应该只有CS、WR、RD。其中INTR由高电位转为低电位后,代表ADC0804完成这次的模拟/数字转换,而DB0~DB7代表是转换后的数字资料。
图3的动作大概可分成4个步骤区间——S0、S1、S2、S3,每个步骤区间的动作方式如下:
●步骤S0:CS=0、WR=0、RD=1(由CPLD发出信号要求ADC0804开始进行模拟/数字信号的转换)。
●步骤S1:CS=1、WR=1、RD=1(ADC0804进行转换动作,转换完毕后INTR将高电位降至低电位,而转换时间>100us)。
●步骤S2:CS=0、WR=1、RD=0(由CPLD发出信号以读取ADC0804的转换资料)。
●步骤S3:CS=1、WR=1、RD=1(由CPLD读取DB0~DB7上的数字转换资料)。
由上述步骤说明,可以归纳出所要设计的CPLD动作功能有:
●负责在每个步骤送出所需的CS、WR、RD控制信号。
●在步骤S1时,监控INTR信号是否由低电位变高电位,如此以便了解ADC0804的转换动作结束与否。
●在步骤S3,读取转换的数字资料DB0~DB7。
下面是利用状态机控制ADC0804的程序代码:
-- ********************************************
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--*********************************************
ENTITY Ch9_2_1 is
PORT(
Din : IN STD_LOGIC_VECTOR(7 Downto 0); -- A/D Data In
Dout : OUT STD_LOGIC_VECTOR(7 Downto 0); -- A/D Data Out
CP : IN STD_LOGIC; -- CLOCK
RST : IN STD_LOGIC; -- System Reset
nCS,nWR,nRD: OUT STD_LOGIC; -- O/P Signal
nINTR : IN STD_LOGIC -- I/P Signal
);
END Ch9_2_1;
--*********************************************
ARCHITECTURE a OF Ch9_2_1 IS
TYPE STATE_TYPE IS (S0,S1,S2,S3); --State Type Declare
SIGNAL State : STATE_TYPE; --(1)State Signal Declare
SIGNAL EC,nIN : STD_LOGIC; --Synchronous Control & A/D nINTR
SIGNAL D : STD_LOGIC_VECTOR(7 Downto 0); --Read A/D Data
BEGIN
SystemConnection: Block
Begin
nIn <= nINTR;
Dout <= D; -- A/D Data Out
End Block SystemConnection;
StateChange: Block
Begin
PROCESS (CP,RST)
BEGIN
IF RST = '1' Then -- Reset State
nCS <= '1';
nWR <= '1';
nRD <= '1';
EC <= '0';
State <= S0;
ElsIF CP'Event And CP = '1' Then
CASE State IS
WHEN S0 => --(2)STATE S0 & Write State
nCS <= '0';
nWR <= '0';
nRD <= '1';
EC <= '0';
State <= S1;
WHEN S1 => --(3)STATE S1 & A/D Conversion State
nCS <= '1';
nWR <= '1';
nRD <= '1';
EC <= '0';
If nIN = '0' Then --nINTR = '0' ?
State <= S2; --(7)
End if;
WHEN S2 => --(4)STATE S2 & Read State
nCS <= '0';
nWR <= '1';
nRD <= '0';
EC <= '1'; --(9)
State <= S3;
WHEN S3 => --(5)STATE S3
nCS <= '1';
nWR <= '1';
nRD <= '1';
EC <= '0';
State <= S0;
WHEN OTHERS => --(6)Initial State
State <= S0;
END CASE;
ENd If;
END PROCESS;
End Block StateChange;
ReadData: Block
Begin
PROCESS (CP)
BEGIN
IF CP'Event AND CP = '1' THEN
IF EC = '1' THEN -- (8)Read State --> EC = '1'
D <= Din; -- Read A/D Convertor Data
END IF;
END IF;
END PROCESS;
End Block ReadData;
END a;
程序说明:
(1)首先上述程序(1)处,我们先定义共有S0~S3,4个状态。
(2)程序(2)~(6)是一个Case-when语句所构成的状态机功能结构。
(3)在状态S1时,它是必须到ADC0804的INTR信号转为低电位时,才会通过程序(7)将状态由S1切换至下个状态S2。
(4)接着在状态S2的程序(9)处,将信号EC设定为高电位,这样下个脉冲信号CP正沿时,即程序(8)处,才开始读取ADC0804的DB0~DB7管脚沙国内的数字转换信号。
