AD7705的操作.docx
- 文档编号:28601469
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:16
- 大小:49.48KB
AD7705的操作.docx
《AD7705的操作.docx》由会员分享,可在线阅读,更多相关《AD7705的操作.docx(16页珍藏版)》请在冰豆网上搜索。
AD7705的操作
AD7705的操作
我现在使用外部TL431(2.5V基准电压),电源电压为5V,外接晶体振荡器2.4576MHz,电路如下:
程序如下:
-------------------------- AD7705.H-----------------------------------
#ifndef_AD7705_H_
#define_AD7705_H_
//引脚定义
sbitAD7705_SCLK=P2^4;
sbitAD7705_DRDY=P2^5;
sbitAD7705_DOUT=P2^6;
sbitAD7705_DIN=P2^7;
//通讯寄存器地址定义
#defineWR_SETUP_REG0x10//选中设置寄存器,写
#defineRD_SETUP_REG0x18//选中设置寄存器,读
#defineWR_CLOCK_REG0x20//选中时钟寄存器,写
#defineRD_DATA_REG0x38//选中数据寄存器,读
#defineWR_OFFSET_REG0x60//选中offset寄存器,写
#defineRD_OFFSET_REG0x68//选中offset寄存器,读
#defineWR_FULL_REG0x70//选中fullscale寄存器,写
#defineRD_FULL_REG0x78//选中fullscale寄存器,读
#defineSYS_ZERO_CALI0x80//系统零校准模式
#defineSYS_FULL_CALI0xC0//系统满量程校准模式
#defineZERO_CALIBRATION0x00//系统零校准
#defineFULL_CALIBRATION0x01//系统满量程校准
#defineCLOCK_REG_SET0x04//CLOCK寄存器设置,无分频,50HZ输出更新速率
#defineDELAY(){_nop_();_nop_();_nop_();}
//函数声明
voidAD7705_Init(void);
voidAD7705_Reset(void);
voidAD7705_Start(void);
ucharAD7705_ReadByte(void);
voidAD7705_WritByte(uchard);
floatAD7705_ReadVol(void);
#endif
-------------------------- AD7705.C-----------------------------------
//****************************************************************************
//功能:
AD7705串行接口失步后将其复位。
复位后要延时500us再访问
//参数:
无
//返回:
无
//备注:
//****************************************************************************
voidAD7705_Reset(void)
{
uchardatai;
for(i=0;i<36;i++)
{
AD7705_SCLK=LOW;
AD7705_DIN=HIGH;//DIN端口连续写36个周期的高电平,保证复位
DELAY();
AD7705_SCLK=HIGH;
DELAY();
}
DelayMS
(1);//复位之后等待1MS
}
//****************************************************************************
//功能:
从AD7705读一个字节的数据
//参数:
无
//返回:
读到的一字节数据
//备注:
无
//****************************************************************************
ucharAD7705_ReadByte(void)
{
ucharidatai,d=0;
//读数据,高位在前
for(i=0;i<8;i++)
{
d<<=1;
AD7705_SCLK=LOW;
DELAY();
if(AD7705_DOUT)d++;
AD7705_SCLK=HIGH;
DELAY();
}
returnd;
}
//****************************************************************************
//功能:
往AD7705写1个字节数据
//参数:
要写入AD7705的数据
//返回:
无
//备注:
无
//****************************************************************************
voidAD7705_WriteByte(uchard)
{
ucharidatai;
for(i=0;i<8;i++)
{
AD7705_SCLK=LOW;
if(d&0x80)
AD7705_DIN=HIGH;
else
AD7705_DIN=LOW;
DELAY();
AD7705_SCLK=HIGH;
DELAY();
d<<=1;
}
}
//------------------------------------------------------------------------------------------
//功能:
先写offset寄存器,再写fullscale寄存器,然后启动7705进行单次转换
//参数:
//返回:
无
//备注:
//------------------------------------------------------------------------------------------
voidAD7705_Start(void)
{
//复位,防止接口迷失
AD7705_Reset();
//复位之后一定要重新设置各寄存器,复位之后默认状态为等待对通信寄存器的一次操作
//遵循先写命令,后写数据的原则,命令默认写到通信寄存器
//写OFFSET寄存器
AD7705_WriteByte(WR_OFFSET_REG);
AD7705_WriteByte(0xFF);
AD7705_WriteByte(0xFF);
AD7705_WriteByte(0xFF);
AD7705_WriteByte(0xFF);
//写满量程校准寄存器
AD7705_WriteByte(WR_FULL_REG);
AD7705_WriteByte(0xFF);
AD7705_WriteByte(0xFF);
AD7705_WriteByte(0xFF);
AD7705_WriteByte(0xFF);
AD7705_WriteByte(WR_CLOCK_REG);//nextwritetoclockreg,AIN1,00100000
AD7705_WriteByte(0x00);//CLKDIS=0,CLKDIV=0,CLK=0,FS1=0,FS2=000010000
AD7705_WriteByte(WR_SETUP_REG);//nextwritetosetupreg,AIN100010000
AD7705_WriteByte(0x04);//正常状态启动装换,GAIN=1,B/U=0,BUF=0,FSYNC=0,增益=1,双极性
}
voidAD7705_Init(void)
{
//复位,防止接口迷失
AD7705_Reset();
AD7705_WriteByte(WR_CLOCK_REG);//nextwritetoclockreg,AIN1,00100000
AD7705_WriteByte(0x10);//CLKDIS=0,CLKDIV=0,CLK=0,FS1=0,FS2=000010000
//外部主时钟频率为2.4576MHz
AD7705_WriteByte(WR_SETUP_REG);//nextwritetosetupreg,AIN100010000
AD7705_WriteByte(0x44);//SELF-CAL,GAIN=1,B/U=0,BUF=0,FSYNC=0,自校准模式,增益=1,双极性
}
floatAD7705_ReadVol(void)
{
ucharidataadc_1_h=0,adc_1_l=0;
uintidataADValue=0;
floatidatavol;
AD7705_Start();
while(AD7705_DRDY);
AD7705_WriteByte(RD_DATA_REG);//READFROMDATAREG,AIN1
adc_1_h=AD7705_ReadByte();
adc_1_l=AD7705_ReadByte();
ADValue|=adc_1_h;
ADValue<<=8;
ADValue|=adc_1_l;
vol=ADValue/65535.0*2480;
returnvol;
}
调用AD7705_ReadVol这个函数, 读取通道1的电压,读到的数值变化很大,从19~2000多mV,每次读到的数据都不一样.实际
上通道1电压用外用表量AN1+和AN1-(7,8脚)为1600mV,为什么相差这么大,奇怪的,大家帮忙看看
相关帖子>>>:
帮我看看程序哪里有问题?
我怀疑是程序错误,电压跳动幅度太大了,不正常 (0字)fangfang[3次]2008-7-2217:
23:
52
程序没看出什么问题,我原来REF+没对地接电容,也是用431,电流4mA左右,跳动大约500个字,加电容,很少跳,一个字,16bit(0字)coody[4次]2008-7-2217:
33:
23
加了电容了,10uF和104,还是不管用,你的程序和电路呢,参考一下(0字)fangfang[3次]2008-7-2217:
53:
31
顶一下(0字)fangfang[2次]2008-7-2222:
35:
00
coody,你是怎么初始化的啊,是不是我的初始化程序不对(0字)fangfang[3次]2008-7-235:
48:
02
我的非常简单(524字)coody[5次]2008-7-2312:
23:
36
Sendto7706(0x23); //nextwritetoclockreg,AIN3
Sendto7706(0x0c); //CLKDIS=0,CLKDIV=1,CLK=1,FS1=0,FS0=0
Sendto7706(0x13); //nextwritetosetupreg,AIN3
Sendto7706(0x44); //SELF-CAL,GAIN=1,B/U=1,BUF=0,FSYNC=0
后面就可以读了
设置时钟寄存器的时候应该怎么设置?
(11962字)fangfang[3次]2008-7-2312:
51:
09
我用的晶体振荡器是2.4576MHz的根据手册上写,Zero0~Zero3都应该是0,CLKDIS在初始化的时候禁止(CLKDIS=1),阻止MCLK
OUT引脚上的输出
,
CLKDIV位是时钟分频器,我现在用的是2.4576MHz,那就不需要分频,CLKDIV=0即可
CLK时钟位则根据AD7705的工作频率而设置,手册上说如果转换器主时钟频率为2.4576MHz(CLKDIV=0),或4.9152MHz
(CLKDIV=1),CLK位应该置为0
FS1和FS0为滤波器选择位,它与CLK一起决定AD7705的输出更新率,我现在选择20Hz输出更新率
根据以上设置,时钟寄存器值为0x00
但我照手册,初始化AD7705后,读取转换数据,居然每次都是2500mV,ADValue=0xFFFF,改变输入电压,也不行
初始化函数如下:
voidAD7705_Reset(void)
{
ucharidatai;
for(i=0;i<36;i++)
{
AD7705_SCLK=LOW;
AD7705_DIN=HIGH; //DIN端口连续写36个周期的高电平,保证复位
DELAY();
AD7705_SCLK=HIGH;
DELAY();
}
DelayMS
(1); //复位之后等待1MS
}
//****************************************************************************
//功能:
从AD7705读一个字节的数据
//参数:
无
//返回:
读到的一字节数据
//备注:
无
//****************************************************************************
ucharAD7705_ReadByte(void)
{
ucharidatai,d=0;
//写数据的时候不需要判断忙,只有读数据的时候才需要
while(AD7705_DRDY);
//读数据,高位在前
for(i=0;i<8;i++)
{
d<<=1;
AD7705_SCLK=LOW;
DELAY();
if(AD7705_DOUT)d++;
AD7705_SCLK=HIGH;
DELAY();
}
returnd;
}
//****************************************************************************
//功能:
往AD7705写1个字节数据
//参数:
要写入AD7705的数据
//返回:
无
//备注:
无
//****************************************************************************
voidAD7705_WriteByte(uchard)
{
ucharidatai;
for(i=0;i<8;i++)
{
AD7705_SCLK=LOW;
if(d&0x80)
AD7705_DIN=HIGH;
else
AD7705_DIN=LOW;
DELAY();
AD7705_SCLK=HIGH;
DELAY();
d<<=1;
}
}
//****************************************************************************
//功能:
AD7705初始化时钟寄存器
//参数:
无
//返回:
无
//****************************************************************************
voidAD7705_InitClockRegister(void)
{
AD7705_WriteByte(0x20); //写ch0clockregister
AD7705_WriteByte(0x00); //2.4576MHz时钟,20Hz数据更新速率
AD7705_WriteByte(0x21); //写CH1clockregister
AD7705_WriteByte(0x00); //2.4576MHz时钟,20Hz数据更新速率
}
//****************************************************************************
//功能:
AD7705初始化设置寄存器
//参数:
Channel--输入通道1=AIN1,2=AIN2;
// Polarity--输入极性,0=双极性,1=单极性;
// Gain--PGA增益,[1,2,4,8,16,32,64,128]
// Buf-缓冲模式
// Fsync-滤波器同步
//返回:
无
//****************************************************************************
void AD7705_InitSetupRegister(ucharChannel,ucharMode,ucharGain,bitPolarity,bitBuff,bitFsync)
{
ucharidatacmd=0;
//comregister,选择下步操作setupregister
if(Channel==AD7705_CH1) AD7705_WriteByte(0x10);
elseif(Channel==AD7705_CH2)AD7705_WriteByte(0x11);
if(Polarity)cmd|=0x04;
else cmd|=0x00;
if(Buff) cmd|=0x02;
else cmd|=0x00;
if(Fsync) cmd|=0x01;
else cmd|=0x00;
cmd|=Mode;
switch(Gain)
{
case1:
cmd|=0x00;break;
case2:
cmd|=0x08;break;
case4:
cmd|=0x10;break;
case8:
cmd|=0x18;break;
case16:
cmd|=0x20;break;
case32:
cmd|=0x28;break;
case64:
cmd|=0x30;break;
case128:
cmd|=0x38;break;
default:
cmd|=0x00;break;
}
AD7705_WriteByte(cmd);
}
voidAD7705_Init(void)
{
//复位,防止接口迷失
AD7705_Reset();
AD7705_InitClockRegister();
AD7705_InitSetupRegister(AD7705_CH1,0x40,1,AD7705_BIPOLAR,AD7705_ENBUFF,AD7705_DISFSYNC);
AD7705_InitSetupRegister(AD7705_CH2,0x40,1,AD7705_BIPOLAR,AD7705_ENBUFF,AD7705_DISFSYNC);
AD7705_WriteByte(RD_DATA_REG); //READFROMDATAREG,AIN1
AD7705_ReadByte();
AD7705_ReadByte();
}
floatAD7705_ReadVol(void)
{
ucharidataadc_1_h=0,adc_1_l=0;
uint idataADValue=0;
floatidatavol;
// 每次读取数据前,重新设置一下设置寄存器
AD7705_InitSetupRegister(AD7705_CH1,0x00,1,AD7705_BIPOLAR,AD7705_ENBUFF,AD7705_DISFSYNC);
//读取通道1数据
while(AD7705_DRDY);
AD7705_WriteByte(0x38);
adc_1_h=AD7705_ReadByte();
adc_1_l=AD7705_ReadByte();
ADValue|= adc_1_h;
ADValue<<=8;
ADValue|= adc_1_l;
vol=ADValue/65535.0*2480;
returnvol;
}
再顶一下,急啊,好几天了,还是不行(0字)fangfang[2次]2008-7-2313:
13:
16
芳芳,你的2.4576MHz是直接由7705震荡吗?
如果是,CLKDIS要为0,否则停止震荡,不工作.只有用外部时钟驱动时,才可以禁止(0字)coody[3次]2008-7-2313:
29:
20
看了电路,要CLKDIS=0才能正常(0字)[coody][0次]2008-7-2313:
32:
37(0字)coody[4次]2008-7-2313:
35:
04
是啊,我在时钟寄存器里面也确实设置CLKDIS=0了,但还是没有用(28字)fangfang[2次]2008-7-2313:
54:
00
还有,如何判断晶振已经起振?
R2电阻太大了。
(0字)fengsnowse[4次]2008-7-2222:
51:
26
R2是2K啊,况我测量AD7705的第9脚,电压为2.48V左右,应该正常的啊(0字)fangfang[3次]2008-7-237:
06:
11
照我上面的电路图,应该是选择双极性输入吧(18字)fangfang[3次]2008-7-2312:
19:
33
B/U=0对么?
单双都可以,我一般用单,程序可以处理双(0字)coody[2次]2008-7-2313:
36:
20
REF+对地接100uF电容和0.1uF电容,我的这样才能不跳,你试试(0字)coody[2次]2008-7-2217:
01:
54
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AD7705 操作