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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…