STM32 DAC詳解:從原理到實戰輸出正弦波


目錄

    • 一、DAC基礎原理
      • 1.1 DAC的作用與特性
      • 1.2 DAC功能框圖解析
    • 二、DAC配置步驟
      • 2.1 硬件配置
      • 2.2 初始化結構體詳解
    • 三、DAC數據輸出與波形生成
      • 3.1 數據格式與電壓計算
      • 3.2 正弦波生成實戰
        • 3.2.1 生成正弦波數組
        • 3.2.2 配置DMA傳輸
        • 3.2.3 定時器觸發配置
    • 四、常見問題與優化建議
      • 4.1 典型問題
      • 4.2 擴展應用
    • 五、總結

本文基于STM32系列微控制器的DAC(數字模擬轉換器)模塊,系統講解其原理、配置方法、數據輸出模式及實戰應用。內容涵蓋DAC功能框圖、寄存器配置、波形生成原理、HAL庫函數使用,并提供完整的代碼示例和設計思路,幫助初學者快速掌握DAC開發技巧。


一、DAC基礎原理

1.1 DAC的作用與特性

DAC(Digital to Analog Converter)是將數字信號轉換為模擬電壓的核心外設,廣泛應用于音頻輸出、電機控制、傳感器驅動等場景。STM32的DAC模塊具備以下特性[1]:

  • 雙通道獨立輸出:支持通道1(PA4)和通道2(PA5)。
  • 高分辨率:12位模式下可輸出4096級電壓(0~3.3V)。
  • 多觸發模式:支持軟件觸發、定時器觸發及外部事件觸發。
  • 波形生成功能:可輸出噪聲波、三角波,結合DMA可實現復雜波形(如正弦波)。

1.2 DAC功能框圖解析

在這里插入圖片描述
在這里插入圖片描述

STM32的DAC模塊核心由以下部分組成:

  1. 參考電壓源(VREF+):決定輸出電壓范圍(通常接3.3V)。
  2. 數據寄存器(DHRx/DORx):DHRx為數據保持寄存器,DORx為輸出寄存器,數據通過觸發事件從DHRx轉移到DORx。
  3. 觸發邏輯:控制數據轉換時機,支持定時器、外部中斷等觸發源。
  4. 輸出緩沖器:降低輸出阻抗,但可能引入電壓偏移(需根據負載選擇是否啟用)。

二、DAC配置步驟

2.1 硬件配置

  1. 引腳初始化:將PA4/PA5配置為模擬輸入模式(AIN),避免干擾。

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
  2. 時鐘使能:開啟DAC和GPIO時鐘。

    __HAL_RCC_DAC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    

2.2 初始化結構體詳解

通過DAC_HandleTypeDef配置DAC工作模式:

DAC_HandleTypeDef hdac;
hdac.Instance = DAC1;DAC_ChannelConfTypeDef sConfig = {.DAC_Trigger = DAC_TRIGGER_T2_TRGO,  // 定時器2觸發.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE, // 禁用輸出緩沖.DAC_OutputSwitch = DAC_OUTPUTSWITCH_ENABLE
};
HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1);

關鍵參數說明

  • 觸發模式DAC_TRIGGER_NONE(自動觸發)或外部觸發(如定時器)。
  • 數據對齊:12位右對齊(DAC_ALIGN_12B_R)適用于常規電壓輸出。
  • 輸出緩沖:禁用緩沖可輸出0V,但驅動能力較弱。

三、DAC數據輸出與波形生成

3.1 數據格式與電壓計算

輸出電壓公式:
[ V_{out} = \frac{DORx \times V_{REF+}}{4095} ]

例如,12位模式下設置值為2048時,輸出電壓為1.65V。

3.2 正弦波生成實戰

3.2.1 生成正弦波數組
#define SAMPLES 256 // 采樣點數
uint16_t sin_wave[SAMPLES];for (int i = 0; i < SAMPLES; i++) {sin_wave[i] = (uint16_t)(2047 * sin(2 * 3.1415926 * i / SAMPLES) + 2048);
}
3.2.2 配置DMA傳輸
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sin_wave, SAMPLES, DAC_ALIGN_12B_R);
3.2.3 定時器觸發配置
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = SystemCoreClock / (SAMPLES * 1000); // 生成1kHz正弦波
HAL_TIM_Base_Start(&htim2);

頻率公式
[ f_{正弦波} = \frac{f_{定時器}}{SAMPLES} ]


四、常見問題與優化建議

