1. 程式人生 > >ADS1248 暫存器配置和通道轉換

ADS1248 暫存器配置和通道轉換

ADS1248是TI的一款 24位delta-sigma(ΔΣ) 、2KSPS、8通道(4通道差分)ADC晶片。TI官方有RTD設計方案,參考文件做了一板4通道3線PT100溫度採集。除錯ADS1248過程中遇到一些問題,記錄下來方便以後使用。 參考程式碼: ADS1x4x Firmware Example Code 1》在配置暫存器的時候一定要注意將START引腳拉高在配置,否則配置不成功。

2》在配置過程中不要配置FSC暫存器(滿量程校準暫存器),最開始誤將FSC暫存器配置為0,結果讀出來的AD數值都是0,除錯了幾天才發現讀寫程式碼都對就是因為FSC暫存器配置出錯

3》在讀暫存器和寫暫存器的時候注意命令的高4位如下圖:


讀暫存器時命令格式:RREG = 0x20 | (rrrr & 0x0F) ;//rrrr表示讀取的暫存器地址

寫暫存器時命令格式:WREG = 0x40 | (rrrr & 0x0F) ;//rrrr表示寫入的暫存器地址

4》暫存器配置:

        MUX0               = 0x01,        //MUX0   預設AINP-0通道   AINN-1通道(差分輸入)
        VBIAS              = 0x00,        //VBIAS  


        MUX1               = 0x28,        //MUX1   開啟內部參考電壓  使用REFP1和REFN1引腳電壓做基準參考電壓
        SYS0                = 0x25,        //SYS0     4倍增益  速率2000SPS

        IDAC0             = 0x06,        //IDAC0   IDAC1 和 IDAC2 各輸出 1ma
        IDAC1             = 0x89,        //IDAC1   IDAC1在IEXC1輸出  IDAC2在IEXC2輸出 
        GPIOCFG        = 0x00,        //GPIOCFG
        GPIODIR        = 0x00,        //GPIODIR
        GPIODAT        = 0x00,        //GPIODAT

注意不要配置FSC暫存器。

如果使用內部恆流源需要一直開啟內部參考電壓( MUX1[6:5],開啟內部參考電壓後在晶片的VREFOUT和VREFCOM引腳會輸出2.048V的電壓(注意引腳處需要有濾波電容),

5》SPI設定:

驅動晶片用的STM32,在設定SPI時分頻256,模式為0或者1發現都可以讀取資料。但是參考ADS1248的時序應該是SCLK下降沿取樣資料(SPI_CPOL = SPI_CPOL_Low,CPHA = SPI_CPHA_2Edge//SPI1模式)如下圖:



6》DRDY引腳:

DRDY:資料準備引腳,平時為高電平,在轉換開啟前為高電平,轉換開始後可以查詢該引腳,如果AD轉換結束該引腳會輸出低電平,此時讀取AD資料該引腳回覆高電平。時序可以參考上圖


7》START引腳:

START:如果使用單次AD轉換隻需要將該引腳拉高在拉低就可以,時序入下圖:


圖中Tstart時間如下圖計算:


//at lease 3*Tosc=0.75us

//tSTART Pulse duration, START high 3 tCLK

        //tCLK = 1 / fCLK. The default clock frequency fCLK = 4.096 MHz. =>0.244us


8》使能一次AD取樣

s32 ExternalADC_StartConvert(u8 nAdChNum)
{
u8 arrBuf[3];
u8 nCount = 0;
s32 nReault = 0;

ADS1248SetCurrentDACOutput(ADS1248_IDAC_OFF);
//選擇通道
ADS1248_Channel(nAdChNum);
ADS1248SetCurrentDACOutput(ADS1248_IDAC_1000);

//開始轉化
ADS1248SetStart(1);
//at lease 3*Tosc=0.75us
//tSTART Pulse duration, START high 3 tCLK
//tCLK = 1 / fCLK. The default clock frequency fCLK = 4.096 MHz. =>0.244us
delay_us(10);

ADS1248SetStart(0);

//等待完成

ADS1248WaitForDataReady(0);

nReault = ADS1248ReadData();
printf("AD%1d:%d\r\n",nAdChNum, nReault);
return nReault;
}

9》通道切換:

static void ADS1248_Channel(u8 nChNum)
{
u8 nWriteData = 0;
switch (nChNum)
{
case 0:
SelectCurrentChannels(0);
//first take default readings for AIN0+ and AIN1- channel1
nWriteData = 0x01;//AIN0 positive and AIN1 negative
break;
case 1:
SelectCurrentChannels(1);
//second channel
nWriteData = 0x25;//AIN4 positive and AIN5 negative
break;
case 2:
SelectCurrentChannels(2);
//third channel
nWriteData = 0x37;//AIN6 positive and AIN7 negative
break;
case 3:
SelectCurrentChannels(3);
//fourth channel
nWriteData = 0x13;//AIN2 positive and AIN3 negative
break;
default:
SelectCurrentChannels(0);
//first take default readings for AIN0+ and AIN1- channel1
nWriteData = 0x01;//AIN0 positive and AIN1 negative
break;
}
ADS1248SetStart(1);
//切換通道
ADS1248WriteSequence(ADS1248_0_MUX0, 1, &nWriteData);
ADS1248SetStart(0);

}

注意要拉高Start引腳才能配置暫存器。