打印

请教AD7718的转换问题

[复制链接]
1610|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaosi204|  楼主 | 2009-9-15 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//===================AD==========================
#define sbi(sfr,bit) (_SFR_BYTE(sfr)|=_BV(bit))
#define cbi(sfr,bit) (_SFR_BYTE(sfr)&=~_BV(bit))
#define RESET_out() sbi(DDRE,PE1);//SERET--->output
#define RESET_out_1() sbi(PORTE,PE1);//SERET--->1
#define RESET_out_0() cbi(PORTE,PE1);//SERET--->0
#define SCLK_out() sbi(DDRE,PE0);//sclk--->output
#define SCLK_out_1() sbi(PORTE,PE0);//sclk--->1
#define SCLK_out_0() cbi(PORTE,PE0);//sclk--->0
#define CS_out() sbi(DDRF,PF0);//cs--->output
#define CS_out_1() sbi(PORTF,PF0);//cs--->1
#define CS_out_0() cbi(PORTF,PF0);//cs--->0
#define DIN_out()   sbi(DDRF,PF3)//din--->output
#define DIN_out_1() sbi(PORTF,PF3)//din--->1
#define DIN_out_0() cbi(PORTF,PF3)//din--->0
#define DOUT_in()   cbi(DDRF,PF2)//dout--->input
#define RDY_in()   cbi(DDRF,PF1)//rdy--->input
//--------------AD转换--------------------
uint32_t convert(void)
{
uint8_t i,j;
uint32_t adrd_data;
//----------------
RESET_out_0();//RESET=0
delay_us(1);
write_ad7718(0x03);//filter寄存器
write_ad7718(0xff);

write_ad7718(0x02);//control寄存器
write_ad7718(0x5f);//使用芯片上的AIN6通道,单极性2.56V的电压输入范围

write_ad7718(0x01);//mode寄存器
write_ad7718(0x23);//CHOP=0,REF2(+)-REF2(-)=5V的参考电源,连续时钟模式

while((PINF&0x01)!=1)//等待转换完成
{
//delay_us(1);
}
write_ad7718(0x44);//读DATA寄存器
delay_us(10);
CS_out_0();//cs=0
adrd_data=0;
SCLK_out_1();//SCLK=1
for(i=0;i<=23;i++)
  {
   SCLK_out_0();//SCLK=0
   delay_us(1);
   adrd_data=adrd_data<<1;
   adrd_data=adrd_data|(PINF&(1<<PF2));//DOUT
   delay_us(1);
   SCLK_out_1();//SCLK=1
   delay_us(1);
  }
CS_out_1();//cs=1
adrd_data=adrd_data&0x00ffffff;//数据修正
return adrd_data;
}
//---------------延时--------------------
void delay_us(uint16_t x)  //x=1对应3.03us
{
while(x)
{
  x--;
}
}
//-----------AD写数据------------------------
void write_ad7718(uint8_t data)
{
uint8_t i;
CS_out_0();//cS=0
SCLK_out_1();//SCLK=1
for(i=0;i<=7;i++)
{
  
  SCLK_out_0();//SCLK=0
  delay_us(1);
  if(data&0x80)
  DIN_out_1();//DIN=1
  else
  DIN_out_0();//DIN=0
  data<<=1;
  delay_us(1);
  SCLK_out_1();//SCLK=1
  delay_us(1);
}
CS_out_1();//cS=1
}
void main(void)
{
//----ad----
uint32_t t;
uint8_t i;
DIN_out();//DIN输出
DOUT_in();//DOUT输入
RDY_in();//RDY输入
CS_out();//CS输出
RESET_out();//RESET输出
SCLK_out();//SCLK输出
for(i=0;i<100;i++)
{
  t=convert();
}
while(1)
{
  ;
}

}

我用的是Atmega128控制24位的AD7718,将AD7718配置为8通道的输入模式,我选2.5V和0V的输入通道进行转换,运行上述程序,结果转换出来的值t一直是1677212(0xFFFFFC),请各位高手给予指点,谢谢!

相关帖子

沙发
xiaosi204|  楼主 | 2009-9-16 11:08 | 只看该作者
是不是没几个人用过AD7718的啊?

使用特权

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

本版积分规则

9

主题

22

帖子

0

粉丝