集成A/D转换器品种繁多,选用时应综合考虑各种因素选取集成芯片。一般逐次比较型A/D转换器用的比较多,ADC0804就是这类单片集成A/D转换器。ADC0804是一款8位、单通道、低价格A/D转换器。工作电压:+5V,属于连续渐进式(Successive Approximation Method)的A/D转换器。
1、ADC0804的管脚图及说明
Vin(+)、Vin(-):两个vwin 信号输入端,可以接收单极性、双极性和差模输入信号。
DB0-DB7:具有三态特性数字信号输出端,输出结果为八位二进制结果。
CLKIN:时钟信号输入端。
CLKR:内部时钟发生器的外接电阻端,与CLK端配合可由芯片自身产生时钟脉冲,其频率计算方式是:fck=1/(1.1RC)。
CS:片选信号输入端,低电平有效。
WR:写信号输入端,低电平启动AD转换。
RD:读信号输入端,低电平输出端有效。
INTR:转换完毕中断提供端,AD转换结束后,低电平表示本次转换已完成。
VREF/2:参考电平输入,决定量化单位。
VCC:芯片电源5V输入。
AGND:模拟电源地线。
DGND:数字电源地线。
二、adc0804芯片参数
工作电压:+5V,即VCC=+5V。
模拟输入电压范围:0~+5V,即0≤Vin≤+5V。
分辨率:8位,即分辨率为1/2=1/256,转换值介于0~255之间。
转换时间:100us(fCK=640KHz时)。
转换误差:±1LSB。
参考电压:2.5V,即Vref=2.5V。
三、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
ADC0804工作过程如下图所示,ADC0804的工作时序图(Timing Diagrams): (欲详细了解工作过程,可以结合ADC0804使用手册)
四、ADC0804工作过程及原理
图6给出的其实就是使ADC0804正确工作的软件编程模型。由图可见,实现一次ADC转换主要包含下面三个过程:
1.启动转换:由图6中的上部“FIGURE 10A”可知,在CS信号为低电平的情况下,将WR引脚先由高电平变成低电平,经过至少tW(WR)I 延时后,再将WR引脚拉成高电平,即启动了一次AD转换。
注:ADC0804使用手册中给出了要正常启动AD转换WR的低电平保持时间tW(WR)I的最小值为100ns,即WR拉低后延时大于100ns即可以,具体做法可通过插入NOP指令或者调用delay()延时函数实现,不用太精确,只要估计插入的延时大于100ns即可。
2.延时等待转换结束:依然由图6中的上部“FIGURE 10A”可知,由拉低WR信号启动AD采样后,经过1到8个Tclk+INTERNAL Tc延时后,AD转换结束,因此,启动转换后必须加入一个延时以等待AD采样结束。
注:手册中给出了内部转换时间“INTERNAL Tc”的时间范围为62~73个始终周期,因此延时等待时间应该至少为8+73=81个时钟周期。比如,若R为150K, C为150pF,则时钟频率为Fclk=1/1.1RC=606KHz,因此时钟周期约为Tclk=1/Fclk=1.65us。所以该步骤至少应延时81*Tclk=133.65us. 具体做法可通过插入NOP指令或者调用delay()延时函数实现,不用太精确,只要估计插入的延时大于133.65us即可。
3.读取转换结果:由图6的下部“FIGURE 10B”可知,采样转换完毕后,在CS信号为低的前提下,将RD脚由高电平拉成低电平后,经过tACC的延时即可从DB脚读出有效的采样结果。
注:手册中给出了tACC的典型值和最大值分别为135ns和200ns,因此将RD引脚拉低后,等待大于200ns后即可从DB读出有效的转换结果。具体做法可通过插入NOP指令或者调用delay()延时函数实现,不用太精确,只要估计插入的延时大于200ns即可。
ADC0804手册给出的ADC转换时序图
图7:ADC0804手册给出的电器特性表
对采样值进行运算变换,换算出实际的滑动变阻器输入电压值。 对于任何一个A/D采样器而言,其转换公式如下:
五、ADC0804在单片机中的简单应用举例
如下图所示,本例ADC0804中的VCC=5V, VREF/2引脚悬空(悬空则相当于与VCC共接5V电源),因此ADC转换的参考电压为VCC的值,即5V。VIN-接地,而VIN+连接滑动变阻器RV1的输出,因此VIN+的电压输入范围为0V~5V,正好处于参考电压范围内。
引脚CS接地, WR和RD分别连接单片机的P3^6和P3^7引脚,而DB0~DB7连接单片机的P1口。
P0口接数码管的段选线,P2口低四位接数码管的位选线。
程序主要实现以下功能:
(1)控制ADC0804芯片对VIN(+)引脚输入的电压值进行正确采样,读取采样结果。
(2)对采样值进行模数变换,将转换后数字量后显示在4段数码管上。 C程序如下:
#include 《reg51.h》
#include 《intrins.h》
#define uint unsigned int
#define uchar unsigned char sbit wr=P3^6; sbit rd=P3^7;
uchar code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳显示代码
void delay(uint x) //延时函数 delay(1)延时0.992ms,大约为1ms {
uchar i;
while(x--)
for(i=0;i《120;i++);
void display(uchar db) //数码管显示函数,用于显示模数转换后得到的数字量 {
uchar bw,sw,gw; //bw,sw,gw分别等于db百位,十位,个位上的数 bw=db/100; sw=db%100/10; gw=db%10;
P2=0x01; //点亮第一只数码管
P0=dis[bw]&0x7f; //最高位置0,点亮第一只数码管的小数点, delay(5);
P2=0x02; //点亮第二只数码管 P0=dis[sw]; delay(5);
P2=0x04; //点亮第三只数码管 P0=dis[gw]; delay(5);
P2=0x08; //点亮第四只数码管
P0=dis[0]; //第四只数码管一直显示0 delay(5); }
void main() {
uchar i; while(1) { wr=0; //在片选信号CS为低电平情况下(由于CS接地,所以始终为低电平), _nop_(); //WR由低电平到高电平时,即上升沿时,AD开始采样转换
wr=1;
delay(1); //延时1ms,等待采样转换结束
P1=0xff; //这条语句不能少,我也还不知道为什么
rd=0; //将RD脚置低电平后,再延时大于135ns左右(这里延时1us),
_nop_(); //即可从DB脚读出有效的采样结果,传送到P1口
for(i=0;i《10;i++) //刷新显示一段时间
display(P1); //显示从DB得到的数字量
}
}
评论
查看更多