前言:
本系列教程將 對應外設原理,HAL庫與STM32CubeMX結合在一起講解,使您可以更快速的學會各個模塊的使用
所用工具:
1、芯片: STM32F407ZET6/ STM32F103ZET6
2、STM32CubeMx軟件
3、IDE: MDK-Keil軟件
4、STM32F1xx/STM32F4xxHAL庫
知識概括:
通過本篇博客您將學到:
DAC工作原理
STM32CubeMX創建DAC例程
HAL庫定時器DAC函數庫
DAC
Digital-to-Analog Converter的縮寫。數模轉換器。又稱D/A轉換器,簡稱DAC,是指將離散的數字信號轉換爲連續變量的模擬信號的器件。
典型的數字模擬轉換器將表示一定比例電壓值的數字信號轉換爲模擬信號。
STM32F1中有兩個DAC,可以同時使用STM32的DAC模塊是12位數字輸入,電壓輸出型的DAC。
DAC 有兩個用途:輸出波形和輸出固定電壓
DAC工作原理
DAC工作框圖
這裏我們把它分爲三部分講解:
"觸發方式 " “控制邏輯” "數模轉換器"
觸發方式
第一部分,觸發方式,是指DAC轉換可以由某外部事件觸發(定時器計數器、外部中斷線)。配置控制位TSELx[2:0]可以選擇8個觸發事件之一觸發DAC轉換,任意一種觸發源都可以觸發DAC轉換。
具體的外部觸發可看下圖:
六個是定時器觸發:TIM2,TIM4,TIM5,TIM6,TIM7和TIM8。剩下兩個分別是:EXTI線路9(PC9)和軟件觸發
每次DAC接口偵測到來自選中的定時器TRGO輸出,或者外部中斷線9的上升沿,近存放在寄 存器DAC_DHRx中的數據會被傳送到寄存器DAC_DORx中。在3個APB1時鐘週期後,寄存器 DAC_DORx更新爲新值。
如果選擇軟件觸發,一旦SWTRIG位置’1’,轉換即開始。在數據從DAC_DHRx寄存器傳送到 DAC_DORx寄存器後,SWTRIG位由硬件自動清’0’
2控制邏輯
此部分決定了DAC的波形控制,輸出方式,DMA傳輸,等等,
我們來具體講解下,
從框圖可以看出,DAC受DORx寄存器直接控制的,但是
數據並不是直接傳入DORx的,需要先傳入DHRx 之後在間接地傳給DORx寄存器 不能直接往DORx寄存器寫入數據
- 如果沒有選擇硬件觸發(TENx=0),在一個APB1週期後傳入DORx,
- 如果選擇硬件觸發(TENx=1),則在3個APB1週期後傳入DORx
一旦數據從DAC_DHRx寄存器裝入DAC_DORx寄存器,在經過時間Tsetting(大約3us) 之後,輸出即有效,這段時間的長短依電源電壓和模擬輸出負載的不同會有所變化
上圖的DMAENx TENx MAMOx[3:0],WAVENx[1:0]位 都是由DAC_CR寄存器控制的
DMAENx 控制DAC通道1/2 的DMA使能
MAMP2[3:0]:DAC通道2屏蔽/幅值選擇器 位 27:24 由軟件設置這些位,
用來在噪聲生成模式下選擇屏蔽位,在三角波生成模式下選擇波形的幅值。
WAVE2[1:0]:DAC通道2噪聲/三角波生成使能
位23:22
決定是否產生波形,和產生什麼波形。
00:關閉波形發生器;
10:使能噪聲波形發生器;
1x:使能三角波發生器。
TENx:DAC通道x觸發使能,用來使能/關閉DAC通道x的觸發。
0:關閉DAC通道x觸發,寫入DAC_DHRx寄存器的數據在1個APB1時鐘週期後傳入 DAC_DORx寄存器;
1:使能DAC通道x觸發,寫入DAC_DHRx寄存器的數據在3個APB1時鐘週期後傳入 DAC_DORx寄存器。
注意:如果選擇軟件觸發,寫入寄存器DAC_DHRx的數據只需要1個APB1時鐘週期就可以傳入 寄存器DAC_DORx。
3數模轉換器
VDDA和VSSA爲DAC模塊模擬部分的供電。
Vref+則是DAC模塊的參考電壓。
DAC_OUTx就是DAC的輸出通道了(對應PA4或者PA5引腳)
從左邊的參考電壓Vref+ ---->數模轉換器 ---->模擬信號輸出引腳
注意:DAC的引腳應該設置成模擬輸入(AIN)模式
DAC輸出電壓:
數字輸入經過DAC被線性地轉換爲模擬電壓輸出
其範圍爲 0~VREF+
DAC輸出 = VREF x (DOR/4095)
特殊功能:
噪聲波形生成,三角波形生成,外部觸發轉換,雙DAC同時或者分別轉換;每個通道都有DMA功能;
參考電壓:2.4V~ 3.3V
DAC的主要特徵
- 2個DAC轉換器:
- 每個轉換器對應1個輸出通道;
- 8位或者12位單調輸出;
- 12位模式下數據左對齊或者右對齊;
- 同步更新功能;
- 噪聲波形生成;
- 三角波形生成;
- 雙DAC通道同時或者分別轉換;
- 外部觸發轉換;
- 輸入參考電壓VREF+。
DAC原理總括
數字/模擬轉換模塊(DAC)是12位數字輸入,電壓輸出的數字/模擬轉換器。DAC可以配置爲8位或12位模式,也可以與DMA控制器配合使用。DAC工作在12位模式時,數據可以設置成左對齊或右對齊。DAC模塊有2個輸出通道,每個通道都有單獨的轉換器。在雙DAC模式下,2個通道可以獨立地進行轉換,也可以同時進行轉換並同步地更新2個通道的輸出。DAC可以通過引腳輸入參考電壓VREF+ 以獲得更精確的轉換結果。
CubeMx工程創建
1設置RCC時鐘
設置高速外部時鐘HSE 選擇外部時鐘源
2時鐘源設置
- 1選擇外部時鐘HSE 12MHz
- 2PLL鎖相環倍頻72倍
- 3系統時鐘來源選擇爲PLL
- 4設置APB1分頻器爲 /2
32的時鐘樹框圖 如果不懂的話請看《【STM32】系統時鐘RCC詳解(超詳細,超全面)》
3DAC設置
這個其實沒啥好講的
1.OUT1 和 OUT2對應兩個輸出通道
2.External Trigger 外部中斷EXTI9 觸發
就是使用外部中斷來觸發ADC
3.Tigger 選擇DAC的觸發方式 上方都有講解
Output Buffer 使能DAC輸出緩存
DAC集成了2個輸出緩存,可以用來減少輸出阻抗,無需外部運放即可直接驅動外部負載。每個 DAC通道輸出緩存可以通過設置DAC_CR寄存器的BOFFx位來使能或者關閉
這個使能即可
4項目文件設置
- 1 設置項目名稱
- 2 設置存儲路徑
- 3 選擇所用IDE
5創建工程文件
然後點擊GENERATE CODE 創建工程
配置下載工具
新建的工程所有配置都是默認的 我們需要自行選擇下載模式,勾選上下載後復位運行
例程詳解:
DAC庫函數:
/* IO operation functions *****************************************************/
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel); //開啓DAC輸出
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel); //關閉DAC輸出
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函數中不斷開啓 //開啓DAC的DMA輸出
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); //關閉DAC的DMA輸出
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data); //設置DAC輸出值
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel); //獲取DAC輸出值
DAC輸出電壓:
在main()主函數中設置DAC輸出的數據爲12位右對齊,DAC輸出爲2048,並使能DAC1輸出通道
/* USER CODE BEGIN 2 */
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
/* USER CODE END 2 */
DAC輸出 = VREF x (DOR/4095)
則實際輸出的電壓爲
2048/4096x3.3V=1.65V,
萬用表測量引腳電壓即可
- HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);
功能:設置DAC的輸出值
參數一: DAC結構體名
參數二: 設置DAC通道
參數三: 設置DAC對齊方式
參數四: 設置輸出電壓值 12位最大位4095
- HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
功能:開啓DAC輸出
參數一: DAC結構體名
參數二: DAC通道
DAC輸出波形
DAC輸出三角波
打開STM32cubeMX的DAC工程文件重新配置,
使能DAC輸出通道2。
DAC外部觸發(Trigger) :定時器2觸發,
波形生成模式(Wave generation mode) :三角波發生器(Triangle wave generation).
可以選擇三角波形,和噪聲波形(noise wave generation)
最大三角波幅(Maximum Triangle Amplitude) :4095,
設三角波幅值爲3.3V,即4095
DAC12位數據存儲,最大爲4095
0-4095 對應 0V~3.3V
打開Timers,使能定時器2
配置如下,具體配置原理在前面
【STM32】HAL庫 STM32CubeMX教程六----定時器中斷
有過講解,這裏就不再闡述了,按照圖示配好即可
這裏講下三角波的頻率
簡單的說,首先設置一個DAC最大幅值, 之後設置定時器溢出時間,在每次定時器發生溢出等事件之後,定時器會發送觸發信號TRGO到DAC,這是內部的三角波計數器就會累加1 然後於DAC_DHRx寄存器的值相加,寫到DAC_DORx計數器中,如果該值小於設定的最大幅值,就會正常輸出,當大於最大幅值時就會遞減,減到0之後又開始累加,週而復始,就形成了三角波
三角波頻率:
設三角波幅值爲3.3V,即4095,所以一個週期計數器計數4096*2=8192次,則三角波頻率爲“定時器頻率/8192”
代碼實現:
在main函數中添加以下兩行代碼,即可輸出三角波
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim2);
HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
/* USER CODE END 2 */
分別爲開啓定時器TIM2 和開啓DAC
寫作不易,感覺有用的話,點個贊再走唄!