DAC是一種把二進制數(shù)字量形式的離散信號轉(zhuǎn)換成以標準量(或參考量)為基準的模擬量的轉(zhuǎn)換器,它常用于過程控制計算機系統(tǒng)的輸出通道,與執(zhí)行器相連,實現(xiàn)對生產(chǎn)過程的自動控制。
13.1.GD32 DAC 外設(shè)原理簡介
因篇幅有限,本文無法詳細介紹GD32所有系列的DAC,下面以GD32F30x為例,先著重介紹下GD32F30x的DAC及其結(jié)構(gòu)框圖,然后介紹下各個系列DAC的差異。
GD32F30x DAC 主要特性
? 8位或12位分辨率,數(shù)據(jù)左對齊或右對齊;
? 每個通道帶有DMA功能;
? 同步更新轉(zhuǎn)換;
? 外部事件觸發(fā)轉(zhuǎn)換;
? 可配置的內(nèi)部緩沖區(qū);
? 輸入?yún)⒖茧妷?a target="_blank">VREF+;
? 噪聲波生成(LSFR噪聲模式和三角噪聲模式);
? 雙DAC并發(fā)模式。
DAC 結(jié)構(gòu)框圖介紹
GD32F30x一共有兩個DAC,分別為DAC0和DAC1,其輸出DAC_OUT0和DAC_OUT1分別對應(yīng)PA4和PA5。由于DAC輸出為模擬量,因此在使能DAC模塊前,需要把相應(yīng)的GPIO口設(shè)置為模擬模式。DAC的輸出集成了輸出緩沖器Buff,可用來降低輸出阻抗,并在不增加外部運算放大器的情況下直接驅(qū)動外部負載。通過設(shè)置DAC_CTL寄存器的DBOFFx位,可以使能或禁止各DAC通道輸出緩沖器。
DAC的輸出可以由多種觸發(fā)源控制,觸發(fā)源的選擇由DAC_CTL寄存器的DTSELx[2:0]位控制,具體為:
000:TIMER5_TRGO
001:TIMER2_TRGO(互聯(lián)型產(chǎn)品)
TIMER7_TRGO(非互聯(lián)型產(chǎn)品)
010:TIMER6_TRGO
011:TIMER4_TRGO
100:TIMER1_TRGO
101:TIMER3_TRGO
110:EXTI9
111:SWTRIG
有兩種方式可以將噪聲波加載到DAC輸出數(shù)據(jù):LFSR噪聲波和三角波。噪聲波模式可以通過DAC_CTL寄存器的DWMx位來進行選擇。噪聲的幅值可以通過配置DAC_CTL寄存器的DAC噪聲波位寬(DWBWx)位來進行設(shè)置。
LFSR噪聲模式:為了生成可變振幅的偽噪聲,可使用LFSR(線性反饋移位寄存器)。LFSR的值與DACx_DH值相加后寫入到DAC數(shù)據(jù)輸出寄存器(DACx_DO)。LFSR中的預(yù)加載值為0xAAA,在每次觸發(fā)事件發(fā)生后,該寄存器的值會依照特定的算法完成更新。
三角波模式:在DAC的輸出信號上可以疊加一個小幅度的三角波。該三角波幅值的最小值為0,最大值為(2<
DAC可以實現(xiàn)8位或者12位分辨率,也可以實現(xiàn)數(shù)據(jù)左對齊或者右對齊,這取決于用戶的實際需求。當(dāng)分辨率為12位時,DAC的模擬輸出電壓與數(shù)字量的關(guān)系為:
上式中,DAC_DO為DAC數(shù)據(jù)輸出寄存器的值,VREF+為DAC的參考電壓,其范圍為2.6V~VDDA。
每個DAC通道都具有DMA功能。兩個DMA通道分別用于處理DAC通道的DMA請求。當(dāng)DAC_CTL寄存器的DDMAENx置位時,如果發(fā)生了外部觸發(fā)(而不是軟件觸發(fā)),則將產(chǎn)生DMA請求。
各系列 DAC 功能差異
GD32系列MCU有關(guān)DAC外設(shè)各系列功能差異如下表所示
13.2.軟件配置說明
本小節(jié)講解DAC_Example歷程中DAC模塊的配置說明,主要包括外設(shè)時鐘配置、GPIO引腳配置、DAC外設(shè)配置、主函數(shù)介紹以及運行結(jié)果。本例程主要介紹GD32 MCU各系列DAC0模塊輸出模擬電壓,有關(guān)DAC其他功能例程可參考各系列固件庫例程。
外設(shè)時鐘配置
外設(shè)時鐘配置如代碼清單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配置相同。注意,以上所呈現(xiàn)的不同,只是調(diào)用gpio初始化函數(shù)不同,配置是一樣的,都是把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 外設(shè)配置
DAC外設(shè)配置如代碼清單 DAC例程DAC外設(shè)配置所示。GD32全系列MCU中DAC外設(shè)配置基本相同,在本例程中,配置DAC為軟件觸發(fā),每當(dāng)使能一次軟件觸發(fā),DAC就會把DAC數(shù)據(jù)寄存器的值轉(zhuǎn)換為模擬電壓輸出。
代碼清單 DAC 例程 DAC 外設(shè)配置
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 }
主函數(shù)說明
主函數(shù)如代碼清單 DAC例程主函數(shù)所示,該主函數(shù)主要分成四部分,RCU時鐘配置、GPIO配置、DAC外設(shè)配置和while(1)循環(huán),前三部分已在前三小節(jié)介紹,在while(1)主循環(huán)中先設(shè)置一下DAC將要輸出的模擬電壓值,然后使能軟件觸發(fā)輸出該模擬電壓,延時一段時間后,再設(shè)置新的模擬電壓值,如此循環(huán)。dac_value_set函數(shù)用于設(shè)置模擬輸出電壓值,單位為mV。delay函數(shù)是一個簡單的軟件延時函數(shù),用于實現(xiàn)延時。這兩個函數(shù)的代碼清單如代碼清單DAC例程部分函數(shù)說明所示。
代碼清單 DAC 例程主函數(shù)
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 例程部分函數(shù)說明
/*! \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--); }
運行結(jié)果
將DAC_Example例程按照對應(yīng)的芯片工程編譯完成后,下載到對應(yīng)芯片中,用示波器查看PA4引腳波形,如下圖圖DAC輸出電壓波形圖所示,可以看到,DAC輸出的模擬電壓與我們所設(shè)置的值是一樣的。
13.3.DAC 使用注意事項
(1) 在使能DAC模塊前,GPIO口(PA4對應(yīng)DAC0,PA5對應(yīng)DAC1)應(yīng)該配置為模擬模式;
(2) 將DAC_CTL寄存器中的DENx位置1可以給DAC上電。DAC子模塊完全啟動需要等tWAKEUP時間。
(3) 為了實現(xiàn)更好的輸出帶載能力,建議打開DAC的輸出緩沖器。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機
+關(guān)注
關(guān)注
6030文章
44489瀏覽量
631958 -
嵌入式
+關(guān)注
關(guān)注
5059文章
18973瀏覽量
301995 -
dac
+關(guān)注
關(guān)注
43文章
2258瀏覽量
190748 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4895瀏覽量
97055
發(fā)布評論請先 登錄
相關(guān)推薦
評論