STM32-DAC數模轉換

DAC數模轉換:將數字信號轉換成模擬信號

特性:2個DAC轉換器每個都擁有一個轉換通道

8位或12位單調輸出(8位右對齊;12位左對齊右對齊)

雙ADC通道同時或者分別轉換

外部觸發中斷

  1. ?電壓源
  2. 控制部分(外部觸發3個APB1;不使用1個APB1)
  3. 外部觸發
  4. 輸出:DAC1-PA4;DAC2-PA5

軟件設計流程:

  • 使能端口以及DAC時鐘;設置引腳為模擬輸入
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC時鐘GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬量輸入
  • 初始化DAC,設置DAC工作模式(觸發選擇;DAC波形發生;屏蔽\幅值選擇器;DAC輸出)
typedef struct
{uint32_t DAC_Trigger;                      /*!< 指定所選DAC通道的外部觸發源此參數可以是 @ref DAC_trigger_selection 中的一個值 */uint32_t DAC_WaveGeneration;               /*!< 指定是否生成DAC通道的噪聲波或三角波,或不生成任何波形此參數可以是 @ref DAC_wave_generation 中的一個值 */uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< 指定噪聲波生成的LFSR掩碼或DAC通道的三角波最大生成幅度此參數可以是 @ref DAC_lfsrunmask_triangleamplitude 中的一個值 */uint32_t DAC_OutputBuffer;                 /*!< 指定是否啟用或禁用DAC通道的輸出緩沖器此參數可以是 @ref DAC_output_buffer 中的一個值 */
}DAC_InitTypeDef;
  • 使能DAC輸出通道
	DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC通道1
  • 設置DAC輸出值
/*** @brief  設置DAC通道1的轉換數據* @param  DAC_Align: 指定數據對齊方式*         該參數可以是 @ref DAC_data_align 中的一個值,例如:*           - DAC_Align_8b_R: 8位右對齊*           - DAC_Align_12b_L: 12位左對齊*           - DAC_Align_12b_R: 12位右對齊* @param  Data: 要轉換的數字值*         - 對于8位右對齊,有效范圍為0~255(0x00~0xFF)*         - 對于12位右對齊,有效范圍為0~4095(0x000~0xFFF)*         - 對于12位左對齊,有效范圍同樣為0~4095,但數據需左移4位* @retval 無* @note   寫入的數據將在下次觸發事件(如軟件觸發或定時器觸發)時轉換為模擬電壓*         轉換后的電壓值 = (Data / 滿量程值) × VREF+*         例如,對于12位DAC且VREF+=3.3V,Data=2048對應電壓1.65V*/
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)

代碼如下:

#include "dac.h"/*******************************************************************************
* 函 數 名         : DAC1_Init
* 函數功能		   : DAC1初始化函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void DAC1_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;DAC_InitTypeDef DAC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC時鐘GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//DAC_1GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬量輸入GPIO_Init(GPIOA,&GPIO_InitStructure);DAC_InitStructure.DAC_Trigger=DAC_Trigger_None;	//不使用觸發功能 TEN1=0DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形發生DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值設置DAC_InitStructure.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;	//DAC1輸出緩存關閉 BOFF1=1DAC_Init(DAC_Channel_1,&DAC_InitStructure);	 //初始化DAC通道1DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右對齊數據格式設置DAC值DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC通道1}

