一、DAC簡(jiǎn)介
DAC(Digital-to-Analog Converter),即數(shù)字/模擬轉(zhuǎn)換模塊没卸,故名思議,它的作用就是把輸入的數(shù)字編碼秒旋,轉(zhuǎn)換成對(duì)應(yīng)的模擬電壓輸出办悟,它的功能與 ADC 相反。在常見的數(shù)字信號(hào)系統(tǒng)中滩褥,大部分傳感器信號(hào)被化成電壓信號(hào)病蛉,而 ADC 把電壓模擬信號(hào)轉(zhuǎn)換成易于計(jì)算機(jī)存儲(chǔ)、處理的數(shù)字編碼瑰煎,由計(jì)算機(jī)處理完成后铺然,再由 DAC 輸出電壓模擬信號(hào),該電壓模擬信號(hào)常用來(lái)驅(qū)動(dòng)某些執(zhí)行器件酒甸,使人類易于感知魄健。如音頻信號(hào)的采集及還原就是這樣一個(gè)過(guò)程。
STM32 具有片上 DAC 外設(shè)插勤,它的分辨率可配置為 8 位或 12 位的數(shù)字輸入信號(hào)沽瘦,具有兩個(gè) DAC 輸出通道革骨,這兩個(gè)通道互不影響,每個(gè)通道都可以使用 DMA 功能析恋,都具有出錯(cuò)檢測(cè)能力良哲,可外部觸發(fā)。
二助隧、DAC通道選擇
在 STM32 中具有 2 個(gè)這樣的 DAC 部件筑凫,每個(gè) DAC 有 1 個(gè)對(duì)應(yīng)的輸出通道連接到特定的引腳,即:PA4-通道 1
并村,PA5-通道 2
巍实,為避免干擾,使用 DAC 功能時(shí)哩牍,DAC 通道引腳需要被配置成模擬輸入功能(AIN)棚潦。
三、新建工程
1. 打開 STM32CubeMX 軟件膝昆,點(diǎn)擊“新建工程”
2. 選擇 MCU 和封裝
3. 配置時(shí)鐘
RCC 設(shè)置瓦盛,選擇 HSE(外部高速時(shí)鐘) 為 Crystal/Ceramic Resonator(晶振/陶瓷諧振器)
選擇 Clock Configuration,配置系統(tǒng)時(shí)鐘 SYSCLK 為 72MHz
修改 HCLK 的值為 72 后外潜,輸入回車,軟件會(huì)自動(dòng)修改所有配置
4. 配置調(diào)試模式
非常重要的一步挠唆,否則會(huì)造成第一次燒錄程序后續(xù)無(wú)法識(shí)別調(diào)試器
SYS 設(shè)置处窥,選擇 Debug 為 Serial Wire
四、DAC1
4.1 參數(shù)配置
在 Analog
中選擇 DAC
設(shè)置玄组,并選擇 OUT1 Configuration
通道1
或者在右邊圖找到
PA4
引腳滔驾,選擇 DAC_OUT1
具體配置參數(shù)如下。
-
OUT1/2 Configuration:
對(duì)應(yīng)兩個(gè)輸出通道俄讹。 -
External Trigger:
外部中斷EXTI9 觸發(fā)
就是使用外部中斷來(lái)觸發(fā)DAC哆致。 -
Output Buffer:
使能DAC輸出緩存。
DAC 集成了 2 個(gè)輸出緩存患膛,可以用來(lái)減少輸出阻抗摊阀,無(wú)需外部運(yùn)放即可直接驅(qū)動(dòng)外部負(fù)載。每個(gè) DAC 通道輸出緩存可以通過(guò)設(shè)置 DAC_CR 寄存器的 BOFFx 位來(lái)使能或者關(guān)閉踪蹬。
如果帶載能力還不行胞此,后面就接一個(gè)電壓跟隨器,選擇運(yùn)放一定要選擇電流大的型號(hào)跃捣。
使能輸出緩沖后漱牵,DAC 輸出的最小電壓為 0.2V,最大電壓為 VREF+-0.2疚漆,而未使能輸出緩沖則輸出可達(dá)到0V酣胀。
-
Trigger:
選擇DAC的觸發(fā)方式
Timer 2/4/5/6/7/8 Trigger Out event
定時(shí)器觸發(fā)刁赦,利用這種方式可以輸出特定的波形。在這里我們選擇定時(shí)器2闻镶。
Software trigger
軟件觸發(fā)甚脉,在本模式下,向 DAC_SWTRIGR 寄存器寫入配置即可觸發(fā)信號(hào)進(jìn)行轉(zhuǎn)換儒溉。 -
Wave generation mode:
-
Triangle wave generation
:輸出三角波宦焦。 -
Noise wave generation
:輸出噪聲。
-
- Maximum Triangle Amplitude:最大三角波幅顿涣,設(shè)三角波幅值為3.3V波闹,即4095。
五涛碑、TIM2通用定時(shí)器
5.1 參數(shù)配置
在 Timers
中選擇 TIM2
設(shè)置精堕,時(shí)鐘源 Clock Source
選擇內(nèi)部時(shí)鐘 Internal Clock
在 Parameter Settings
進(jìn)行具體參數(shù)配置。
定時(shí)器頻率:
TIM2的定時(shí)器頻率:f = Tclk/[(psc+1) * (cnt+1)] = 72MHz/[4*9] = 2MHz蒲障。
- 定時(shí)器時(shí)鐘Tclk:72MHz
- 預(yù)分頻器psc:3
- 自動(dòng)重裝載值cnt:8
-
Prescaler(時(shí)鐘預(yù)分頻數(shù)):4-1
則驅(qū)動(dòng)計(jì)數(shù)器的時(shí)鐘 CK_CNT = CK_INT(即72MHz)/(3+1) = 18MHz
- Counter Mode(計(jì)數(shù)模式):Up(向上計(jì)數(shù)模式)
- Counter Period(自動(dòng)重裝載值):9-1
- auto-reload-preload(自動(dòng)重裝載):Disable(不使能)
-
TRGO Parameters(觸發(fā)輸出):Update Event(更新事件)
在定時(shí)器的定時(shí)時(shí)間到達(dá)的時(shí)候輸出一個(gè)信號(hào)(如:定時(shí)器更新產(chǎn)生TRGO信號(hào)來(lái)觸發(fā)ADC的同步轉(zhuǎn)換)
5.2 生成代碼
輸入項(xiàng)目名和項(xiàng)目路徑
選擇應(yīng)用的 IDE 開發(fā)環(huán)境 MDK-ARM V5
每個(gè)外設(shè)生成獨(dú)立的
’.c/.h’
文件不勾:所有初始化代碼都生成在 main.c
勾選:初始化代碼生成在對(duì)應(yīng)的外設(shè)文件歹篓。 如 GPIO 初始化代碼生成在 gpio.c 中。
點(diǎn)擊 GENERATE CODE 生成代碼
六揉阎、庫(kù)函數(shù)
/* 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); //關(guān)閉DAC輸出
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函數(shù)中不斷開啟 //開啟DAC的DMA輸出
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); //關(guān)閉DAC的DMA輸出
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data); //設(shè)置DAC輸出值
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel); //獲取DAC輸出值
/**
* @brief Starts the TIM Base generation.
* @param htim TIM Base handle
* @retval HAL status
*/
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
七庄撮、修改main函數(shù)
添加 HAL_TIM_Base_Start()
函數(shù),啟動(dòng)定時(shí)器毙籽。
添加 HAL_DAC_Start()
函數(shù)洞斯,啟動(dòng) DAC 輸出。
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_DAC_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim2);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
八坑赡、實(shí)驗(yàn)現(xiàn)象
設(shè)三角波幅值為3.3V烙如,即4095,所以三角波的頻率為:定時(shí)器頻率/(設(shè)定值x2) = 2000000Hz/(4095x2) ≈ 244.2Hz毅否,與示波器測(cè)量結(jié)果244.9Hz接近亚铁。
九、注意事項(xiàng)
用戶代碼要加在 USER CODE BEGIN N
和 USER CODE END N
之間螟加,否則下次使用 STM32CubeMX 重新生成代碼后徘溢,會(huì)被刪除。
? 由 Leung 寫于 2021 年 3 月 16 日
? 參考:STM32CubeMX系列教程8:數(shù)模轉(zhuǎn)換(DAC)
【STM32】HAL庫(kù) STM32CubeMX教程十---DAC
輸出結(jié)果 配置_STM32CubeMX軟件開發(fā)教程——DAC輸出三角波