新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ADC0832双通道实现AD电压转换

ADC0832双通道实现AD电压转换

作者:时间:2012-08-25来源:网络收藏

点击浏览下一页
最近用到,发现网上的程序很多不能使用,存在各种各样的一些问题。现提供完整的C程序,供电子爱好者交流使用。

下面是关于的一些资料(部分资料来自互联网,但均经检验正确无误,放心使用):

是美国国家半导体公司生产的一种8 位分辨率、A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。

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;

芯片接口说明:
· 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置高电平禁用芯片,直接将转换后的数据进行处理就可以了。

具体时序图如下:

点击浏览下一页

参考程序如下(该程序已在硬件上调试通过):
完整代码及hex文件下载:http://www.51hei.com/f/adc0832tt_c.rar

#include reg52.h>       #include intrins.h>#define uchar unsigned charsbit 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=(addata11)|0x01;   //左移elseaddata1=addata11;}for(i=8;i>0;i--){ if(dout)addata2=(addata2>>1)|0x80; //右移elseaddata2=addata2>>1;clk=1;_nop_();clk=0;_nop_();   } cs=1;din=1;clk=1;   if(addata1==addata2) //校验return  addata1; elsereturn  0;}void main(){ while(1){P1=adconverse(0);    //选择channel 0}}
脉冲点火器相关文章:脉冲点火器原理


评论


相关推荐

技术专区

关闭