adc0804工作原理

AC-DC/DC-DC转换

116人已加入

描述

  集成A/D转换器品种繁多,选用时应综合考虑各种因素选取集成芯片。一般逐次比较型A/D转换器用的比较多,ADC0804就是这类单片集成A/D转换器。ADC0804是一款8位、单通道、低价格A/D转换器。工作电压:+5V,属于连续渐进式(Successive Approximation Method)的A/D转换器。

  1、ADC0804的管脚图及说明

adc0804

  Vin(+)、Vin(-):两个模拟信号输入端,可以接收单极性、双极性和差模输入信号。

  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

  ADC0804手册给出的ADC转换时序图
adc0804

  图7:ADC0804手册给出的电器特性表

  对采样值进行运算变换,换算出实际的滑动变阻器输入电压值。 对于任何一个A/D采样器而言,其转换公式如下:

adc0804

  五、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口低四位接数码管的位选线。

adc0804

  程序主要实现以下功能:

  (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得到的数字量

  }

  }

  Proteus仿真运行结果如下:

adc0804

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
FOREVERqu 2019-03-29
0 回复 举报
谢谢 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分