STM32CubeMX學習筆記(19)——DAC接口使用(輸出三角波)

一、DAC簡介

DAC(Digital-to-Analog Converter),即數字/模擬轉換模塊,故名思議,它的作用就是把輸入的數字編碼,轉換成對應的模擬電壓輸出,它的功能與 ADC 相反。在常見的數字信號系統中,大部分傳感器信號被化成電壓信號,而 ADC 把電壓模擬信號轉換成易于計算機存儲、處理的數字編碼,由計算機處理完成后,再由 DAC 輸出電壓模擬信號,該電壓模擬信號常用來驅動某些執行器件,使人類易于感知。如音頻信號的采集及還原就是這樣一個過程。

STM32 具有片上 DAC 外設,它的分辨率可配置為 8 位或 12 位的數字輸入信號,具有兩個 DAC 輸出通道,這兩個通道互不影響,每個通道都可以使用 DMA 功能,都具有出錯檢測能力,可外部觸發。

二、DAC通道選擇

在 STM32 中具有 2 個這樣的 DAC 部件,每個 DAC 有 1 個對應的輸出通道連接到特定的引腳,即:PA4-通道 1PA5-通道 2,為避免干擾,使用 DAC 功能時,DAC 通道引腳需要被配置成模擬輸入功能(AIN)。

三、新建工程

1. 打開 STM32CubeMX 軟件,點擊“新建工程”

2. 選擇 MCU 和封裝

3. 配置時鐘
RCC 設置,選擇 HSE(外部高速時鐘) 為 Crystal/Ceramic Resonator(晶振/陶瓷諧振器)


選擇 Clock Configuration,配置系統時鐘 SYSCLK 為 72MHz
修改 HCLK 的值為 72 后,輸入回車,軟件會自動修改所有配置

4. 配置調試模式
非常重要的一步,否則會造成第一次燒錄程序后續無法識別調試器
SYS 設置,選擇 Debug 為 Serial Wire

四、DAC1

4.1 參數配置

Analog 中選擇 DAC 設置,并選擇 OUT1 Configuration 通道1


或者在右邊圖找到 PA4 引腳,選擇 DAC_OUT1

具體配置參數如下。

  • OUT1/2 Configuration
    對應兩個輸出通道。
  • External Trigger
    外部中斷EXTI9 觸發 就是使用外部中斷來觸發DAC。
  • Output Buffer
    使能DAC輸出緩存。

DAC 集成了 2 個輸出緩存,可以用來減少輸出阻抗,無需外部運放即可直接驅動外部負載。每個 DAC 通道輸出緩存可以通過設置 DAC_CR 寄存器的 BOFFx 位來使能或者關閉。如果帶載能力還不行,后面就接一個電壓跟隨器,選擇運放一定要選擇電流大的型號。
使能輸出緩沖后,DAC 輸出的最小電壓為 0.2V,最大電壓為 VREF+-0.2,而未使能輸出緩沖則輸出可達到0V。

  • Trigger
    選擇DAC的觸發方式
    Timer 2/4/5/6/7/8 Trigger Out event 定時器觸發,利用這種方式可以輸出特定的波形。在這里我們選擇定時器2。
    Software trigger 軟件觸發,在本模式下,向 DAC_SWTRIGR 寄存器寫入配置即可觸發信號進行轉換。
  • Wave generation mode
    • Triangle wave generation:輸出三角波。
    • Noise wave generation:輸出噪聲。
  • Maximum Triangle Amplitude:最大三角波幅,設三角波幅值為3.3V,即4095。

五、TIM2通用定時器

5.1 參數配置

Timers 中選擇 TIM2 設置,時鐘源 Clock Source 選擇內部時鐘 Internal Clock

Parameter Settings 進行具體參數配置。

定時器頻率:

TIM2的定時器頻率:f = Tclk/[(psc+1) * (cnt+1)] = 72MHz/[4*9] = 2MHz。

  • 定時器時鐘Tclk:72MHz
  • 預分頻器psc:3
  • 自動重裝載值cnt:8
  • Prescaler(時鐘預分頻數):4-1 則驅動計數器的時鐘 CK_CNT = CK_INT(即72MHz)/(3+1) = 18MHz
  • Counter Mode(計數模式):Up(向上計數模式)
  • Counter Period(自動重裝載值):9-1
  • auto-reload-preload(自動重裝載):Disable(不使能)
  • TRGO Parameters(觸發輸出):Update Event(更新事件) 在定時器的定時時間到達的時候輸出一個信號(如:定時器更新產生TRGO信號來觸發ADC的同步轉換)

5.2 生成代碼

輸入項目名和項目路徑


選擇應用的 IDE 開發環境 MDK-ARM V5

每個外設生成獨立的 ’.c/.h’ 文件
不勾:所有初始化代碼都生成在 main.c
勾選:初始化代碼生成在對應的外設文件。 如 GPIO 初始化代碼生成在 gpio.c 中。

點擊 GENERATE CODE 生成代碼

六、庫函數

/* 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輸出值
/**
  * @brief  Starts the TIM Base generation.
  * @param  htim TIM Base handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);

七、修改main函數

添加 HAL_TIM_Base_Start() 函數,啟動定時器。
添加 HAL_DAC_Start()函數,啟動 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 */
}

八、實驗現象


設三角波幅值為3.3V,即4095,所以三角波的頻率為:定時器頻率/(設定值x2) = 2000000Hz/(4095x2) ≈ 244.2Hz,與示波器測量結果244.9Hz接近。


九、注意事項

用戶代碼要加在 USER CODE BEGIN NUSER CODE END N 之間,否則下次使用 STM32CubeMX 重新生成代碼后,會被刪除。


? 由 Leung 寫于 2021 年 3 月 16 日

? 參考:STM32CubeMX系列教程8:數模轉換(DAC)
    【STM32】HAL庫 STM32CubeMX教程十---DAC
    輸出結果 配置_STM32CubeMX軟件開發教程——DAC輸出三角波

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容