基于C52控制的ADC0832应用详解

时间:2022-10-23 03:45:48

基于C52控制的ADC0832应用详解

摘要:A/D转换器是数字化测量和显示仪表的重要组成部分,其转换速度、精度和分辨率,直接影响着测量结果和显示的质量指标。本文通过一个8位的adc0832芯片的使用介绍A/D转换的具体控制方法。在控制过程中,主要是清楚单片机与ADC0832芯片管脚的连接,以及它们之间的信号传输。对ADC0832芯片的工作时序、数据信号端口的设置,在编写控制代码时,要严格按照时序图进行。

关键词:分辨率 工作时序 端口设置 控制代码 时序图

中图分类号:TN792 文献标识码:A 文章编号:1007-9416(2013)03-0005-02

A/D转换器是数字化测量和显示仪表的重要组成部分,其转换速度、精度和分辨率,直接影响着测量结果和显示的质量指标。本文通过一个8位的ADC0832芯片的使用介绍A/D转换的具体控制方法。

ADC0832是使用非常普遍的8位D/A转换器,其最高分辨可达256级,由于其片内有输入数据寄存器,故可以直接与单片机接口。ADC0832以电流形式输出,当需要转换为电压输出时,可外接运算放大器。ADC0832主要特性:

(1)分辨率8位。

(2)电流建立时间1μS。

(3)数据输入可采用双缓冲、单缓冲或直通方式。

(4)输出电流线性度可在满量程下调节。

(5)逻辑电平输入与TTL电平兼容。

(6)单一电源供电(+5V~+15V)。

(7)低功耗,20mW。

1 单片机与ADC0832的连接

(图1)

芯片接口介绍:

CS_片选使能,低电平芯片使能。CH0模拟输入通道0,或作为IN+/-使用。CH1模拟输入通道1,或作为IN+/-使用。GND接地。DI数据信号输入,选择通道控制。DO数据信号输出,转换数据输出。CLK芯片时钟输入。Vcc/REF电源输入及参考电压输入(复用)(图2)。

一般情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但是,由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。

2 工作时序图分析

(图3)

当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。

当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。CS使能端置于低电平时,芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。

在第1个时钟脉冲的下降之前DI端必须是高电平,表示启始信号。

在第2、3个脉冲下降之前DI端应输入2位数据用于选择通道功能:

(1)当2位数据为“1、0”时,只对CH0进行单通道转换。

(2)当2位数据为“1、1”时,只对CH1进行单通道转换。

(3)当2位数据为“0、0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。

(4)当2位数据为“0、1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。

注:本文中当此2位数据置为“1、0”,只对CH0进行单通道转换。

到第3个脉冲的下降之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。

从第4个脉冲下降开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下降DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下降输出DATD0。随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束,将CS置高电平禁用芯片。

最后,直接将转换后的数据先进行校验处理。若接收的8位数据与接收的反8位数据相等,则数据接收成功,否则,数据无效,重新接收。

3 C语言实现A/D转换源代码

#include

#define uchar unsigned char

#define uint unsigned int

sbit cs=P1^6;

sbit scl=P1^3;

sbit sda=P1^4;

bit SGL; //定义两个位标量为ADC0832的DI输入,设置转换通道

bit ODD;

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=50;y>0;y--);

}

void main()

{

uint i;

uchar flag,temp1,temp2;//temp1接收8位数据,

//temp2接收反8位数据

//flag标志位,标志一次接收数据接收完成,

//并经过校验。

flag=1;//标志位初始化。

while(1)

{

while(flag)

{

scl=0;//起始信号

delay(1);

cs=0;//A/D芯片开始工作

delay(1);

sda=1;

delay(1);

scl=1;//第一个下降沿

delay(1);

scl=0;

//选择通道

SGL=1;

sda=SGL;

scl=1;//第二个下降沿

delay(1);

scl=0;

ODD=0;

sda=ODD;

scl=1;//第三个下降沿

delay(1);

scl=0;

delay(1);

for(i=0;i

{

scl=1;

delay(1);

scl=0;

delay(1);

temp1

if(sda)

temp1++;

}

for(i=0;i

{

scl=1;

delay(1);

scl=0;

delay(1);

temp2>>=1;

if(sda)

temp2+=0x80;

}

cs=1;//一次A/D转换结束,禁止芯片工作

delay(1);

scl=1;

if(temp1=temp2)//与校验数据比较,

flag=0; //正确就将flag置0,

//否则重新采集数据。

}

P0=temp1;//将数据赋给P0口,控制流水灯亮灭。

flag=1;//flag在完成一次成功的数据接收后,

//在大循环中必须重新复制。

//不然只能进行一次数据接收,

//不能进入数据接收循环。

delay(200);

}

}

参考文献

[1]王瑞玲.A/D转换器的原理分析与比较.《科技广场》,2009年第11期.

[2]冯晓江,青丰.浅谈DAC0832的应用.《硅谷》,2009年 第19期.

[3]章玲,温洪明.数据采集系统设计.《机电产品开发与创新》,2011年 第05期.

上一篇:家庭中的WiFi 技术 下一篇:并机DX中波发射机射频源板载波频率信号产生电...