首页 > 编程知识 正文

adc0809模数转换实验报告,protel99se原理图生成pcb

时间:2023-05-06 15:06:07 阅读:61241 作者:2260

普中51开发板,XPT2046芯片实现模数转换。 protues仿真是在ADC0808上实现AD数模转换实验完成的。 总结。 这些是做实验时自己收集整理总结的资料。 在下面共享

XPT2046芯片:

因为XPT2046功能很多,所以这里只介绍如何使用这个芯片完成模数转换的实验。

XPT2046为典型的逐次逼近型模数转换器(SAR ADC),包含采样/保持、模数转换、串行数据输出等功能,使用该芯片可以完成本次实验的模数转换内容。

在这次实验中,我们使用了XPT芯片的电压模式。 首先,查看下图,了解芯片的针脚和功能。 操作的针脚为DCLK、CS非、DIN、DOUT。

附上开发板ADC模块原理图。

我们主要了解和使用红色背后网络的几个引脚:

了解了领先优势后,让我们看看如何使用和控制这些领先优势以实现目标

所以,接下来要看到的是时序工作图,要理解芯片是如何工作的,如何完成样本以保持量化码的几个步骤。

一次完整转换需要24个串行同步时钟(DCLK )。 (查看DCLK序列,一共出现了3次8、8、8, 3*8=24 ) )。

要启动并选择此芯片,必须先将CS和CLK设置为0,然后开始写入数据。 这是因为单片机的默认引脚输出1

处理器和转换器之间的通信需要8个时钟周期,并且可以使用同步串行接口,如SPI、SSI和Microwire。 前面的八个表在通信。

前8个时钟用于从DIN引脚输入控制字节。

首先,让我们来看看DIN的时机。 (图中有几个英语单词。 Idle是空闲的意思,aquire是获取的意思,conversion是转换的意思。 个人理解是,图中将DIN在24个时钟周期内的变化分为几个段、空闲段、获取段和转换段。 ) DIN的控制位有8位。 以下从最高位开始介绍

控制字的开头必须为1,即S=1。 在XPT2046的DIN引脚检测到开始位之前,所有输入都将被忽略。

A2-A0的选择是在单端模式下工作,所以选择XP输入。 为什么是XP输入将在后面叙述。 因此,A2-A0可以选择001或011。 两者都可以选择XP输入。 下图:

来看看单端模式下的原理图。 (因为XP连接到输入,所以选择XP输入工作。 )

MODE :在模式选择位中,设定ADC的分辨率。 MODE=0,下一个转换为12位模式; MODE=1,以下转换为8位模式。 我选的是8个人

SER/DFR非:控制参照源模式,选择单端模式(SER/DFR非=1)或差分模式。 在单端模式下,转换器的基准电压固定为相对于GND引脚的VREF电压

PD0和PD1 :控制停电和内部基准电压配置的关系。 我选择了PD1和PD0都为0 (低功率模式)。 下图:

DIN的控制字节处理完成后,转换器进入转换状态,输入采样保持器进入保持状态,在触摸屏驱动器停止动作(单端动作模式) 12个时钟后,真正的模数转换完成。

该芯片的AD是逐次逼近式AD,逐次逼近式AD转换器中有逐次逼近寄存器SAR,其数字量由其生成。

附加图像:

SAR采用对数搜索法生成数字量,以8位数字量为例,SAR首先生成8位数字量的一半,即b=1000000,探索模拟量Vi的大小。 VoVi的情况下,最高位很明确; 反之,则保留最高位。 确认最高位后,SAR又用对数搜索法确定下一个最高位,即用7位数字量的一半1000000(y在前一个过程中确认)探测模拟量Vi的大小。 这样,转换结束,直到bit0确定。

上述说明可能不太能想象,举个具体的例子吧。 模拟量经过内部DA转换得到的数字量108进制转换为01101100 (暂时称为a )。 首先在100000与a进行比较,如果a小于1000000,则第一位为0,剩下,开始时比较高位,如果a大于或等于01000000,则保留高位,下一位继续比较,a大于01100000,下一位留下1

介绍ADC0808/0809

ADC0808芯片介绍:

内部结构和外部引脚:

ADC0808/0809的内部结构和外部引脚分别如图11.19和图11.20所示。 内部各部分的作用和工作原理已经在内部结构图中清楚,这里不再赘述,下面只对各引脚的定义进行如下划分。 http://www.Sina.com/http://www.Sina.com /

(1) IN0~IN7——8通道模拟输入通过三条地址译码线ADDA、ADDB、ADDC选通一条通道。

) D7~D0——A/D转换后的数据输出端子为三态控制输出,因此可直接连接微处理器的数据线。 8比特的排列顺序中D7为最高位,D0为最低位。

)3) ADDA、ADDB、ADDC——模拟通道选择地址信号,a

