現在很多智能測量儀表要求具有超高精度的電壓信號,同時要求高穩定性、高線形度和低噪聲、低溫度漂移。這樣的模擬系統設計面臨復雜的工程技術挑戰,常規的方法是采用多個較低分辨率的DAC和大量分立元件與支持IC整合在一起,同時伴隨著相當大的開發風險和高代價的修改時間,才能優化電路參數、減小誤差和設計出復雜的自動校準電路,這樣不僅增加了硬件設計的復雜性,通常達到的精度也不是很高。本系統設計的基于STM32微處理器和AD5791的20位超高精度測量系統中,實現了單路超高精度可調電壓信號的輸出,輸出電壓信號的幅值可以通過軟件來設置。該系統可靠性高,不需要校準電路。
STM32F2, STM32F4, STM32F7, STM32H7,STM32L0, STM32L1,ST,STM32F0,STM32F1,STM3,STM32F407IG,STM32F103ZET6單片機解密
AD5791是美國ADI公司推出的一款高性能的單路20位電壓輸出數模轉換器, 它是業界首款具有真正1 ppm(百萬分之一)分辨率和精度的DAC器件 [1-2] 。雙極工作電壓高達33 V。同時AD5791具有1 ppm的分辨率和精度、低噪聲(l ppm以下)、快速刷新率(1 us)和非常低的輸出漂移(在l ppm以下)。該器件采用了多功能三線串行接口,并與SPI、QSPI TM 、microWIRE TM 和DSP接口標準兼容。該器件集成了一個上電復位電路,以確保DAC輸出能達到0V,并保持在已知輸出阻抗狀態,直到有效寫入為止。該器件還提供了一個輸出鉗位功能,這使得其輸出在一個限定的負載狀態。綜上知,采用該款芯片,減少了復雜校準算法的必要性,能極大地簡化設計任務、減少開發和維護成本,同時降低風險。國內相關學者在精密電壓源和醫療儀器中也得到了應用 [3-4] 。
本系統的 Cortex-M3處理器為意法半導體公司推出的32位RISC處理器 STM32F103VCT6,主頻最高可達72 MHz,應用也比較廣泛 [5] 。該處理器具有256KB的程序存儲器,48 KB的RAM,同時它有8個定時器、5路串口、3路SPI、2路I2C,具有獨立看門狗和窗口看門狗,非常適合于與AD5791構成高精度的測量系統。
1 硬件電路設計
數模轉換電路中采用了1片參考電壓基準產生芯片REF02AZ、1片超高精度雙路軌至軌輸出運算放大器AD8676、1片高精度單路軌至軌輸出運算放大器AD8675和20位超高精度數模轉換芯片AD5791構成。該電路性能穩定,運行效果非常好。下面對電路進行詳細分析。
AD5791中,VDD為+15 V,VSS為-15 V。VREFPS和VREFPF用以提供AD5791的正參考電壓輸入,輸入范圍5V到VDD-2.5 V,本測試系統中使用了+5 V的參考電壓。VREFNS和VREFNF用以提供AD5791的負參考電壓輸入,輸入范圍VSS+2.5到0 V,本測試系統中使用了-5 V的參考電壓。AD5791的工作電壓為3.3 V。+5 V參考電壓由參考電壓產生芯片REF02AZ產生,負電壓是通過由OP177構成的單位增益反向放大器來實現。
AD5791有7個用于與STM32處理器進行通訊的引腳,下面逐一作詳細介紹:
RESET/:復位引腳,可以實現AD5791的復位;
CLR/:清零引腳,可以將AD5791內部DAC寄存器的值恢復到用戶定義的值,并更新DAC的輸出;
LDAC/:用于更新AD5791內部DAC寄存器的值,并更新DAC的輸出;
SDO:串行數據輸出引腳;
SDIN:串行數據輸入引腳;
SCLK:串行通訊時鐘信號輸入引腳,最高頻率可高達35 MHz;
SYNC/:串行輸入數據的幀同步信號;
由于STM32處理器采用了I/O口模擬SPI通訊的方式,所以通訊控制引腳可以連接到空余的STM32處理器的任何一個I/O引腳上,只要做相應配置就可以。其中,AD8675構成電壓跟隨器,作為AD5791的輸出緩沖。硬件電路上模擬地和數字地分開,并在一點接地,同時各個
都加有濾波電容,以消除干擾。
2 軟件設計
系統采用模擬SPI總線
,軟件的關鍵是STM32處理器和 AD5791之間的時序匹配,輸出電壓值到AD5791的DAC寄存器的值的計算,下面分別進行詳細介紹。
2.1 AD5791芯片配置
AD5791的配置,主要在于AD5791的控制寄存器的配置。為了使得AD5791和STM32處理器匹配使用,需要做如下配置,具體控制寄存器相關介紹和操作參見手冊。DBn(n=1…9)代表控制寄存器的第n位。
DB1 RBUF=1 內部運算放大器關閉
DB2 OPGND=0 將DAC輸出下拉到地的功能切換掉,使得DAC處于正常模式
DB3 DACTRI=0 使DAC處于正常操作模式
DB4 BIN/2sC=1 使用直接二進制編碼,不使用二進制補碼編碼的形式
DB5 SDODIS=0 SDO數據輸出使能
DB6-DB9 LIN_COMP=0 參考電壓輸入范圍選擇為10 V
按照上述的配置,將相應配置字寫入到AD5791的控制寄存器內部,AD5791就可以正常工作了。此處值得注意的是DB4位,一定要選擇好相應的編碼形式,否則輸出電壓會和計算值不符合。
2.2 ST M 32接口配置
STM32處理器的SPI 發送和接收都采用的是I/O口模擬的方式,因此I/O的初始化比較簡單,除了DAC1_SDO網絡標號的引腳設置為輸入模式外,其他通訊用的引腳都設置為輸出模式。
2.3 數模轉換輸出
數模轉換輸出,主要涉及3個子程序,芯片上電初始化子程序,芯片控制寄存器初始化子程序和電壓輸出子程序3個部分。下面給出AD5791讀寫函數和測試的例子。
u32 AD5791_Read(void)//讀取的24bit的數據
{
unsigned int i,j;
u32 data,c;
data=0;
AD5791_sync_0();
AD5791_sclk_0();
for(i=0;i<24;i++)
{
j=3;
data=data<<1;
AD5791_sclk_1();
while(j--);
c=GET_AD5791_SO();
AD5791_sclk_0();
data=data|c;
}
AD5791_sclk_0();
AD5791_sync_1();
return(data);
}
void AD5791_Write(unsigned long OutData) //寫一
個24 bit的數值
{
unsigned char i;
unsigned long value;
value = OutData & 0x00ffffff; //取低24bit
value = value<<8; //左移8位,ok
AD5791_ldac_1();
AD5791_sclk_1();
AD5791_sync_1();
AD5791_sync_0();
for ( i = 0; i < 24; i ++ )
{
AD5791_sclk_1();
ad5791delay();
if((value & 0x80000000) == 0x80000000)
{
AD5791_sdin_1();
}
else
{
AD5791_
sdin_0();
}
ad5791delay();
AD5791_sclk_0();
ad5791delay();
value = value << 1;
}
AD5791_sync_1();
ad5791delay();
AD5791_ldac_0();
ad5791delay();
AD5791_ldac_1();
ad5791delay();
}
/*入口參數:outvalue 輸出的電
壓的值*/
void test_ad5791(double outvalue)
{
double temp=0.0;
long temp1=0;
Ad5791_gpio_init(); //AD5791 I/O口初始化
Ad5791_clr_init();//AD5791 清零
Reset_ad5791(); //AD5791 復位
Write_ad5791_control_register();//寫AD5791的控
制寄存器
temp=((outvalue+5.0)*1048575.0)/10.0;//計
算DAC輸出值
temp1=(long)temp | 0x00100000;
Write_ad5791_dac_register(temp1);//寫AD5791的
dac寄存器,同時輸出相應電壓
}
程序中對AD5791芯片進行相應初始化以及寫AD5791的相應寄存器都采用I/O模擬相應時序的方法。其中寫模式的時序如圖3所示。寫數據時,注意先寫高位,再寫低位,必須嚴格按照時序來寫入。
本系統成功實現了基于STM32處理器和AD5791的20位高精度電壓輸出系統,給出了全新實用的硬件和軟件設計,適用于對輸出高精度模擬電壓有需要的智能儀表場合中。該系統精度高,漂移低,可靠性高,可以應用于醫療儀器、測試測量儀表、工業控制以及高端科學和航空航天儀器中,具有很好的應用前景。
-
處理器
+關注
關注
68文章
19265瀏覽量
229684 -
STM32
+關注
關注
2270文章
10896瀏覽量
355781 -
AD5791
+關注
關注
0文章
8瀏覽量
12650
發布評論請先 登錄
相關推薦
評論