高精度DAC功能板
目錄
- 前言
- 1 DAC8563硬件設計
- 1.1 DAC8563主要參數
- 1.2 DAC8563引腳功能
- 1.3 DAC8563輸出電壓計算公式
- 1.4 DAC8563時序圖
- 1.5 DAC8563寄存器配置
- 1.6 DAC8563后級調理電路
- 1.7 DAC8563硬件設計還需要注意的地方
- 2 DAC8563軟件設計
- 2.1 SPI總線配置
- 2.2 SPI發送配置
- 2.3 DAC8563初始化
- 2.4 DAC8563更新輸出
- 3 成果展示
- 3.1 硬件
- 3.2 測試波形
- 說在后面
前言
DAC8563是TI的低功耗、電壓輸出、雙通道、16位數據轉換器(DAC)。其包括一個2.5V,4ppm/℃內部基準,提供2.5V或者5V的滿量程輸出電壓范圍。內部基準具有 ±5mV 的初始精度,并且可以提供或吸收20 mA電流。這些器件是線性的,可提供出色的線性度并最大限度地減少不需要的代碼間瞬態電壓(毛刺)。它們使用以高達 50 MHz 的時鐘速率運行的多功能三線串行接口。該接口與標準 SPI、QSPI、Microwire 和數字信號處理器 (DSP) 等接口兼容。 DAC8563 器件包含一個上電復位電路,可確保 DAC 輸出上電并保持在零電平,直到向器件寫入有效代碼,具有斷電功能,可將 5 V 時的典型電流消耗降低至 550 nA。低功耗、內部基準和小尺寸使這些器件成為便攜式電池供電設備的理想選擇。
1 DAC8563硬件設計
1.1 DAC8563主要參數
1.2 DAC8563引腳功能
DAC8563主要有兩種封裝:
各個引腳的功能說明如下:
- AVDD:供電范圍2.7-5.5V;
- CLR:異步清除輸入,下降沿有效,觸發后,DAC8562輸出最低電壓值,DAC8563輸出中間值。用戶寫入操作的的第24個時鐘下降沿將退出清除模式,激活清除模式將終止寫操作;
- DIN:串行數據輸入,每個時鐘下降沿將24bit數據寫到輸入移位寄存器;
- GND:接地端;
- LDAC:同步模式下,數據更新發生在第24個SCLK周期的下降沿,之后伴隨著SYNC的下降沿。 這種同步更新不需要LDAC,此時LDAC必須可靠接地,或者通過命令發送到設備使其保持低電平。異步模式下,LDAC是低電平觸發,用于同步DAC更新,可以編寫多個單通道命令進行設置,然后在LDAC引腳上產生一個下降沿將同步更新DAC輸出寄存器;
- SCLK:時鐘輸入端,最高支持50MHz;
- SYNC (片選):低電平有效,當SYNC變為低電平時,它使能輸入移位寄存器,并且數據采樣在隨后的時鐘下降沿。 DAC輸出在第24個時鐘下降沿之后更新。 如果SYNC在第23個時鐘沿之前變高,SYNC的上升沿將充當中斷,此次的寫入會被無效;
- VoutA:模擬電壓輸出通道A;
- VoutB:模擬電壓輸出通道B;
- Vrefin/Vrefout:雙向電壓參考引腳,可以使用外部電壓作為內部電壓基準,也可以使用內部電壓作為基準,此時該引腳是輸出2.5V。
1.3 DAC8563輸出電壓計算公式
DAC856X的計算公式如下:
- DIN:配置DAC856X數據輸出寄存器的數值,范圍0 到2^16 – 1,即0到65535;
- 2^n:對于DAC8563來說,由于分辨率為16位,故n是16;
- VREF:如果使用內部參考電壓,那么此數值是2.5V,如果使用外部參考電壓,由該引腳的電壓決定,但是值得說明的是,最大的輸出不應超過AVDD;
- Gain:增益設置。禁止內部電壓基準后,默認增益是1。如果使能內部電壓基準后,默認增益是2。具體增益是1還是2,可以通過DAC8563的寄存器設置。
1.4 DAC8563時序圖
DAC856X的時序圖如下:
其中,必要的延遲時間如下:
值得注意的是上圖中的兩個參數尤其重要:
- t4:每傳輸24bit數據后,SYNC要保持一段時間的高電平,DAC8563要求至少要80ns;
- t5:SYNC低電平有效到SCLK第1個下降沿信號的時間,最小值13ns。;
1.5 DAC8563寄存器配置
整個寫數據為24位,其中位23-22可以不用管,位21-16為主要的命令數據,低16位為具體的數據。
1.6 DAC8563后級調理電路
對于有些應用場合,0 ~ 5V的輸出范圍往往是不夠用的,因此加入后級電路是有必要的。根據官方給的例子。可以使用一個高精度運放設計得到具有正負電壓或者多量程輸出的DAC功能板。
1.7 DAC8563硬件設計還需要注意的地方
由上圖可以看到,Vout的輸出電壓范圍為-0.3 ~ AVDD+0.3。因此,假如DAC8563的供電電壓改變為3.3V,那么寫入65535的數據,最多只能輸出3.3V,但是輸入32768,依舊能輸出2.5V。
另外,控制信號的高電平與AVDD也有關系,也就是輸入的高電平為0.7*AVDD。這對于絕大多數ARM以及DSP都是不友好的,因為引腳電平的輸出電壓往往只有3.3V,而AVDD通常使用要得到5V的滿偏量程至少要3.5V的高電平。當然,設計者也可以使用內部增益為1,也就是量程為2.5V,這樣是能得到線性的輸出的。
由于筆者是在設計好后級電路之后才發現了這個問題,因此只能硬著頭皮找方法。對于STM32這類芯片可以使用開漏輸出,外部上拉到AVDD即可,但是如DSP類的芯片卻沒有這個功能。因此也可以使用SPI專用的電平轉換器,但是轉換器帶來的響應延遲造成多大的影響也不可知。最終,在嘗試的結果下,發現只要盡量減少信號線的距離就可以盡可能提高DAC信號端的電壓值,保證3.3V的單片機高電平也是有效的。
2 DAC8563軟件設計
SPI的使用一般有軟件IO模擬時序,以及硬件SPI兩種辦法,前者在復雜的時序中具有簡單,靈活的優勢,不過在速度上要遜色硬件SPI不少。
2.1 SPI總線配置
spi總線配置通過如下函數實現:
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //設置SPI單向或者雙向的數據模式:SPI設置為雙線雙向全雙工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //設置SPI工作模式:設置為主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //設置SPI的數據大小:SPI發送接收8位幀結構SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步時鐘的空閑狀態為高電平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步時鐘的第一個跳變沿(上升或下降)數據被采樣SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內部NSS信號有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //定義波特率預分頻的值:波特率預分頻值為256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定數據傳輸從MSB位還是LSB位開始:數據傳輸從MSB位開始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值計算的多項式SPI_Init(SPI1, &SPI_InitStructure); //根據SPI_InitStruct中指定的參數初始化外設SPIx寄存器SPI_Cmd(SPI1, ENABLE); //使能SPI外設SPI1_ReadWriteByte(0xff);//啟動傳輸這里配置了一次發送的數據位為8個,這樣只要發送三次8位數據就可以組成一個24位的數據。同時配置先發高位,即MSB。極性配置為高電平,并在第一個跳變沿采樣數據,這也是根據DAC8563的時序得到的。
2.2 SPI發送配置
void Dac8563_reg_write(u8 cmd,u16 dat) { DAC8563_CS=0; //使能器件delay_us(1);SPI1_ReadWriteByte(cmd); //發送寫取狀態寄存器命令 SPI1_ReadWriteByte(dat>>8); //寫入一個字節 SPI1_ReadWriteByte((dat) );delay_us(1);DAC8563_CS=1; //取消片選 }通過調用SPI1_ReadWriteByte讀寫函數,即可實現8位數據的發送,這里值得注意的是要發送的數據應該處于低八位。另外可以忽略SPI1_ReadWriteByte中的接收函數。第一個延時主要是為了保證低電平的時間與SPI的下降沿時間差,不過考慮到SPI的速度如果設置的比較慢,不是20M往上(估計),可以忽略,因為本身SPI的下降沿之間也有一段時間,這段時間與時鐘的頻率有關。第二個延時是為了保證SPI的數據發送結束的,因為SPI的數據雖然發送完,但是形成電平也需要時間,所以需要等待一會,同樣,如果SPI的頻率很高,那么這個延時時間也可以減小。
2.3 DAC8563初始化
void DAC8563_Init(void) {SPI1_Init(); //初始化SPISPI1_SetSpeed(SPI_BaudRatePrescaler_8); //設置時鐘頻率DAC8563_CS=1; delay_us(1); Dac8563_reg_write(0x20,0x0003); //上電 Dac8563_reg_write(0x30,0x0003); //不使能LDACDAC_OutAB(32687,32687); //設置輸出中間電壓Dac8563_reg_write(0x38,0x0001); //配置內部參考電壓,增益為2 }可以看到DAC的初始化主要分為三個步驟,需要寫入三次數據。另外值得說明的是,在初始化中對使能引腳置高是為了使得第一次寫數據時高電平能夠保持一定的時間,這也是時序中要求的。
2.4 DAC8563更新輸出
void DAC_OutAB(u16 dat_a, u16 dat_b) {Dac8563_reg_write(0x18, dat_a);Dac8563_reg_write(0x19, dat_b); }通過更新對應寄存器的數據可以更新輸出。本設計沒有使用CLR及LDAC功能。
3 成果展示
3.1 硬件
3.2 測試波形
上圖為DAC輸出0~5V的動態波形。可以看到滿量程的動態響應時間僅7us左右。
這里黃色的波形使用的是OUTA,量程為0~10V,綠色波形為OUTB量程為-10 ~ 10V。可以看到滿量程的動態響應時間經過運放后為27us。可以滿足絕大多數的應用。
說在后面
這個小項目的設計資料我已上傳至硬創社(項目鏈接),有需要的各位自取。
總結
- 上一篇: php stripslashes和add
- 下一篇: Sqlserver 数据库分页查询(三种