主函數代碼:(按鍵按下,DAC寫入轉換值)

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "dac.h"/*******************************************************************************
* 函 數 名         : main
* 函數功能		   : 主函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
int main()
{u8 i=0;u8 key;int dac_value=0;u16 dacval;float dac_vol;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中斷優先級分組 分2組LED_Init();USART1_Init(115200);KEY_Init();DAC1_Init();while(1){key=KEY_Scan(0);//單次按下if(key==KEY_UP_PRESS){dac_value+=400;if(dac_value>=4000){dac_value=4095;}DAC_SetChannel1Data(DAC_Align_12b_R,dac_value);//寫入4095}else if(key==KEY1_PRESS){dac_value-=400;	if(dac_value<=0){dac_value=0;}DAC_SetChannel1Data(DAC_Align_12b_R,dac_value);			}i++;if(i%20==0){LED1=!LED1;}if(i%50==0){dacval=DAC_GetDataOutputValue(DAC_Channel_1);dac_vol=(float)dacval*(3.3/4096);printf("輸出DAC電壓值為:%.2fV\r\n",dac_vol);}delay_ms(10);	}
}

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

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

相關文章

前后端集合如何傳遞

前端vue后端rest風格&#xff1a;1.路徑傳參&#xff08;參數必傳&#xff09;&#xff0c;通過pathvarible注解后端&#xff1a;DeleteMapping("/{YYIDs}")public R<Void> remove(NotEmpty(message "主鍵不能為空")PathVariable String[] YYIDs) {…

1353. 最多可以參加的會議數目

1353. 最多可以參加的會議數目 題目鏈接&#xff1a;1353. 最多可以參加的會議數目 代碼如下&#xff1a; class Solution { public:int maxEvents(vector<vector<int>>& events) {int mx 0;for (auto& e : events) {mx max(mx, e[1]); // 找到最大的結…

OCR 本地版本

UMI OCR 支持本地部署&#xff0c;支持HTTP OCR

大數據驅動的酒店用品需求預測模型研究 開發——畢業論文,畢業設計——仙盟創夢IDE

主頁酒店用品 平臺協議促銷畢業論文摘要本研究旨在構建基于大數據分析的酒店用品需求預測模型&#xff0c;以提高酒店用品批發企業的庫存管理效率和供應鏈響應速度。研究整合了酒店歷史采購數據、季節因素、市場趨勢、節假日信息等多源數據&#xff0c;通過對比傳統時間序列模型…

Windows11桌面解鎖守護腳本

使用python程序加bat一鍵運行腳本&#xff0c;媽媽再也不用擔心我的電腦桌面了import os import time import cv2 import pyautogui import psutil from datetime import datetimeclass UnlockMonitor:def __init__(self):"""初始化監控器"""sel…

Linux Ubuntu系統的用戶管理

一.關于root用戶默認我們安裝完系統后 注冊的用戶就是管理員用戶標識符 $ 管理員標識符#最高管理員在Ubuntu系統中,root是最高管理員,擁有最大的權限,默認情況下root用戶沒有啟用密碼,而是通過sudo機制來獲取管理員權限二.Ubuntu系統中root用戶的默認狀態root用戶存在,但未啟用…

ROS1學習第三彈

ROS1學習第二彈 本文純屬記錄學習過程&#xff0c;所學教程來自B站古月居ROS入門21講 tf工具的使用 命令行中 1.rosrun tf view_frames 生成當前各個坐標的結構圖&#xff0c;導出pdf文件到當前終端所在文件夾下面2.rosrun rviz rviz -d rospackage find turtle_tf /rviz/tu…

技術演進中的開發沉思-30 MFC系列:五大機制

MFC&#xff0c;記得我剛畢業時在 CRT 顯示器前敲下第一行 MFC 代碼時&#xff0c;那時什么都不懂&#xff0c;沒有框架的概念。只覺得眼前的 CObject 像位沉默且復雜的大家族&#xff0c; 就像老北京胡同里的大家族&#xff0c;每個門牌號都藏著自己的故事。但現在看看&#x…

機器學習-06(Optimization-自動調整學習率)

臨界點其實不一定是在訓練神經網絡過程中遇到的最大阻礙。隨著對參數的不斷更新&#xff0c;Loss值會不斷下降&#xff0c;直至幾乎沒有變化&#xff0c;不再下降。當參數更新到臨界點時&#xff0c;意味著gradient非常小&#xff0c;所以要認定參數是否到達臨界點應當確認grad…

Uniapp中的uni.scss

uni.scss為uni-app新建項目自帶工程文件&#xff0c;使用的預處理器為sass/scss&#xff0c;由此可見&#xff0c;uni-app官方推薦的是scss。 uni.scss特點 無需引入&#xff0c;uni-app在編譯時&#xff0c;會自動引入此文件在此中定義的scss變量&#xff0c;可以全局使用&…

PreparedStatement 實現分頁查詢詳解

PreparedStatement 實現分頁查詢詳解 在 JDBC 中使用 PreparedStatement 實現分頁查詢是高效安全的方式&#xff0c;可以避免 SQL 注入并提升性能。下面我將詳細說明實現步驟和原理。 &#x1f4d0; 分頁查詢核心參數參數名說明計算公式pageNum當前頁碼&#xff08;從1開始&…

ClamAV 和 FreshClam:Linux 服務器上的開源殺毒解決方案

ClamAV 和 FreshClam:Linux 服務器上的開源殺毒解決方案 1. 概述 ClamAV 是一款開源的防病毒引擎,專為 Linux 服務器設計,用于檢測惡意軟件、病毒、木馬和其他安全威脅。它廣泛應用于郵件服務器、文件存儲系統和 Web 服務器,提供高效的病毒掃描功能。 主要特點: 免費開…

PySpark中python環境打包和JAR包依賴

在 PySpark 中打包 Python 環境并調度到集群是處理依賴一致性的關鍵步驟。以下是完整的解決方案&#xff0c;包含環境打包、分發和配置方法&#xff1a; 一、環境打包方法 使用 Conda 打包環境 # 創建 Conda 環境 conda create -n pyspark_env python3.8 conda activate pyspar…

和鯨社區深度學習基礎訓練營2025年關卡2(1)純numpy

擬分3種實現方法&#xff1a;1.純numpy2.sklearn中的MLPClassifier3.pytorch題目&#xff1a; 在 MNIST 數據集上訓練 MLP 模型并比較不同的激活函數和優化算法任務描述&#xff1a;使用 MNIST 數據集中的前 20,000 個樣本訓練一個多層感知機 (MLP) 模型。你需要比較三種不同的…

Sequential Thinking:AI深度思考的新范式及其與CoT、ReAct的對比分析

引言&#xff1a;AI深度思考的演進與Sequential Thinking的崛起在人工智能技術快速發展的今天&#xff0c;AI模型的思考能力正經歷著從簡單應答到深度推理的革命性轉變。這一演進過程不僅反映了技術本身的進步&#xff0c;更體現了人類對機器智能認知邊界的持續探索。早期的大語…

云原生詳解:構建現代化應用的未來

引言 在數字化轉型的浪潮中,"云原生"已成為技術領域最熱門的話題之一。從初創公司到全球500強企業,都在積極探索云原生技術以提升業務敏捷性和創新能力。本文將全面解析云原生的概念、核心技術、優勢以及實踐路徑,幫助您深入理解這一改變IT格局的技術范式。 什么…

SSE事件流簡單示例

文章目錄1、推送-SseEmitter2、接收-EventSourceListenerSSE&#xff08;Server-Sent Events&#xff0c;服務器推送事件&#xff09;是一種基于HTTP的服務器向客戶端實時推送數據的技術標準。1、推送-SseEmitter SseEmitter用于實現服務器向客戶端單向、長連接的實時數據推送…

Elasticsearch RESTful API入門:基礎搜索與查詢DSL

Elasticsearch RESTful API入門&#xff1a;基礎搜索與查詢DSL 本文為Elasticsearch初學者詳細解析RESTful API的核心操作與查詢DSL語法&#xff0c;包含大量實戰示例及最佳實踐。 一、Elasticsearch與RESTful API簡介 Elasticsearch&#xff08;ES&#xff09;作為分布式搜索…

(六)復習(OutBox Message)

文章目錄 項目地址一、OutBox Message1.1 OutBox表配置1. OutBoxMessage類2. OutboxMessage表配置3. 給每個模塊生成outboxmessage表1.2 發布OutBox Message1. 修改Intercepotor2. 配置Quartz3. 創建Quatz方法發布領域事件4. 創建Quatz定時任務5. 注冊Quatz服務和配置6. 流程梳…

STM32-ADC內部溫度

在通道16無引腳&#xff08;測量溫度不準確&#xff09;跟ADC代碼差不多&#xff1b;不需要使能引腳時鐘&#xff1b;將內部溫度測量打開/*** brief 啟用或禁用溫度傳感器和內部參考電壓功能* param NewState: 新的功能狀態&#xff0c;取值為ENABLE或DISABLE* retval 無* no…