打印

AD7731应用

[复制链接]
2042|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
现要用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);
}

IMG0190A.jpg (441.05 KB )

IMG0190A.jpg

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

191

帖子

1

粉丝