文档详情

模数转换器ADC应用原理

s9****2
实名认证
店铺
DOCX
27.48KB
约10页
文档ID:379576508
模数转换器ADC应用原理_第1页
1/10

AD0809应用原理――很全面的资料1 . 0809的芯片说明:ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件它是逐次逼近式 A/D转换器,可以和单片机直接接口1) ADC0809的内部逻辑结构由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个 A/D转 换器和一个三态输出锁存器组成 多路开关可选通8个模拟通道,允许8路模拟量分 时输入,共用A/D转换器进行转换三态输出锁器用于锁存 A/D转换完的数字量,当 OE端为高电平时,才可以从三态输出锁存器取走转换完的数据2) .引脚结构IN0 —IN7: 8条模拟量输入通道ADC0809对输入模拟量要求:信号单极性,电压范围是 0 —5V,若信号太小,必 须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需 在输入前增加采样保持电路地址输入和控制线:4条ALE为地址锁存允许输入线,高电平有效当 ALE线为高电平时,地址锁存 与译码器将A, B, C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟 量进转换器进行转换A, B和C为地址输入线,用于选通IN0 —IN7上的一路模拟量 输入。

通道选择表如下表所示选择的1CBA通道000IN0001IN1[010IN2011IN3100IN4101IN5|110IN6111IN7数字量输出及控制线:11条ST为转换启动信号当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平EOC为转换结束信号当EOC为高电平 时,表明转换结束;否则,表明正在进行 A/D转换OE为输出允许信号,用于控制 三条输出锁存器向单片机输出转换得到的数据OE = 1,输出转换得到的数据;OE=0,输出数据线呈高阻状态D7-D0为数字量输出线CLK为时钟输入信号线因ADC0809的内部没有时钟电路,所需时钟信号必须由外 界提供,通常使用频率为500KHZ ,VREF ( + ) , VREF (-)为参考电压输入2 . ADC0809应用说明(1) . ADC0809内部带有输出锁存器,可以与 AT89S51单片机直接相连2) .初始化时,使ST和OE信号全为低电平3) .送要转换的哪一通道的地址到 A, B, C端口上4) .在ST端给出一个至少有100ns宽的正脉冲信号5) .是否转换完毕,我们根据EOC信号来判断。

6) .当EOC变为高电平时,这时给 OE为高电平,转换的数据就输出给单片机 了3 .实验任务如下图所示,从ADC0809的通道IN3输入0 —5V之间的模拟量,通过 ADC0809转 换成数字量在数码管上以十进制形成显示出来ADC0809的VREF接+ 5V电压4 .电路原理图5 .程序设计:(1) .进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若 完毕则把数据通过P0端口读入,经过数据处理之后在数码管上显示2) .进行A/D转换之前,要启动转换的方法:ABC = 110选择第三通道ST = 0, ST = 1, ST = 0产生启动转换的正脉冲信号.(3) .关于0809的计算:ad0809是根据逐位逼近的方法产生数据的参考电压为0-5V的话以0809八位255的转换精度每一位的电压值为(5-0)/255 =0.0196V设输入电压为X则:X-27*0.0196>=0 WJAD7=1 否WJ AD7=0X-26*0.0196>=0 WJAD6=1 否WJ AD6=0X-20*0.0196>=0 WJAD0=1 否WJ AD0=027指2的7次方2620同理)若参考电压为0-1V(1-0)/255 =0.0039涮度自然高了。

