AVR單片機驅動(dòng)高精度AD芯片ADS1256的C程序
#include
#include
/*************************************************************************************/
volatile void delay_us(unsigned char a) //挺時(shí)1uS
{
volatile unsigned int i=0,j=0;
for(i=0;ifor(j=0;j<50;j++)
;
}
/*************************************************************************************/
//ads126發(fā)送一字節的數據
unsigned char ads_senddata(unsigned char data) //SPI發(fā)送數據,要在外部保證SS = 0
{
SPDR =data; //啟動(dòng)數據傳輸
while((SPSR & 0x80) == 0); // 等待傳輸結束
data = SPDR;
return data;
}
/*************************************************************************************/
void ad_write(unsigned char reg,unsigned char data)//寫(xiě)寄存器。選擇寄存器地址,寫(xiě)入的數據。
{
PORTB&=~(1<
ads_senddata(0x50+reg);//選擇寫(xiě)入寄存器
ads_senddata(0x00); //寫(xiě)入1個(gè)寄存器
ads_senddata(data); //寫(xiě)入數據
PORTB|=(1<
}
/*************************************************************************************/
unsigned long int ad_read()//讀A/D數據。
{
unsignedlongintsum=0;
unsigned char r=0,a=0;
PORTB&=~(1<
ads_senddata(0xff); //WAKEUP 喚醒,并啟動(dòng)AD轉換
while((PIND&0X8)!=0); //DRDY信號低時(shí)才能寫(xiě)寄存器 ,等待轉換完畢
{
delay_us(1); //挺時(shí)1uS
ads_senddata(0x01); //發(fā)送讀取數據命令
delay_us(1); //挺時(shí)1uS
for (r=0;r<3;r++) //讀取24位數據
{
a=ads_senddata(0x00); //讀取數據,先高位,后低位
sum|=a;
sum=sum<<8;
}
sum=sum>>8;
}
PORTB|=(1<
returnsum;
delay_us(1); //挺時(shí)1uS
}
/*************************************************************************************/
void ADS1256(void) //初始化ADS1256
{
DDRD&=~(1<
ad_write(01,0x80); //初始化MUX reg 單端輸入第0通道為選通
ad_write(02,0x00); //初始化ADCOM reg時(shí)鐘輸出關(guān)閉,傳感器檢測關(guān)閉,放大倍數為1
ad_write(03,0xf0); //初始化DRATE reg 數據速率為30K
ad_write(04,0x0f); //初始化DRATE reg 定義IO為輸出高電平,節能模式
}
評論