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的輸出緩沖器。
-
單片機
+關注
關注
6023文章
44378瀏覽量
628547 -
嵌入式
+關注
關注
5046文章
18823瀏覽量
298685 -
dac
+關注
關注
43文章
2227瀏覽量
190443 -
開發板
+關注
關注
25文章
4771瀏覽量
96197
發布評論請先 登錄
相關推薦
評論