51单片机中用ADC0804模数转换电子线路的一个问题

我看了数字电路的书,上面有这么一段说明看不懂:
ADC0804的零点无需调整。满刻度调整时,先给输入端加入电压VIN+,使满刻度所对应的电压值 Vin+=Vmax-[1.5*(Vmax-Vmin)/256]
其中Vmax是输入电压的最大值,Vmin是输入电压的最小值。当输入电压与VIN+值相当时,调整VREF/2端电压值是输出码为FEH或FFH。
参考电压的调节
在使用A/D转换器时,为保证其转换精度,要求输入电压满量程使用,如输入电压动态范围较小,则可调节参考电压VREF,以保证小信号输入时ADC0804芯片8位的转换精度。

那个公式中的Vin+、Vmax、Vmin、Vref这几个值各代表什么意思?用通俗一点的方法来说。还有那个公式的应用能举一个实例吗?

第1个回答  2012-03-15
Vin+:输入模拟量电压值,0-5V
Vmax:输入模拟量电压最大值,一般是+5V
Vmin:输入模拟量电压最小值,一般是0V
Vref:参考电压,一般是2.5V、

////////////////////////////////////////////////////////////////////////
//名称:单片机控制ADC0804模数转换实现电压测量(0~5V)
//作者:飞星科技 http://hi.baidu.com/saishm
//芯片:AT89S52
//晶振:12M
//编译器:伟福6000
//日期:2007-08-23
////////////////////////////////////////////////////////////////////////
//控制口定义//////////////////////
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ad0_7 P0 //AD数据口
sbit cs=P1^0; //芯片选择信号,控制芯片的启动和结果读取,低电平有效
sbit rd=P1^1; //读数据控制,低电平有效
sbit wr=P1^2; //AD转换起动控制,上升沿有效
sbit intr=P1^3; //AD转换结束输出低电平
uchar led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//5ms延时子程序/////////////////
void delay(uint i)
{ uint j;
for(;i>0;i--)
for(j=0;j<410;j++);
}
//启动AD转换子程序//////////////////////////////////////////////////////////
void start_ad(void)
{ cs=0; //允许进行A/D转换
wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换
while(intr); //查询转换结束产生INTR 信号(低电平有效)
cs=1; //停止AD转换
}
//读A/D数据子程序///////////////////////////////////////
read_ad()
{ uint ad_data;
ad0_7=0xff;
cs=0; //允许读
rd=0; //读取转换数据结果数据结果
_nop_();
ad_data=ad0_7; //把数据存到ad_data中
rd=1;cs=1; //停止A/D读取
return(ad_data);
}
//数据处理与显示子程序//////////////////////////////////////
//说明:当输入电压为5V时,A/D输出为FFH,即输入电压=AD数据*(5/255)=AD数据/(255/5)=AD数据/51
// 用四位数码管进行显示,数码管的A~H接于P3口,公共端从最低位是P2.0,最高位是P2.3
void data_shout(uint ad_data)
{ uint a=50,one,two,three,four;
four=ad_data/51; //第四位数码管(最高位)
three=ad_data%51*10/51; //第三位数码管
two=ad_data%51*10%51*10/51; //第二位数码管
one=ad_data%51*10%51*10%51*10/51; //第一位数码管(最低位)
while(a--)
{ P3=led[one];
P2=0xfe;
delay(1);
P3=led[two];
P2=0xfd;
delay(1);
P3=led[three];
P2=0xfb;
delay(1);
P3=led[four]-0x80; //显示小数点
P2=0xf7;
delay(1);
}
}
int main(void)
{ while(1)
{ start_ad(); //启动AD
data_shout(read_ad()); //读AD数据并显示
}
}追问

Vin+=Vmax-[1.5*(Vmax-Vmin)/256]
那这个公式不就没有意义了吗?ADC0804最小输入电压和最大输入电压不都是0-5V吗?也就是说
Vin+就是5-[1.5*(5-0)/256]=4.97V了,那还要这个计算公式做什么啊?
另:如果输入的模拟量是0-3V,那么如果想满量程使用的话,是不是要将Vref调为1.5V这样?
求解答。

追答

