AD7705程序
(1)DRDY邏輯不要搞反,高電平時等待轉(zhuǎn)換狀態(tài),低電平為可以讀取轉(zhuǎn)換數(shù)據(jù)
(2)系統(tǒng)校準時輸入信號要大于所選量程的4/5,否則校準不到32767。
(3)校準時要等待一定的時間,讀取數(shù)據(jù)也一樣,不能超過轉(zhuǎn)換速率。
(4)一般的應用只要內(nèi)部校準,這個很簡單,只要初始化就可以。如果測量范圍不是芯片的范圍,可以通過系統(tǒng)校準來實現(xiàn),滿量程校準電壓要大于量程的4/5
#include
#include
#include"ad7705.h"
#include"main.h"
#include"crc16.h"
#include"Usart.h"
//針對四個量程的設置寄存器的設置內(nèi)容
//(1)對于單極性V級別輸入0-5V、0-20mA、0-10V這三個量程,輸入范圍為0-2V,無極性,增益為1,緩沖模式--0-2V
//(2)對于雙極性V級別輸入+-2.5V、+-5V這兩個量程,輸入范圍為+-1V,雙極性,增益為2,緩沖模式--+-2V
//(3)對于雙精度mV級別輸入+-500mV,增益為4,雙極性,緩沖模式--+-2V
//(4)對雙精度mV級別+-50mV,增益為32,雙極性,緩沖模式--+-1.6V
//------MD1(0)MD0(0)G2(0)G1(0)G0(0)B/U(0)BUF(0)FSYNC(0)--------------------------//
constunsignedchartext_of_setup[4]={0X04,0X08,0X10,0X28};//非緩沖模式,數(shù)字濾波同步
//constunsignedchartext_of_setup[4]={0X06,0X0A,0X12,0X2A};//緩沖模式,數(shù)字濾波同步
externvolatileunsignedcharcommand[7];//校準命令全局數(shù)組
externvolatileunsignedcharscale;//記錄系統(tǒng)量程
externvolatileunsignedcharNO_CALI_TYPE;//未校準類型
externvolatileunsignedlongintZS,GS;//當前量程的校準系數(shù)
externvolatileunsignedchartime_count;//超時標志
//----------------------------------------------------------------------------
//函數(shù):reset_AD7705
//功能:AD7705串行接口失步后將其復位。復位后要延時500us再訪問
//參數(shù):無
//返回:無
//變量:無
//備注:無
//----------------------------------------------------------------------------
voidreset_AD7705(void)
{
unsignedchari;
AD_DIN1;
for(i=0;i<36;i++)
{
AD_CLK0;
asm("nop");
asm("nop");
asm("nop");
AD_CLK1;
asm("nop");
asm("nop");
asm("nop");
}
_delay_ms(1);
}
//------------------------------------------------------------------------------------------
//函數(shù):read_AD7705_byte
//功能:從AD7705讀一個字節(jié)的數(shù)據(jù)
//參數(shù):無
//返回:讀到的一字節(jié)數(shù)據(jù)
//變量:無
//備注:無
//------------------------------------------------------------------------------------------
unsignedcharread_AD7705_byte(void)
{
unsignedchardata=0;
unsignedchari=0;
for(i=0;i<8;i++)
{
data<<=1;
AD_CLK0;
asm("nop");
asm("nop");
asm("nop");
if(AD_DOUT)
{
data++;
}
AD_CLK1;
asm("nop");
asm("nop");
asm("nop");
}
returndata;
}
//------------------------------------------------------------------------------------------
//函數(shù):read_AD7705_word
//功能:從AD7705讀一個字的數(shù)據(jù),共16bit
//參數(shù):無
//返回:讀到的一字節(jié)數(shù)據(jù)
//變量:無
//備注:無
//------------------------------------------------------------------------------------------
unsignedintread_AD7705_word(void)
{
unsignedintdata=0;
unsignedchari=0;
for(i=0;i<16;i++)
{
data<<=1;
AD_CLK0;
asm("nop");
asm("nop");
asm("nop");
if(AD_DOUT)
{
data++;
}
AD_CLK1;
asm("nop");
asm("nop");
asm("nop");
}
returndata;
}
//------------------------------------------------------------------------------------------
//函數(shù):read_AD7705_dword
//功能:從AD7705讀一個24的數(shù)據(jù)
//參數(shù):無
//返回:讀到的一字節(jié)數(shù)據(jù)
//變量:無
//備注:AD7705是一個24位AD,選定刷新頻率在16.7HZ下,有效位是19位,暫時讀出全部24位數(shù)據(jù)
//------------------------------------------------------------------------------------------
unsignedlongintread_AD7705_dword(void)
{
unsignedlongdata=0;
unsignedchari=0;
for(i=0;i<24;i++)
{
data<<=1;
AD_CLK0;
asm("nop");
asm("nop");
asm("nop");
if(AD_DOUT)
{
data++;
}
AD_CLK1;
asm("nop");
asm("nop");
asm("nop");
}
returndata;
}
//------------------------------------------------------------------------------------------
//函數(shù):write_AD7705_byte
//功能:往AD7705寫8位數(shù)據(jù)
//參數(shù):IN-uint8_tdata,要寫入AD7705的數(shù)據(jù)
//返回:無
//變量:無
//備注:無
//------------------------------------------------------------------------------------------
voidwrite_AD7705_byte(unsignedchardata)
{
for(unsignedchari=0;i<8;i++)
{
AD_CLK0;
if(data&0x80)
AD_DIN1;
else
AD_DIN0;
asm("nop");
asm("nop");
asm("nop");
AD_CLK1;
asm("nop");
asm("nop");
asm("nop");
data<<=1;
}
AD_DIN1;
}
//------------------------------------------------------------------------------------------
//函數(shù):write_AD7705_dword
//功能:往AD7705寫24位數(shù)據(jù),因為AD7705是24位的器件
//參數(shù):IN-int32_tdata,要寫入AD7705的數(shù)據(jù)
//返回:無
//變量:無
//備注:無
//------------------------------------------------------------------------------------------
voidwrite_AD7705_dword(unsignedlongintdata)
{
for(unsignedchari=0;i<24;i++)
{
AD_CLK0;
if(data&0x800000)
AD_DIN1;
else
AD_DIN0;
asm("nop");
asm("nop");
asm("nop");
AD_CLK1;
asm("nop");
asm("nop");
asm("nop");
data<<=1;
}
AD_DIN1;
}
評論