4.1 典型問題

  1. 無法輸出0V:檢查輸出緩沖是否禁用(DAC_OutputBuffer設為DISABLE)。
  2. 波形畸變:確保DMA傳輸速率與觸發頻率匹配,避免數據覆蓋。
  3. 噪聲干擾:在DAC輸出端并聯0.1μF電容濾除高頻噪聲。

4.2 擴展應用

  • PWM DAC:通過PWM波+RC濾波器實現低成本多通道DAC(精度較低)。
  • 雙通道同步:使用DAC_DHR12RD寄存器同時更新兩個通道數據。

五、總結

本文從STM32的DAC基礎原理出發,詳細講解了配置方法、數據輸出模式及實戰應用,覆蓋了從寄存器操作到HAL庫函數調用的全流程。通過結合DMA和定時器,開發者可實現高精度波形輸出,滿足工業控制、音頻處理等場景需求。


參考代碼與資料

  • STM32F1 DAC開發手冊 )
  • HAL庫DAC配置示例
  • 正弦波生成原理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73795.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CNN 稠密任務經典結構

FCN UNet FPN FCNUNETFPNpadding無&#xff08;逐漸變小&#xff09; 有&#xff08;左右對稱&#xff09;上采樣 雙線性雙線性 最近鄰跳躍鏈接 相加 Cropcat 1x1卷積相加 三個網絡差不多&#xff0c;UNet名字最直觀&#xff0c;后續流傳…

AI學習第二天--監督學習 半監督學習 無監督學習

目錄 1. 監督學習&#xff08;Supervised Learning&#xff09; 比喻&#xff1a; 技術細節&#xff1a; 形象例子&#xff1a; 2. 無監督學習&#xff08;Unsupervised Learning&#xff09; 比喻&#xff1a; 技術細節&#xff1a; 形象例子&#xff1a; 3. 半監督學…

Elasticsearch:為推理端點配置分塊設置

推理端點對一次可處理的文本量有限&#xff0c;具體取決于模型的輸入容量。分塊&#xff08;Chunking&#xff09; 是指將輸入文本拆分成符合這些限制的小塊的過程&#xff0c;在將文檔攝取到 semantic_text 字段時會進行分塊。分塊不僅有助于保持輸入文本在可處理范圍內&#…

Unity打包Android平臺調用sherpa-onnx

https://github.com/xue-fei/sherpa-onnx-unity 最初測試了PC的Win和Linux平臺&#xff0c;直接從nuget緩存包中拷貝相關文件&#xff0c;按示例寫了語音轉文字和文字轉語音的測試代碼&#xff0c;功能都正常。 然后是Android端&#xff0c;看了示例發現有編譯好的jni.so之類的…

傳統會議室接入神旗視訊-2 Android會議室大屏設備 (Maxhub, Newline, TCL等)

隨著企業對視頻會議安全性、穩定性和統一管理的需求日益增長&#xff0c;私有化視頻會議系統憑借其全平臺兼容性、高安全性部署和智能化會控能力&#xff0c;成為政企客戶的核心選擇。Android會議室大屏設備&#xff08;Maxhub, Newline, TCL等&#xff09;作為國內主流智能會議…

個人blog系統 前后端分離 前端js后端go

系統設計&#xff1a; 1.使用語言&#xff1a;前端使用vue&#xff0c;并使用axios向后端發送數據。后端使用的是go的gin框架&#xff0c;并使用grom連接數據庫實現數據存儲讀取。 2.設計結構&#xff1a; 最終展示&#xff1a;僅展示添加模塊&#xff0c;其他模塊基本相似 前…

分支結構- P5717-三角形分類-第二十一天

洛谷題單 第二十一天&#xff1a;3.18&#xff08;周二&#xff09; 題目&#xff1a;分支結構–P5717 代碼 #include <stdio.h>//本題目卡住的點&#xff1a;1.邏輯問題 2.對if-else if-else結構的運行理解&#xff0c;導致了邏輯混亂//注意&#xff1a;程序會組個…

華為OD機試 - 最長回文字符串 - 貪心算法(Java 2024 E卷 100分)