可测量范围小了1)汇编源程序:CH EQU 30HDPCNT EQU 31HDPBUF EQU 33HGDATA EQU 32HST BIT P3.0OE BIT P3.1EOC BIT P3.2ORG 00H LJMP START ORG 0BH LJMP T0X ORG 30H START: MOV CH,#0BCH MOV DPCNT,#00H MOV R1,#DPCNT MOV R7,#5 MOV A,#10MOV R0,#DPBUFLOP: MOV @R0,A INC R0 DJNZ R7,LOP MOV @R0,#00H INC R0MOV @R0,#00H INC R0MOV @R0,#00HMOV TMOD,#01HMOV TH0,#(65536-4000)/256MOV TL0,#(65536-4000) MOD 256SETB TR0SETB ET0SETB EA WT: CLR ST SETB ST CLR ST WAIT: JNB EOC,WAIT SETB OE MOV GDATA,P0 CLR OE MOV A,GDATA MOV B,#100 DIV AB MOV 33H,AMOV A,B MOV B,#10 DIV AB MOV 34H,A MOV 35H,B SJMP WT T0X: NOP MOV TH0,#(65536-4000)/256 MOV TL0,#(65536-4000) MOD 256 MOV DPTR,#DPCD MOV A,DPCNT ADD A,#DPBUF MOV R0,A MOV A,@R0 MOVC A,@A+DPTR MOV P1,A MOV DPTR,#DPBT MOV A,DPCNT MOVC A,@A+DPTR MOV P2,A INC DPCNT MOV A,DPCNT CJNE A,#8,NEXT MOV DPCNT,#00H NEXT: RETI DPCD: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH,00H DPBT: DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH END2) C语言源程序#includeunsigned char code dispbitcode□"{0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f);unsigned char code dispcode□"{0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsigned char dispbuf[8]={10,10,10,10,10,0,0,0}; unsigned char dispcount;sbit ST="P3"A0;sbit OE="P3"A1;sbit EOC="P3"A2;unsigned char channel="0xbc";//IN3 unsigned char getdata;void main(void){TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;TR0=1;ET0=1;EA=1;P3=channel;while(1){ST=0;ST=1;ST=0;while(EOC==0);OE=1;getdata=P0;OE=0;dispbuf[2]=getdata/100;getdata=getdata%10;dispbuf[1]=getdata/10;dispbuf[0]=getdata%10;}}void t0(void) interrupt 1 using 0{TH0=(65536-4000)/256;TL0=(65536-4000)%256;P1=dispcode[dispbuf[dispcount]];P2=dispbitcode[dispcount];dispcount++;if(dispcount==8){dispcount=0;}}3) FPGA 实现的程序:(verilog)module AD0809(clk, //脉宽(至少 100ns)rst_n, EOC, //约100us后EOC变为高电平转换结束 START, //启动信号,上升沿有效(至少100ns) OE, //高电平打开三态缓冲器输出转换数据 ALE, //高电平有效,选择信道口ADDA,〃因为ADDB,ADDC都接地了,这里只有ADDA为变量DATA,// //转换数据 DATA_R);outputSTART,OE,ALE,ADDA;inputEOC,clk,rst_n;input[7:0] DATA;output[7:0] DATA_R;regSTART,OE,ALE,ADDA;reg[7:0] DATA_R;reg[4:0] CS,NS;parameter IDLE=5"b00001,START_H=5”b00010,START_L=5”b00100, CHECK_END=5"b01000,GET_DATA=5"b10000;always @(*)case(CS)IDLE:NS=START_H;START_H:NS=START_L;START_L:NS=CHECK_END;CHECK_END:if(EOC)NS=GET_DATA; elseNS=CHECK_END;GET_DATA:NS=IDLE;default:NS=IDLE;endcasealways @(posedge clk)if(!rst_n)CS<=IDLE;elseCS<=NS;always @(posedge clk)case(NS)IDLE:beginOE<=0;START<=0;ALE<=0;ADDA<=1;endSTART_H:beginOE<=0;START<=1; 〃产生启动信号ALE<=1;ADDA<=1;〃 选择信道口 IN0endSTART_L:beginOE<=0;START<=0;ALE<=1;〃启动信号脉宽要足够长,在启动的时候ALE要一直有效 endCHECK_END:beginOE<=0;START<=0;ALE<=0;endGET_DATA:beginOE<=1;//高电平打开三态缓冲器输出转换数据DATA_R<=DATA;//提取转换数据START<=0;ALE<=0;enddefault:beginOE<=0;START<=0;ALE<=0;ADDA<=0;endendcaseendmodule4) FPGAS现的程序:(VHDLLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY AD0809 ISPORT( D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK,EOC: IN STD_LO GIC;CLOCK:IN STD_LOGIC;。

下载提示
相似文档
正为您匹配相似的精品文档