ADC0832 具有以下特点:
· 8位分辨率;
· 双通道A/D转换;
· 输入输出电平与TTL/CMOS相兼容;
· 5V电源供电时输入电压在0~5V之间;
· 工作频率为250KHZ,转换时间为32μS;
· 一般功耗仅为15mW;
· 8P、14P—DIP(双列直插)、PICC 多种封装;
· 商用级芯片温宽为0°C to +70°C,工业级芯片温宽为−40°C to +85°C;
ADC0832芯片接口说明:
· CS_ 片选使能,低电平芯片使能。
· CH0 模拟输入通道0,或作为IN+/-使用。
· CH1 模拟输入通道1,或作为IN+/-使用。
· GND 芯片参考0 电位(地)。
· DI 数据信号输入,选择通道控制。
· DO 数据信号输出,转换数据输出。
· CLK 芯片时钟输入。
· Vcc/REF 电源输入及参考电压输入(复用)。
ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。
单片机对ADC0832 的控制原理:
正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能,其功能项见下图。
当此2 位数据为“1”、“0”时,只对CH0 进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2 位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2 位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第3 个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
ADC0832具体时序图如下:
参考程序如下(该程序已在硬件上调试通过):
完整代码及hex文件下载:http://www.51hei.com/f/adc0832tt_c.rar
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit cs=P2^4;
sbit clk=P2^5;
sbit dout=P2^6; //din,dout两脚可以共同接一个I/O口,因为通信时并未同时有效,并且单片机接口是双向的
sbit din=P2^7;
uchar adconverse(bit channel)
{
uchar i,addata1,addata2;
clk=0;
cs=0;
_nop_();
din=1; //启动信号
_nop_();
clk=1; //pulse 1
_nop_();
clk=0;
_nop_();
din=1; //sgl ,单通道选择
_nop_();
clk=1; //pulse2
_nop_();
clk=0;
_nop_();
din=channel; //odd ,channel选择位,为0为channel 0,为1channel 1
_nop_();
clk=1; //pulse3
_nop_();
clk=0;
_nop_();
din=1;
for(i=8;i>0;i--)
{
clk=1;
_nop_();
clk=0;
_nop_();
if(dout)
//addata1=(addata1"dout)<<1; //dout是1位(bit),addata1是8位(Byte),不能直接按位或
addata1=(addata1<<1)|0x01; //左移
else
addata1=addata1<<1;
}
for(i=8;i>0;i--)
{
if(dout)
addata2=(addata2>>1)|0x80; //右移
else
addata2=addata2>>1;
clk=1;
_nop_();
clk=0;
_nop_();
}
cs=1;
din=1;
clk=1;
if(addata1==addata2) //校验
return addata1;
else
return 0;
}
void main()
{
while(1)
{
P1=adconverse(0); //选择channel 0
}
}
© 2010 IC邮购网 icyougou.com版权所有