ADS1248 暫存器配置和通道轉換
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引腳才能配置暫存器。