DDA为低位,ADDC为高位。地址信号与选中通道对应关系如表11.3所示。
(4)VR(+)、VR(-)——正、负参考电压输入端,用于提供片内DAC电阻网络的基准电压。在单极性输入时,VR(+)=5V,VR(-)=0V;双极性输入时,VR(+)、VR(-)分别接正、负极性的参考电压。
(5)ALE——地址锁存允许信号,高电平有效。当此信号有效时,A、B、C三位地址信号被锁存,译码选通对应模拟通道。在使用时,该信号常和START信号连在一起,以便同时锁存通道地址和启动A/D转换。
(6)START——A/D转换启动信号,正脉冲有效。加于该端的脉冲的上升沿使逐次逼近寄存器清零,下降沿开始A/D转换。如正在进行转换时又接到新的启动脉冲,则原来的转换进程被中止,重新从头开始转换。
(7)EOC——转换结束信号,高电平有效。该信号在A/D转换过程中为低电平,其余时间为高电平。该信号可作为被CPU查询的状态信号,也可作为对CPU的中断请求信号。在需要对某个模拟量不断采样、转换的情况下,EOC也可作为启动信号反馈接到START端,但在刚加电时需由外电路第一次启动。
(8)OE——输出允许信号,高电平有效。当微处理器送出该信号时,ADC0808/0809的输出三态门被打开,使转换结果通过数据总线被读走。在中断工作方式下,该信号往往是CPU发出的中断请求响应信号。

ADC 0808/0809工作时序:

ADC 0808/0809的工作时序如图11.21所示。
当通道选择地址有效时,ALE信号一出现,地址便马上被锁存,这时转换启动信号紧随ALE之后(或与ALE同时)出现。START的上升沿将逐次逼近寄存器SAR复位,在该上升沿之后的2μs加8个时钟周期内(不定),EOC信号将变低电平,以指示转换操作正在进行中,直到转换完成后EOC再变高电平。微处理器收到变为高电平的EOC信号后,便立即送出OE信号,打开三态门,读取转换结果。

END

有什么地方不对的地方,欢迎指出。

开发板实验代码:

/******************************************************************功能:数码管前2位显示AD字符,后三位电位器的数字量,最后三位显示对应电压值实体机接线:1,单片机-->AD/DAC模块 P34-->DIP35-->CSP36-->CLP37-->DO2,单片机-->动态数码管模块(P0端口)J22-->J6(动态数码管段选)P20-->J9(A)P21-->J9(B)P22-->J9(C) ******************************************************************/#include "reg52.h" //单片机头文件#include<intrins.h> //含_nop_()函数#define uchar unsigned char#define uint unsigned intsbit LSA=P2^0;sbit LSB=P2^1;sbit LSC=P2^2;sbit DIN=P3^4; //串口输入sbit CS=P3^5; //片选sbit CLK=P3^6; //时钟脉冲sbit DOUT=P3^7; //串口输出uchar disp[8]; //储存读取的数据的每个位数,由数码管输出uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(uint i)//延时子程序,因为本程序的延时不需要到ms级别,所以没有用之前的用法{while(i--);}void SPI_Write(uchar dat)//dat传输的是9C这个控制指令{uchar i;CLK = 0;for(i=0;i<8;i++)//DIN是串行数据输入口,需要一位位读取数据{DIN = dat >> 7; //这里DIN取dat的最高位dat <<= 1;//次高位左移一位变为最高位,方便下一次DIN读取数据CLK = 0;//软件给予一个上升沿时序,用来放置数据_nop_();CLK = 1;}}uint SPI_Read(){uint i, dat=0; //dat用来存放读取的数据CLK = 0;for(i=0; i<8; i++)//接收8位数据,DOUT是串行数据输出,也是需要一个个读取{dat <<= 1;//左移一位CLK = 1;//软件给予一个下降沿时序,因为数据是在CLK为下降沿的时候移出_nop_();CLK = 0;dat |= DOUT; //与DOUT相或,读取数据}return dat;//返回数据}uint Read_AD_Data(uchar cmd){uchar i;uint AD_Value;CLK = 0; //默认引脚输出1,这里要先软件置0 CS = 0; //置0选中,启动ADSPI_Write(cmd);//写入数据for(i=6;i>0;i--);//延时等待转换结果CLK=0;_nop_();CLK = 1; //发送一个正脉冲,清除BUSY ,表示可以开始转换了_nop_(); CLK = 0;_nop_();_nop_();AD_Value=SPI_Read(); //AD_Value存放数据CS = 1;//CS拉高,读取完毕return AD_Value;}void datapros(){uint temp,val;uchar i;if(i==50){temp = Read_AD_Data(0x9c);/*0x9c是给DIN输入控制字节,9c=10011100,具体的每一位是什么作用可以看芯片手册*/val=temp*100/51;//原来式子是(((temp*5*100)/255)),把temp先扩大100倍然后乘以5除以255得到电压值;}i++;disp[0]=0x77;//显示Adisp[1]=0x5e;//显示Ddisp[2]=smgduan[temp/100];//百位disp[3]=smgduan[temp/10%10];//十位disp[4]=smgduan[temp%10];//个位disp[5]=smgduan[val/100] |0x80;//与0x80相或来得到小数点disp[6]=smgduan[val/10%10];disp[7]=smgduan[val%10];}void DigDisplay(){uchar i;for(i=0;i<8;i++){switch(i) //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位case(4):LSA=0;LSB=0;LSC=1; break;//显示第4位case(5):LSA=1;LSB=0;LSC=1; break;//显示第5位case(6):LSA=0;LSB=1;LSC=1; break;//显示第6位case(7):LSA=1;LSB=1;LSC=1; break;//显示第7位}P0=disp[i];//发送数据delay(100); //间隔一段时间扫描P0=0x00;//消隐}}void main(){while(1){datapros(); //数据处理函数DigDisplay();//数码管显示函数}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。