題目描述 如果一個字符串正讀和反讀都一樣(大小寫敏感),則稱之為一個「回文串」。例如: level 是一個「回文串」,因為它的正讀和反讀都是 level。art 不是一個「回文串」,因為它的反讀 tra 與正讀不同。Level 不是一個「回文串」,因為它的反讀 leveL 與正讀不同(因大小…

C語言文件操作入門

本節重點 理解文件的形式與基本概念二進制文件與文本文件文件的打開與關閉文件讀寫函數、文件緩沖區 正文開始--------------------------------------------------------------------------------------------------------------------- 一、為什么使用文件 程序運行時數據存…

Doris:聯邦認證

LDAP? 接入第三方 LDAP 服務為 Doris 提供驗證登錄和組授權服務。 LDAP 驗證登錄? LDAP 驗證登錄指的是接入 LDAP 服務的密碼驗證來補充 Doris 的驗證登錄。Doris 優先使用 LDAP 驗證用戶密碼&#xff0c;如果 LDAP 服務中不存在該用戶則繼續使用 Doris 驗證密碼&#xff…

stm32第六天繼電器

一&#xff1a;繼電器 1.繼電器的工作原理 繼電器是一個電控開關&#xff0c;工作原理基于電磁感應&#xff0c;繼電器包括一個電磁線圈和一組觸點。常用于控制高電流或高電壓的電路&#xff0c;例如自動控制原理&#xff0c;電力系統和自動化設備中&#xff0c;由于可靠性和電…

Vue渲染函數 - render 函數

文章目錄 Vue渲染函數 - render 函數1. 什么是 render 函數2、頁面展示過程3、render 函數的參數4. 如何使用&#xff08;1&#xff09;基本渲染&#xff08;2&#xff09;傳遞屬性和事件&#xff08;3&#xff09;條件渲染 5. render 函數的實際使用6.View Design 組件中的使用…

單片機自學總結

自從工作以來&#xff0c;一直努力耕耘單片機&#xff0c;至今&#xff0c;頗有收獲。從51單片機&#xff0c;PIC單片機&#xff0c;直到STM32&#xff0c;以及RTOS和Linux&#xff0c;幾乎天天在搞:51單片機&#xff0c;STM8S207單片機&#xff0c;PY32F003單片機&#xff0c;…

go回調函數的使用

在Go語言中&#xff0c;回調函數可以有參數&#xff0c;也可以沒有參數。它們的定義和使用方式略有不同&#xff0c;但本質上都是將函數作為參數傳遞給另一個函數&#xff0c;并在適當的時候調用它。以下是帶參數和不帶參數的回調函數的示例和說明。 1. 不帶參數的回調函數 不…

在 Ubuntu 中配置 NFS 共享服務的完整指南

前言 網絡文件系統&#xff08;NFS&#xff09;作為 Linux 系統間實現文件共享的標準協議&#xff0c;在分布式計算和容器化部署場景中具有重要作用。本文將詳細演示如何在 Ubuntu 系統上配置 NFS 服務端與客戶端&#xff0c;并實現可靠的持久化掛載。 一、環境準備 系統要求…

TypeScript Symbols 深度解析:在 Vue3 中的高級應用實踐

一、Symbols 核心特性解析 1.1 什么是 Symbol&#xff1f; Symbol 是 ES6 引入的原始數據類型&#xff0c;表示唯一且不可變的值&#xff0c;主要解決對象屬性名沖突問題。在 TypeScript 中&#xff0c;我們通過 symbol 類型獲得完整的類型支持&#xff1a; const SERIAL_KE…

無需刷機、root,暢享原生安卓的絲滑體驗。

Apex Launcher 是一款歷史悠久的 Android 桌面啟動器&#xff0c;誕生于 Android 系統早期&#xff08;Android 4.0 時代&#xff09;。當時&#xff0c;Android 系統的默認界面被認為較為簡陋&#xff0c;無法滿足一些追求個性化和高效操作的用戶需求。因此&#xff0c;許多開…

Visual Studio Code安裝配置優化全攻略:打造高效開發環境

目錄 一、背景與意義 二、安裝與配置基礎 2.1 下載與安裝 2.2 核心配置目錄 三、深度優化配置指南 3.1 主題與界面優化 3.2 必裝效率插件&#xff08;精選TOP10&#xff09; 3.3 性能優化設置 四、實戰案例&#xff1a;前端開發環境配置 4.1 項目初始化 4.2 調試配置…

味覺傳送器E-Taste:開啟虛擬世界的味覺之門

味覺傳送器E-Taste&#xff1a;開啟虛擬世界的味覺之門 一、發明背景與動機 隨著虛擬現實&#xff08;VR&#xff09;和增強現實&#xff08;AR&#xff09;技術的飛速發展&#xff0c;人們在虛擬世界中的沉浸感不斷提升&#xff0c;視覺和聽覺體驗已經取得了顯著的突破。然而…