您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)STM32 DAC是什么,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
既然有模擬轉(zhuǎn)數(shù)字的ADC模塊,那么就必然有數(shù)字轉(zhuǎn)模擬的DAC模塊。顧名思義,該模塊僅具有ADC的補(bǔ)充功能。它將數(shù)字二進(jìn)制值轉(zhuǎn)換為模擬電壓輸出。DAC模塊具有多種用途,包括音頻生成,波形生成等。通常在大多數(shù)8位微控制器中,此模塊不可用,并且通過脈寬調(diào)制(PWM)可以稍微滿足其需求。部分原因是由于它們的硬件資源和運(yùn)行速度相對(duì)較低。所有STM32單片機(jī)都具有PWM模塊,但大容量STM32也具有DAC模塊。STM32DAC模塊不是很復(fù)雜,并且在工作原理方面與ADC模塊相似。
從STM32F207數(shù)據(jù)手冊(cè)看到,STM32F207具有兩個(gè)DAC模塊。
每個(gè)DAC具有獨(dú)立的通道,對(duì)應(yīng)的GPIO分別為:PA4和PA5。對(duì)于GPIO的復(fù)用功能(Alternatefunctions)和附加功能(Additionalfunctions),在《STM32ADC詳解》有詳細(xì)講解。
除了DAC輸出的管腳,還有其他相關(guān)引腳
注意:使能DAC 通道x 后,相應(yīng)GPIO 引腳(PA4 或PA5)將自動(dòng)連接到模擬轉(zhuǎn)換器輸出(DAC_OUTx)。為了避免寄生電流消耗,應(yīng)首先將PA4 或PA5 引腳配置為模擬模式(AIN)。
下面的簡(jiǎn)化框圖顯示了STM32DAC模塊的主要組件。
由框圖可以看出,DAC受DORx寄存器直接控制的,但是不能直接往DORx寄存器寫入數(shù)據(jù),而是通過DHRx間接地傳給DORx寄存器,實(shí)現(xiàn)對(duì)DAC的輸出控制。
不能直接對(duì)寄存器DAC_DORx寫入數(shù)據(jù),任何輸出到DAC通道x的數(shù)據(jù)都必須寫入DAC_DHRx寄存器(數(shù)據(jù)實(shí)際寫入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者DAC_DHR12RD寄存器)。
如果沒有選中硬件觸發(fā)(寄存器DAC_CR1的TENx位置0),存入寄存器DAC_DHRx的數(shù)據(jù)會(huì)在一個(gè)APB1時(shí)鐘周期后自動(dòng)傳至寄存器DAC_DORx;
如果選中硬件觸發(fā)(寄存器DAC_CR1的TENx位置1),數(shù)據(jù)傳輸在觸發(fā)發(fā)生以后3個(gè)APB1時(shí)鐘周期后完成。
一旦數(shù)據(jù)從DAC_DHRx寄存器裝入DAC_DORx寄存器,在經(jīng)過時(shí)間tSETTLING之后,輸出即有效,這段時(shí)間的長(zhǎng)短依電源電壓和模擬輸出負(fù)載的不同會(huì)有所變化。
DAC控制寄存器(DAC_CR)
DMAEN1:DAC通道1DMA使能(DAC channel1 DMA enable),我們不使用DMA,故設(shè)置為0
MAMP1[3:0]:DAC通道1屏蔽/幅值選擇器(DAC channel1 mask/amplitude selector)我們沒有用到故這幾位也設(shè)置為0
WAVE1[1:0]:DAC通道1噪聲/三角波生成使能(DAC channel1 noise/triangle wave generationenable)我們也沒用到故也設(shè)置為0
TEN1:DAC通道1觸發(fā)使能(DAC channel1 trigger enable)我們不用觸發(fā),所以設(shè)置為0
TSEL1[2:0]:DAC通道1觸發(fā)選擇(DAC channel1 trigger selection)注意:該位只能在TEN1=1(DAC通道1觸發(fā)使能)時(shí)設(shè)置。我們TEN1設(shè)為0,所以這幾位就不用設(shè)置,默認(rèn)為0
BOFF1:關(guān)閉DAC通道1輸出緩存(DAC channel1 output buffer disable)我們關(guān)閉輸出緩沖故設(shè)置為1
EN1:DAC通道1使能(DAC channel1 enable)我們要使能DAC通道、故設(shè)置為1。
STM32的DAC等效電路如下
該電路中顯示的輸出緩沖器在內(nèi)部3.3V電源上運(yùn)行。與大多數(shù)運(yùn)放在單電源(而不是+/-雙電源)上運(yùn)行一樣,輸出擺幅永遠(yuǎn)不會(huì)真正達(dá)到目標(biāo)。但是,如電路所示,有兩個(gè)內(nèi)部開關(guān)(S1和S2)可通過寄存器控制。將它們都打開將通過兩個(gè)串聯(lián)的電阻(Ra和Rb)將“DACINT”信號(hào)直接連接到“DACOUT”引腳。作為參考,Ra+ Rb約為15k。
根據(jù)選擇的配置模式,數(shù)據(jù)按照下文所述寫入指定的寄存器:
單DAC通道x,有3種情況:
8位數(shù)據(jù)右對(duì)齊:用戶須將數(shù)據(jù)寫入寄存器DAC_DHR8Rx[7:0]位(實(shí)際是存入寄存器DHRx[11:4]位);
12位數(shù)據(jù)左對(duì)齊:用戶須將數(shù)據(jù)寫入寄存器DAC_DHR12Lx[15:4]位(實(shí)際是存入寄存器DHRx[11:0]位);
12位數(shù)據(jù)右對(duì)齊:用戶須將數(shù)據(jù)寫入寄存器DAC_DHR12Rx[11:0]位(實(shí)際是存入寄存器DHRx[11:0]位)。
一般采用第三種方式:12位數(shù)據(jù)右對(duì)齊比較多。
根據(jù)對(duì)DAC_DHRyyyx寄存器的操作,經(jīng)過相應(yīng)的移位后,寫入的數(shù)據(jù)被轉(zhuǎn)存到DHRx寄存器中(DHRx是內(nèi)部的數(shù)據(jù)保存寄存器x)。隨后,DHRx寄存器的內(nèi)容或被自動(dòng)地傳送到DORx寄存器,或通過軟件觸發(fā)或外部事件觸發(fā)被傳送到DORx寄存器。
雙DAC通道,有3種情況:
8位數(shù)據(jù)右對(duì)齊:用戶須將DAC通道1數(shù)據(jù)寫入寄存器DAC_DHR8RD[7:0]位(實(shí)際是存入寄存器DHR1[11:4]位),將DAC通道2數(shù)據(jù)寫入寄存器DAC_DHR8RD[15:8]位(實(shí)際是存入寄存器DHR2[11:4]位);
12位數(shù)據(jù)左對(duì)齊:用戶須將DAC通道1數(shù)據(jù)寫入寄存器DAC_DHR12LD[15:4]位(實(shí)際是存入寄存器DHR1[11:0]位),將DAC通道2數(shù)據(jù)寫入寄存器DAC_DHR12LD[31:20]位(實(shí)際是存入寄存器DHR2[11:0]位);
12位數(shù)據(jù)右對(duì)齊:用戶須將DAC通道1數(shù)據(jù)寫入寄存器DAC_DHR12RD[11:0]位(實(shí)際是存入寄存器DHR1[11:0]位),將DAC通道2數(shù)據(jù)寫入寄存器DAC_DHR12RD[27:16]位(實(shí)際是存入寄存器DHR2[11:0]位)。
當(dāng)DAC的參考電壓位VREF+的時(shí)候,數(shù)字輸入經(jīng)過DAC被線性地轉(zhuǎn)換為模擬電壓輸出,其范圍為0到VREF+。
任一DAC通道引腳上的輸出電壓滿足下面的關(guān)系:
DAC輸出= VREF x (DOR / 4095)。
注意:此時(shí)數(shù)據(jù)格式:應(yīng)該選擇12位數(shù)據(jù)右對(duì)齊。
DAC配置
void DAC1_Config(void) { DAC_InitTypeDef DAC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* DMA1 clock and GPIOA clock enable (to be used with DAC) */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* DAC Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); /* DAC channel 1 & 2 (DAC_OUT1 = PA.4)(DAC_OUT2 = PA.5) configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); /* DAC channel2 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* Enable DAC Channel2 */ DAC_Cmd(DAC_Channel_1, ENABLE); }
設(shè)置輸出電壓
//設(shè)置通道1輸出電壓 //vol:0~3300,代表0~3.3V void Dac1_Set_Vol(uint16_t vol) { double temp=vol; temp/=1000; temp=temp*4096/3.3; DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右對(duì)齊數(shù)據(jù)格式設(shè)置DAC值 }
測(cè)試用例很簡(jiǎn)單,就是反復(fù)輸出1.2V和3.0V電壓
while (1) { GPIO_SetBits(GPIOE,GPIO_Pin_4); //熄滅LED燈 Dac1_Set_Vol(1200); LCD_ShowString(0,0,"DAC OUT 1.2V"); Delay(500); //延時(shí)500ms GPIO_ResetBits(GPIOE,GPIO_Pin_4);//點(diǎn)亮LED燈 Dac1_Set_Vol(3000); LCD_ShowString(0,0,"DAC OUT 3.0V"); Delay(500); //延時(shí)500ms }
下載驗(yàn)證
關(guān)于“STM32 DAC是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。