在STM32F105和STM32F107互連型系列微控制器之前,意法半導(dǎo)體已經(jīng)推出STM32基本型系列、增強型系列、USB基本型系列、互補型系列;新系列產(chǎn)品沿用增強型系列的72MHz處理頻率。內(nèi)存包括64KB到256KB閃存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三種封裝,不同的封裝保持引腳排列一致性,結(jié)合STM32平臺的設(shè)計理念,開發(fā)人員通過選擇產(chǎn)品可重新優(yōu)化功能、存儲器、性能和引腳數(shù)量,以最小的硬件變化來滿足個性化的應(yīng)用需求。
AD7190是一款適合高精密測量應(yīng)用的低噪聲完整模擬前端。它集成一個低噪聲、24位Σ-Δ型模數(shù)轉(zhuǎn)換(ADC)。片內(nèi)低噪聲增益級意味著可直接輸入小信號。
AD7190性價比很高,出貨量大,用量也很大,供貨很穩(wěn)定,非常適用于中低速高精度的測試,如電子秤、應(yīng)變計、氣體分析、儀器儀表、壓力傳感器、血液分析、工業(yè)過程控制、醫(yī)療科學(xué)儀器等應(yīng)用。本人對AD7190做了一次比較測試,分享下測試的結(jié)果
硬件設(shè)計分析
從結(jié)構(gòu)圖可以看出來,AD7190是模擬區(qū)域與數(shù)字區(qū)域完全獨立的ADC,即AVDD給模擬區(qū)域供電,DVDD給數(shù)字區(qū)域供電,在原理圖設(shè)計方面按照官方指導(dǎo)文檔,需要對兩個區(qū)域做獨立的布線與隔離處理,才能讓信噪比最佳。另可靠的基準(zhǔn)電壓是高精度ADC命根,本次試驗選擇TI公司推出的REF5025作基準(zhǔn)參考,REF5025可低于3μVpp/V 噪聲、3ppm/°C 漂移,性能是十分出色的。
由于經(jīng)常做高頻類項目,十分討厭杜邦線/飛線測試方式,在高精度的領(lǐng)域,24位ADC梯度值2的2416777216,如果接入基準(zhǔn)電壓是2.5v,理論分辨率可達到0.149μV,做過高頻的工程師深知杜邦線的罪惡,根據(jù)上面的技術(shù)分析,哪怕線路被引入1μV的干擾,也可以讓精度打上一定折扣。為了讓ADS1232性能得以充分體現(xiàn),特意做了一個測試載板,載板的設(shè)計也是很關(guān)鍵,分割模擬數(shù)字區(qū)域同時,連接地方大量使用鉭電容做旁路電路,以把波紋抑制到最小,合理的布局與布線也很重要,敷銅區(qū)域也需要模數(shù)分離,以磁珠或者0-5R/電感隔開。
?時序圖解說
由時序圖看出來,AD7190讀寫是簡單的3線串行讀數(shù)方式,屬于Microwire串行接口,STM32的SPI接口可以完美的與之匹配,當(dāng)然也可以采用軟仿SPI替代STM32的硬件SPI,這樣的程序更具移植性。SPI時序?qū)崿F(xiàn)也相對簡單,AD7190的CS線僅僅只是做片選使用(上圖所示),而不用過多管理,保持低電平即可。特別需要注意的是在空閑時候,SCLK時鐘信號需要保持高電平,在SCLK半個周期當(dāng)DIN接收到0x58后轉(zhuǎn)換的數(shù)據(jù)才傳入到DOUT總線,這時候才能讀取數(shù)據(jù)。從時序圖上看,與AD7799十分類似的,只是延時上要稍做一些處理。
核心源碼
//寄存器列表
#define ComState_register (0)《《3
#define Mode_register (1)《《3
#define Config_register (2)《《3
#define Data_register (3)《《3
#define ID_register (4)《《3
#define GPOCON_register (5)《《3
#define Disorders_register (6)《《3
#define FullScale_register (7)《《3
//模式寄存器
#define MODE_ADC_OneByOne (0)《《21
#define MODE_ADC_OnlyOne (1)《《21
#define MODE_ADC_Free (2)《《21
#define MODE_ADC_SavePower (3)《《21
#define MODE_ADC_AdjustZero (4)《《21
#define MODE_ADC_AdjustFull (5)《《21
#define MODE_ADC_SysAdjustZero (6)《《21
#define MODE_ADC_SysAdjustFull (7)《《21
#define MODE_MCLK_OUTosc (0)《《18
#define MODE_MCLK_OUTclo (1)《《18
#define MODE_MCLK_IN (2)《《18
#define MODE_MCLK_INcloOut (3)《《18
#define MODE_SINC3 (1)《《15
#define MODE_ENPAR (1)《《13
#define MODE_Single (1)《《11
#define MODE_REJ60 (1)《《10
//#define MODE_Filter_Speed 0
//配置寄存器
#define Config_Chop_EN (1)《《23
#define Config_REFSEL_IO (1)《《20
#define Config_Burn_EN (1)《《7
#define Config_REFDET_EN (1)《《6
#define Config_BUF_EN (1)《《4
#define Config_UB_EN (1)《《3
#define Config_Ch0_A1A2 (1)《《8
#define Config_Ch1_A3A4 (1)《《9
#define Config_Ch2_temp (1)《《10
#define Config_Ch3_A2A2 (1)《《11
#define Config_Ch4_A1AC (1)《《12
#define Config_Ch5_A2AC (1)《《13
#define Config_Ch6_A3AC (1)《《14
#define Config_Ch7_A4AC (1)《《15
#define Config_ADC_Gain_1 0
#define Config_ADC_Gain_8 3
#define Config_ADC_Gain_16 4
#define Config_ADC_Gain_32 5
#define Config_ADC_Gain_64 6
#define Config_ADC_Gain_128 7
typedef struct {
u32 ADC_Mode;
u32 Return_state;
u32 ADC_SCLK;
u32 SINC3_EN;
u32 ENPAR;
u32 Single_EN;
u32 REJ60_EN;
u32 Filter;
}AD7190_MODE_SET;
typedef struct {
u32 Config_Channel;
u32 Config_ADC_Gain;
u32 Config_Chop; //斬波使能
u32 Config_REFSEL;
u32 Config_Burn;
u32 Config_REFDET;
u32 Config_BUF;
u32 Config_UB;
}AD7190_Config_SET;
//基本配置
void AD7190_config(void)
{
AD7190_MODE_SET Mode;
AD7190_Config_SET Config;
Config.Config_Channel = Config_Ch1_A3A4;
Config.Config_ADC_Gain = Config_ADC_Gain_1;
Config.Config_Chop = 1;
Config.Config_REFSEL = 0;
Config.Config_Burn = 0;
Config.Config_REFDET = 1;
Config.Config_BUF = 0;
Config.Config_UB = 1;
Mode.ADC_Mode = MODE_ADC_AdjustZero;
Mode.Return_state = 0;
Mode.ADC_SCLK = MODE_MCLK_IN;
Mode.SINC3_EN = 0;
Mode.ENPAR = 0;
Mode.Single_EN = 0;
Mode.REJ60_EN = 0;
Mode.Filter = 1;
}
//讀取轉(zhuǎn)換值
void ReadAD7190(unsigned char count, unsigned char *buf)
{
unsigned char i = 0;
unsigned char j = 0;
unsigned char RotateData = 0;
SET_SCL();
delay_us(1);
SET_CS();
delay_us(1);
CLR_CS();
delay_us(1);
for(j=count; j》0; j--)
{
for(i=0; i《8; i++)
{
CLR_SCL();
RotateData 《《= 1;
delay_us(1);
RotateData |= GP0DAT;
SET_SCL();
delay_us(1);
}
*(buf + j - 1)= RotateData;
RotateData=0;
}
SET_CS();
}
//初始化:
void AD7799_INIT(void)
{
unsigned long command;
command = AD7799_GetRegisterValue(AD7799_REG_CONF,2);
command &= ~AD7799_CONF_GAIN(0xFF);
command |= AD7799_CONF_GAIN(1);
AD7799_SetRegisterValue(AD7799_REG_CONF,command,2);
AD7799_SetReference();
command = AD7799_GetRegisterValue(AD7799_REG_CONF,2);
command &= ~AD7799_CONF_CHAN(0xFF);
command |= AD7799_CONF_CHAN(2);
AD7799_SetRegisterValue(AD7799_REG_CONF,command,2);
command = AD7799_GetRegisterValue(AD7799_REG_MODE,2);
command &= ~AD7799_MODE_SEL(0xFF);
command |= AD7799_MODE_SEL(0);// 連續(xù)轉(zhuǎn)換模式
AD7799_SetRegisterValue(AD7799_REG_MODE,command,2);
}
//讀數(shù)程序:
while (1)
{
adcbuf=ADC_Num();
if(ADC_Channel==1)//see datasheet AIN3 AIN4
{
adcA3A4[i++]=adcbuf;
if(i》Num)
{
i=0;
adcA3A4value=GetAverage(adcA3A4,Num);
AD7190_DataFormatting(adcA3A4value , 2.5 ,1);
DataLCD(AD7190_DataFormatting(adcA3A4value , 2.5 ,1));
}
}
}
作為一款中低速高精度的ADC,AD7190有著4.8kHz的轉(zhuǎn)換頻率,兩路差分輸入或四路偽差分輸入,是個不錯的選擇,相比于AD7799雖然價格略高一些,但是他比AD7799的性能提高不少,特別是采樣速率,測試看來,超高的性價比和出色的性能讓它在同級別的ADC中也有很強的競爭能力。
評論
查看更多