现要用AD7731芯片,采集DC0.5V~2.45V之间的电压,我接的电路图如下,但对AD7731的应用不是很明确,初次使用24位AD芯片,在网上寻找相关资源也没有,其中有几点不明确的地方:如下,请大家帮忙分析一下
1.我所采集的电压范围,按我的接图方式可行不,我看手册中,如果AIN-是+2.5V,AD7731的模拟输入电压范围是0~±1.28v,则AIN+输入的模拟输入范围是1.22~3.78v.所以,我将AIN-=1.316V左右,AD7731的模拟输入电压范围是0~±1.28v
则AIN+输入的模拟输入范围是0.036~2.596v,这样应用是否可以,不知我理解的对否。
2.我写了AD7731的C程序,初始化,写入、读出和读AD转换结果的函数,想请大家批阅以下,是否正确。我这边测试采集不到电压,实在找不出问题了。
//==============AD7731初始化
void Ad7731_Ini(void)
{
WriteByte_AD7731(0x03);/* 写通信寄存器,下一次对滤波寄存器进行操作*/
WriteByte_AD7731(0x80);//设置滤波寄存器,50HZ的输出频率
WriteByte_AD7731(0x00);
WriteByte_AD7731(0x10);//设置滤波寄存器,CHOP使能,交换模式
WriteByte_AD7731(0x02);
/* 写通信寄存器,下一次对模式寄存器进行操作*/
WriteByte_AD7731(0xa1);//内部满刻度校正,双极性操作
WriteByte_AD7731(0x74);//0~±1.28v输入范围,基准电压2.5v
/*写模式寄存器初始化内部满刻度校正是0~±1.28v输入范围,基准电压2.5v*/
while(AD7731_rdy);//等待RDY胶变低,表明校正周期结束
WriteByte_AD7731(0x02);/* 写通信寄存器,下一次对模式寄存器进行操作*/
WriteByte_AD7731(0x81);//内部零刻度校正,双极性操作
WriteByte_AD7731(0x74);//0~±1.28v输入范围,基准电压2.5v
/* 写模式寄存器初始化内部零刻度校正是0~±1.28v输入范围,基准电压2.5v*/
while(AD7731_rdy);//等待RDY胶变低,表明校正周期结束
WriteByte_AD7731(0x02);
/* Writes to Communications Register Setting Next Operation as Write to Mode Register*/
WriteByte_AD7731(0x21);//连续转换模式,选择数据寄存器的24位字长度
WriteByte_AD7731(0x74);
/* 写模式寄存器对0~±1.28v输入范围开始连续转换*/
while(AD7731_rdy);
/* Wait for RDY pin to go low to indicate end of calibration cycle*/
}
//==============AD7731写寄存器
void WriteByte_AD7731(uchar WriteData) //AD7731写寄存器
{
uchar i,temp;
AD7731_sclk=1;
temp=0x80;
for(i=0;i<8;i++)
{
AD7731_sclk=0;
//AD7730_drdy=0;
if((WriteData&0x80)==1)//取出最高位,51 单片机先输出LSB
AD7731_din_dout=1;
else
AD7731_din_dout=0;
WriteData=WriteData<<1;//取出次高位
AD7731_sclk=1;
}
//AD7731_din_dout=0;
}
//==============AD7731读寄存器
uchar ReadByte_Ad7731()//读取AD7731的一个字节
{
uchar i;
uint ReadData=0;
//AD7731_sclk=0;
AD7731_din_dout=0;
for(i=0;i<24;i++)
{
AD7731_sclk=0;
if(AD7731_din_dout==0)
ReadData=ReadData<<1;
else//(AD7731_din_dout)
{
ReadData=ReadData<<1;
ReadData=ReadData+0x01;
}
AD7731_sclk=1;
}
return(ReadData);
}
/********读AD转换结果***********/
long ReadAd7731ConverData(void)
{
long ConverData;
WriteByte_AD7731(0x11);//写通信寄存器,下一个操作从数据寄存器单次读转换结果
AD7731_din_dout=0;
while(AD7731_rdy)
/* Wait for RDY pin to go low to indicate end of calibration cycle等待DRY信号*/
{
if(!AD7731_rdy)
{
ConverData=0;
ConverData=ReadByte_Ad7731();
ConverData=ConverData<<8;
ConverData=ReadByte_Ad7731()+ConverData;
ConverData=ConverData<<8;
ConverData=ReadByte_Ad7731()+ConverData;
}
/* Read Conversion Result from AD7731's Data Register读取转换结果*/
}
WriteByte_AD7731(0x30);
/* Ends Continuous Read Operation and Places Part in Mode Where It
Expects Write to Communications Register结束读操作,使器件处于写通信寄存器所希望的模式*/
return(ConverData);
}
|