DAC是一種把二進制數字量形式的離散信號轉換成以標準量(或參考量)為基準的模擬量的轉換器,它常用于過程控制計算機系統的輸出通道,與執行器相連,實現對生產過程的自動控制。
13.1.GD32 DAC 外設原理簡介
因篇幅有限,本文無法詳細介紹GD32所有系列的DAC,下面以GD32F30x為例,先著重介紹下GD32F30x的DAC及其結構框圖,然后介紹下各個系列DAC的差異。
GD32F30x DAC 主要特性
? 8位或12位分辨率,數據左對齊或右對齊;
? 每個通道帶有DMA功能;
? 同步更新轉換;
? 外部事件觸發轉換;
? 可配置的內部緩沖區;
? 輸入參考電壓VREF+;
? 噪聲波生成(LSFR噪聲模式和三角噪聲模式);
? 雙DAC并發模式。
DAC 結構框圖介紹

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<

DAC可以實現8位或者12位分辨率,也可以實現數據左對齊或者右對齊,這取決于用戶的實際需求。當分辨率為12位時,DAC的模擬輸出電壓與數字量的關系為:

上式中,DAC_DO為DAC數據輸出寄存器的值,VREF+為DAC的參考電壓,其范圍為2.6V~VDDA。
每個DAC通道都具有DMA功能。兩個DMA通道分別用于處理DAC通道的DMA請求。當DAC_CTL寄存器的DDMAENx置位時,如果發生了外部觸發(而不是軟件觸發),則將產生DMA請求。
各系列 DAC 功能差異
GD32系列MCU有關DAC外設各系列功能差異如下表所示

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輸出的模擬電壓與我們所設置的值是一樣的。

13.3.DAC 使用注意事項
(1) 在使能DAC模塊前,GPIO口(PA4對應DAC0,PA5對應DAC1)應該配置為模擬模式;
(2) 將DAC_CTL寄存器中的DENx位置1可以給DAC上電。DAC子模塊完全啟動需要等tWAKEUP時間。
(3) 為了實現更好的輸出帶載能力,建議打開DAC的輸出緩沖器。
-
單片機
+關注
關注
6066文章
44946瀏覽量
648353 -
嵌入式
+關注
關注
5144文章
19575瀏覽量
315855 -
dac
+關注
關注
43文章
2390瀏覽量
193226 -
開發板
+關注
關注
25文章
5590瀏覽量
103212
發布評論請先 登錄
GD32 MCU 入門教程】GD32 MCU 常見外設介紹(12)FMC 模塊介紹

GD32 MCU移植
兆易創新GD32 MCU選型手冊,適用于GD32全系列MCU
【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(1)使用Keil開發GD32

【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(2)使用 IAR 開發 GD32

【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(3)使用 Embedded Builder 開發 GD32

【GD32 MCU 入門教程】二、GD32 MCU 燒錄說明(1)ISP 燒錄

【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(14)RTC 模塊介紹

【GD32 MCU入門教程】GD32 MCU GPIO 結構與使用注意事項

評論