上一篇介紹了《STM32ADC詳解》,既然有模擬轉數字的ADC模塊,那么就必然有數字轉模擬的DAC模塊,顧名思義,該模塊僅具有ADC的補充功能,它將數字二進制值轉換為模擬電壓輸出,DAC模塊具有多種用途,包括音頻生成,波形生成等,通常在大多數8位微控制器中,此模塊不可用,并且通過脈寬調制(PWM)可以稍微滿足其需求,部分原因是由于它們的硬體資源和運行速度相對較低,所有STM32單片機都具有PWM模塊,但大容量STM32也具有DAC模塊,STM32DAC模塊不是很復雜,并且在作業原理方面與ADC模塊相似,
01、DAC簡介
從STM32F207資料手冊看到,STM32F207具有兩個DAC模塊,

每個DAC具有獨立的通道,對應的GPIO分別為:PA4和PA5,對于GPIO的復用功能(Alternatefunctions)和附加功能(Additionalfunctions),在《STM32ADC詳解》有詳細講解,
除了DAC輸出的管腳,還有其他相關引腳

注意:使能DAC 通道x 后,相應GPIO 引腳(PA4 或PA5)將自動連接到模擬轉換器輸出(DAC_OUTx),為了避免寄生電流消耗,應首先將PA4 或PA5 引腳配置為模擬模式(AIN),
下面的簡化框圖顯示了STM32DAC模塊的主要組件,

02、DAC轉換
由框圖可以看出,DAC受DORx暫存器直接控制的,但是不能直接往DORx暫存器寫入資料,而是通過DHRx間接地傳給DORx暫存器,實作對DAC的輸出控制,
不能直接對暫存器DAC_DORx寫入資料,任何輸出到DAC通道x的資料都必須寫入DAC_DHRx暫存器(資料實際寫入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者DAC_DHR12RD暫存器),
-
如果沒有選中硬體觸發(暫存器DAC_CR1的TENx位置0),存入暫存器DAC_DHRx的資料會在一個APB1時鐘周期后自動傳至暫存器DAC_DORx;
-
如果選中硬體觸發(暫存器DAC_CR1的TENx位置1),資料傳輸在觸發發生以后3個APB1時鐘周期后完成,
一旦資料從DAC_DHRx暫存器裝入DAC_DORx暫存器,在經過時間tSETTLING之后,輸出即有效,這段時間的長短依電源電壓和模擬輸出負載的不同會有所變化,

DAC控制暫存器(DAC_CR)
DMAEN1:DAC通道1DMA使能(DAC channel1 DMA enable),我們不使用DMA,故設定為0
MAMP1[3:0]:DAC通道1屏蔽/幅值選擇器(DAC channel1 mask/amplitude selector)我們沒有用到故這幾位也設定為0
WAVE1[1:0]:DAC通道1噪聲/三角波生成使能(DAC channel1 noise/triangle wave generationenable)我們也沒用到故也設定為0
TEN1:DAC通道1觸發使能(DAC channel1 trigger enable)我們不用觸發,所以設定為0
TSEL1[2:0]:DAC通道1觸發選擇(DAC channel1 trigger selection)注意:該位只能在TEN1=1(DAC通道1觸發使能)時設定,我們TEN1設為0,所以這幾位就不用設定,默認為0
BOFF1:關閉DAC通道1輸出快取(DAC channel1 output buffer disable)我們關閉輸出緩沖故設定為1
EN1:DAC通道1使能(DAC channel1 enable)我們要使能DAC通道、故設定為1,
03、功能說明
STM32的DAC等效電路如下

該電路中顯示的輸出緩沖器在內部3.3V電源上運行,與大多數運放在單電源(而不是+/-雙電源)上運行一樣,輸出擺幅永遠不會真正達到目標,但是,如電路所示,有兩個內部開關(S1和S2)可通過暫存器控制,將它們都打開將通過兩個串聯的電阻(Ra和Rb)將“DACINT”信號直接連接到“DACOUT”引腳,作為參考,Ra+ Rb約為15k,
根據選擇的配置模式,資料按照下文所述寫入指定的暫存器:
單DAC通道x,有3種情況:
-
8位資料右對齊:用戶須將資料寫入暫存器DAC_DHR8Rx[7:0]位(實際是存入暫存器DHRx[11:4]位);
-
12位資料左對齊:用戶須將資料寫入暫存器DAC_DHR12Lx[15:4]位(實際是存入暫存器DHRx[11:0]位);
-
12位資料右對齊:用戶須將資料寫入暫存器DAC_DHR12Rx[11:0]位(實際是存入暫存器DHRx[11:0]位),
一般采用第三種方式:12位資料右對齊比較多,
根據對DAC_DHRyyyx暫存器的操作,經過相應的移位后,寫入的資料被轉存到DHRx暫存器中(DHRx是內部的資料保存暫存器x),隨后,DHRx暫存器的內容或被自動地傳送到DORx暫存器,或通過軟體觸發或外部事件觸發被傳送到DORx暫存器,

雙DAC通道,有3種情況:
-
8位資料右對齊:用戶須將DAC通道1資料寫入暫存器DAC_DHR8RD[7:0]位(實際是存入暫存器DHR1[11:4]位),將DAC通道2資料寫入暫存器DAC_DHR8RD[15:8]位(實際是存入暫存器DHR2[11:4]位);
-
12位資料左對齊:用戶須將DAC通道1資料寫入暫存器DAC_DHR12LD[15:4]位(實際是存入暫存器DHR1[11:0]位),將DAC通道2資料寫入暫存器DAC_DHR12LD[31:20]位(實際是存入暫存器DHR2[11:0]位);
-
12位資料右對齊:用戶須將DAC通道1資料寫入暫存器DAC_DHR12RD[11:0]位(實際是存入暫存器DHR1[11:0]位),將DAC通道2資料寫入暫存器DAC_DHR12RD[27:16]位(實際是存入暫存器DHR2[11:0]位),

04、DAC輸出電壓
當DAC的參考電壓位VREF+的時候,數字輸入經過DAC被線性地轉換為模擬電壓輸出,其范圍為0到VREF+,
任一DAC通道引腳上的輸出電壓滿足下面的關系:
DAC輸出= VREF x (DOR / 4095),
注意:此時資料格式:應該選擇12位資料右對齊,
05、代碼配置
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); }
設定輸出電壓
//設定通道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位右對齊資料格式設定DAC值 }
測驗用例很簡單,就是反復輸出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); //延時500ms GPIO_ResetBits(GPIOE,GPIO_Pin_4);//點亮LED燈 Dac1_Set_Vol(3000); LCD_ShowString(0,0,"DAC OUT 3.0V"); Delay(500); //延時500ms }
下載驗證

硬體和軟體開源地址:
https://github.com/strongercjd/STM32F207VCT6
點擊查看本文所在的專輯,STM32F207教程
關注公眾號,第一時間收到文章更新
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/263172.html
標籤:其他
