DAC是一種把二進制數字量形式的離散信號轉換成以標準量(或參考量)為基準的模擬量的轉換器,它常用于過程控制計算機系統的輸出通道,與執行器相連,實現對生產過程的自動控制。
13.1.GD32 DAC 外設原理簡介
因篇幅有限,本文無法詳細介紹GD32所有系列的DAC,下面以GD32F30x為例,先著重介紹下GD32F30x的DAC及其結構框圖,然后介紹下各個系列DAC的差異。
GD32F30x DAC 主要特性
? 8位或12位分辨率,數據左對齊或右對齊;
? 每個通道帶有DMA功能;
? 同步更新轉換;
? 外部事件觸發轉換;
? 可配置的內部緩沖區;
? 輸入參考電壓VREF+;
? 噪聲波生成(LSFR噪聲模式和三角噪聲模式);
? 雙DAC并發模式。
DAC 結構框圖介紹
![輸入圖片說明](https://file1.elecfans.com/web2/M00/04/A7/wKgaombGlDGAbKXsAABq_wybtbs195.png)
GD32F30x一共有兩個DAC,分別為DAC0和DAC1,其輸出DAC_OUT0和DAC_OUT1分別對應PA4和PA5。由于DAC輸出為模擬量,因此在使能DAC模塊前,需要把相應的GPIO口設置為模擬模式。DAC的輸出集成了輸出緩沖器Buff,可用來降低輸出阻抗,并在不增加外部運算放大器的情況下直接驅動外部負載。通過設置DAC_CTL寄存器的DBOFFx位,可以使能或禁止各DAC通道輸出緩沖器。
DAC的輸出可以由多種觸發源控制,觸發源的選擇由DAC_CTL寄存器的DTSELx[2:0]位控制,具體為:
000:TIMER5_TRGO
001:TIMER2_TRGO(互聯型產品)
TIMER7_TRGO(非互聯型產品)
010:TIMER6_TRGO
011:TIMER4_TRGO
100:TIMER1_TRGO
101:TIMER3_TRGO
110:EXTI9
111:SWTRIG
有兩種方式可以將噪聲波加載到DAC輸出數據:LFSR噪聲波和三角波。噪聲波模式可以通過DAC_CTL寄存器的DWMx位來進行選擇。噪聲的幅值可以通過配置DAC_CTL寄存器的DAC噪聲波位寬(DWBWx)位來進行設置。
LFSR噪聲模式:為了生成可變振幅的偽噪聲,可使用LFSR(線性反饋移位寄存器)。LFSR的值與DACx_DH值相加后寫入到DAC數據輸出寄存器(DACx_DO)。LFSR中的預加載值為0xAAA,在每次觸發事件發生后,該寄存器的值會依照特定的算法完成更新。
三角波模式:在DAC的輸出信號上可以疊加一個小幅度的三角波。該三角波幅值的最小值為0,最大值為(2<
![輸入圖片說明](https://file1.elecfans.com/web2/M00/03/BA/wKgZombGlC-AOJ5nAAAkcGk85nY806.png)
DAC可以實現8位或者12位分辨率,也可以實現數據左對齊或者右對齊,這取決于用戶的實際需求。當分辨率為12位時,DAC的模擬輸出電壓與數字量的關系為:
![輸入圖片說明](https://file1.elecfans.com/web2/M00/03/BA/wKgZombGlC-AJUiNAAAPZ2YTraI101.png)
上式中,DAC_DO為DAC數據輸出寄存器的值,VREF+為DAC的參考電壓,其范圍為2.6V~VDDA。
每個DAC通道都具有DMA功能。兩個DMA通道分別用于處理DAC通道的DMA請求。當DAC_CTL寄存器的DDMAENx置位時,如果發生了外部觸發(而不是軟件觸發),則將產生DMA請求。
各系列 DAC 功能差異
GD32系列MCU有關DAC外設各系列功能差異如下表所示
![輸入圖片說明](https://file1.elecfans.com/web2/M00/04/A7/wKgaombGlC-ACYnoAACB1JbjGJU844.png)
13.2.軟件配置說明
本小節講解DAC_Example歷程中DAC模塊的配置說明,主要包括外設時鐘配置、GPIO引腳配置、DAC外設配置、主函數介紹以及運行結果。本例程主要介紹GD32 MCU各系列DAC0模塊輸出模擬電壓,有關DAC其他功能例程可參考各系列固件庫例程。
外設時鐘配置
外設時鐘配置如代碼清單DAC例程時鐘配置所示,在GD32全系列MCU中需打開GPIOA和DAC0的時鐘,因為使用到PA4引腳以及DAC0模塊。
代碼清單 DAC 例程時鐘配置
void rcu_config(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_DAC); }
GPIO 引腳配置
GPIO引腳配置如代碼清單DAC例程GPIO引腳配置所示,GD32F10X、GD32F20X、GD32F30X、GD32E10X、GD32F403系列GPIO配置相同;GD32F1X0、GD32F4XX、GD32F350系列GPIO配置相同。注意,以上所呈現的不同,只是調用gpio初始化函數不同,配置是一樣的,都是把PA4配置為模擬模式。
代碼清單 DAC 例程 GPIO 引腳配置
void gpio_config(void) { #if defined (GD32F10X_HD)||(GD32F20X_CL)||(GD32F30X_HD)||(GD32E10X) gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4); #elif defined (GD32F1X0) || (GD32F4XX) || defined (GD32F350) gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4); #endif }
DAC 外設配置
DAC外設配置如代碼清單 DAC例程DAC外設配置所示。GD32全系列MCU中DAC外設配置基本相同,在本例程中,配置DAC為軟件觸發,每當使能一次軟件觸發,DAC就會把DAC數據寄存器的值轉換為模擬電壓輸出。
代碼清單 DAC 例程 DAC 外設配置
void dac_config(void) { #if defined (GD32F10X_HD)||(GD32F20X_CL)||(GD32F30X_HD)||(GD32F4XX)||(GD32E10X) dac_deinit(); dac_trigger_enable(DAC0); dac_trigger_source_config(DAC0,DAC_TRIGGER_SOFTWARE); /* enable DAC */ dac_enable(DAC0); #elif defined (GD32F350) dac_deinit(); dac_trigger_enable(); dac_trigger_source_config(DAC_TRIGGER_SOFTWARE); /* enable DAC */ dac_enable(); #elif defined (GD32F1X0) dac_deinit(); dac0_trigger_enable(); dac0_trigger_source_config(DAC_TRIGGER_SOFTWARE); /* enable DAC */ dac0_enable(); #endif }
主函數說明
主函數如代碼清單 DAC例程主函數所示,該主函數主要分成四部分,RCU時鐘配置、GPIO配置、DAC外設配置和while(1)循環,前三部分已在前三小節介紹,在while(1)主循環中先設置一下DAC將要輸出的模擬電壓值,然后使能軟件觸發輸出該模擬電壓,延時一段時間后,再設置新的模擬電壓值,如此循環。dac_value_set函數用于設置模擬輸出電壓值,單位為mV。delay函數是一個簡單的軟件延時函數,用于實現延時。這兩個函數的代碼清單如代碼清單DAC例程部分函數說明所示。
代碼清單 DAC 例程主函數
int main(void) { /* peripheral clock enable */ rcu_config(); /* GPIO config */ gpio_config(); /* DAC config */ dac_config(); while(1) { #if defined (GD32F10X_HD)||(GD32F20X_CL)||(GD32F30X_HD)||(GD32F4XX)||(GD32E10X) dac_value_set(1000);//1000mV dac_software_trigger_enable(DAC0); delay(2000); dac_value_set(2000);//2000mV dac_software_trigger_enable(DAC0); delay(2000); #elif defined (GD32F350) dac_value_set(1000);//1000mV dac_software_trigger_enable(); delay(2000); dac_value_set(2000);//2000mV dac_software_trigger_enable(); delay(2000); #elif defined (GD32F1X0) dac_value_set(1000);//1000mV dac0_software_trigger_enable(); delay(2000); dac_value_set(2000);//2000mV dac0_software_trigger_enable(); delay(2000); #endif } }
代碼清單 DAC 例程部分函數說明
/*! \brief set DAC output voltage \param[in] vol: output voltage, unit: mV \param[out] none \retval none */ static void dac_value_set(uint16_t vol) { uint16_t dac_reg_value; dac_reg_value = vol*4096.0/3300; #if defined (GD32F10X_HD)||(GD32F20X_CL)||(GD32F30X_HD)||(GD32F4XX)||(GD32E10X) dac_data_set(DAC0,DAC_ALIGN_12B_R,dac_reg_value); #elif defined (GD32F350) dac_data_set(DAC_ALIGN_12B_R,dac_reg_value); #elif defined (GD32F1X0) dac0_data_set(DAC_ALIGN_12B_R,dac_reg_value); #endif } /*! \brief delay \param[in] cnt: delay count \param[out] none \retval none */ static void delay(uint16_t cnt) { while(cnt--); }
運行結果
將DAC_Example例程按照對應的芯片工程編譯完成后,下載到對應芯片中,用示波器查看PA4引腳波形,如下圖圖DAC輸出電壓波形圖所示,可以看到,DAC輸出的模擬電壓與我們所設置的值是一樣的。
![輸入圖片說明](https://file1.elecfans.com/web2/M00/03/BA/wKgZombGlDGATIfEAAF5PQu4TLU130.png)
13.3.DAC 使用注意事項
(1) 在使能DAC模塊前,GPIO口(PA4對應DAC0,PA5對應DAC1)應該配置為模擬模式;
(2) 將DAC_CTL寄存器中的DENx位置1可以給DAC上電。DAC子模塊完全啟動需要等tWAKEUP時間。
(3) 為了實現更好的輸出帶載能力,建議打開DAC的輸出緩沖器。
-
單片機
+關注
關注
6044文章
44632瀏覽量
639284 -
嵌入式
+關注
關注
5096文章
19199瀏覽量
308228 -
dac
+關注
關注
43文章
2314瀏覽量
191700 -
開發板
+關注
關注
25文章
5144瀏覽量
98414
發布評論請先 登錄
相關推薦
GD32 MCU 入門教程】GD32 MCU 常見外設介紹(12)FMC 模塊介紹
![<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>常見外設</b><b class='flag-5'>介紹</b>(12)FMC <b class='flag-5'>模塊</b><b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/04/87/wKgaombFSS2AWG-GAAB5lPnhR3c604.png)
GD32 MCU移植
兆易創新GD32 MCU選型手冊,適用于GD32全系列MCU
【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(1)使用Keil開發GD32
![【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發環境搭建(1)使用Keil開發<b class='flag-5'>GD32</b>](https://file1.elecfans.com/web2/M00/02/32/wKgaoma0bSqAZmYJAABWzE6EVjY883.png)
【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(2)使用 IAR 開發 GD32
![【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發環境搭建(2)使用 IAR 開發 <b class='flag-5'>GD32</b>](https://file1.elecfans.com/web2/M00/01/49/wKgZoma0doSAZgTbAABV8x9Lb_4326.png)
【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(3)使用 Embedded Builder 開發 GD32
![【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】一、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 開發環境搭建(3)使用 Embedded Builder 開發 <b class='flag-5'>GD32</b>](https://file1.elecfans.com/web2/M00/02/37/wKgaoma0e3mANRvBAAAxO0zTl60782.png)
【GD32 MCU 入門教程】二、GD32 MCU 燒錄說明(1)ISP 燒錄
![【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】二、<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 燒錄說明(1)ISP 燒錄](https://file1.elecfans.com/web2/M00/02/38/wKgaoma0f8SAB_h5AAAvpALfiNs789.png)
【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(14)RTC 模塊介紹
![【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> <b class='flag-5'>常見外設</b><b class='flag-5'>介紹</b>(14)RTC <b class='flag-5'>模塊</b><b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/03/E0/wKgZombH42WAIyq2AAA3DFzN548758.png)
【GD32 MCU入門教程】GD32 MCU GPIO 結構與使用注意事項
![【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b><b class='flag-5'>入門教程</b>】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> GPIO 結構與使用注意事項](https://file1.elecfans.com/web2/M00/06/89/wKgaombbu8qAXdJKAAAW--yDqzA279.png)
評論