Vin+=Vmax-[1.5*(Vmax-Vmin)/256]
Vin+就是5-[1.5*(5-0)/256]=4.97V
这个公式是在调试电位器时,调量程(整定)时用的。
如果0-3V就改VREF好了。
http://bbs.ednchina.com/BLOG_ARTICLE_125070.HTM
http://www.51c51.com/TEST/XL1000/xl1000613.htm

追问

你的意思是不是说,0-5V输入范围的ADC0804芯片,理论上4.97V时,输出就会为FFH,但是有时要微调一下Vref,使其能可靠的输出FFH是吧?是不是这么个意思?

追答

http://wenku.baidu.com/view/c04959ef4afe04a1b071de0c.html

ADC0804模数转换芯片使用的一些问题
3.比如要做4-20mA电流环的采样,可以串个250R的电阻,则Vmax=20mA×250R=5V,Vmin=4mA×250R=1V,Vin+=5V-[1.5×(5V-1V)\/256]=4.98V 4.能实现。需产生一个2V参考连至Vin(-)管脚 5.N=(Vin\/Vref)*2^n 中的Vin指的是管脚Vin(+)和Vin(-)之间的差 ...

51 AD转换,用ADC0804,数据接P1.0-1.7,例子要求读取数据前先用P1=0Xf...
改写为1后,这个口上的电平才会1,或者说,不会把这个口拉低。作为输入口时,要事先写1,也可以不用每次都写,只要里面不是0就成。简单的来说就是:因为单片机的构造(上拉了电阻),需要将P1口写1,使之成为高电平,能够作为输入口。

查找ADC0804模数转换芯片的基本资料,并设计交互式控制转换电路,画出...
 步骤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发出信号以...

51单片机AD采样后如何转换成PWM
不是很明白你为什么要把数据转换成PWM信号输出,如果你想这么做的话,可以直接用串口把单片机读到的数据输出

ADC0809和ADC0804的区别?
主要区别是 :(1)0809 是八通道模数转换器,0804是单通道;(2)0809经常用外部提供时钟来工作,一般用500kHZ(比如可以在51单片机晶振是12MHZ时,经过51单片机的ALE引脚经过74ls74组成的四分频电路后的频率给0809,使其工作),而0804主要通过外围RC震荡电路提供工作频率(记得典型电路中是10K的电阻和...

用单片机控制的连续可调基准源怎么做啊
3.电流取样:采用8位模数转换芯片(ADC0804)作为显示电流的模数转换器件,ADC0804的取样电压由串联在电源输出电路的电流取样电阻(0.1Ω)分压取得,并由运放按一定倍数放大后送至Vin(+), ADC0804把转换结果送至单片机的P1口,再由程序将数据处理后送LCD1602显示当前电流。4。过流保护;当短路或电流超过...

ADC0804\/0809的采样率是多少?
看你用多大的频率,就可以算出来了。转换后的数据是8位的,也有13位的这个要看老兄是用什么处理芯片了,要是用单片机(51)就是8位的。那个SRAM是多大我想8K应该就可以了,这点是我估计的。具体还用什么问题,或者是绝的有答案有问题可以发邮件给我zhangzhen212000@yahoo.com.cn ...

求51单片机实现AD转换及串口数据发送的程序?谢谢了!
delay(1);} void main(){uchar a;uint temp=0,sum=0;P3=0xdf;\/\/令AD 片选CS一直为选通状态 P1=0xff;while(1){ for(a=255;a>0;a--){ display(A1,A2,A3,A4);} wr=1;_nop_();wr=0;_nop_();wr=1;_nop_();rd=1;_nop_();rd=0;_nop_();temp=P1;rd=1;temp=(temp...

用51单片机和adc0809测量输入信号的有效值或者峰峰值的程序
给你一个51单片机读取模拟信号并转换成数字信号的例程,峰峰值什么的自己再根据需求自己加条件判断吧。include<reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit adrd=P3^7; \/\/IO口定义sbit adwr=P3^6;sbit diola=P2^5;sbit dula=P2^6;sbit wela=P2^...

求dac0832与51单片机接口电路图,
fXn[i]=(sin(PI*2*i\/N*15000)+1)*5;} } float FIR(){ float fSum;fSum=0;for(i=0;i<N;i++) fSum+=(fXn[i]*fHn[i]);return(fSum);} void da0832(){ unsigned char i;da_cs=0;\/\/da转换输出使能标志置位 da_wr1=0;\/\/输入寄存器的官写选通信号,表示单片机要传送数据...

相似回答