STM32F407VET6 学习笔记4:DAC数模转换功能的配置

 今日继续学习使用嘉立创的 立创梁山派天空星,芯片是 STM32F407VET6 使用库函数编程

最近突然发现很久没有接触过单片机的AD转换功能了,之前还是学习51单片机时学习驱动PCF8591芯片实现AD转换功能的,还从未在STM32平台上进行过相关的实验经验,这就学习一下

文章提供测试代码讲解、完整工程下载、测试效果图

 

目录

DAC转换:

DAC相关标准库函数:

DAC初始化结构体:

其余相关函数:

初始化DAC:

测试效果图:

测试工程下载:

网上查阅资料:


 

DAC转换:

DAC 模块是 12 位电压输出数模转换器。 在 12 位模式下,数据可以采用左对齐或右对齐。DAC 有两个输出通道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当两个通道组合在一起同步执行更新操作时,也可以同时进行转换。

以下为 STM32F4xx中文参考手册 288页DAC简介

以下为STM32F4xx中文参考手册 289页的DAC通电框图与DAC引脚:

经过线性转换后,数字输入会转换为 0 到 V REF+ 之间的输出电压。

各 DAC 通道引脚的模拟输出电压通过以下公式确定:

 

DAC相关标准库函数:

相关标准库函数定义在  #include "stm32f4xx_dac.h"

具体函数定义实现去这个文件中查阅

DAC初始化结构体:

typedef struct
{
/*
这个字段用于配置DAC的触发源。例如,DAC的输出可以由一个定时器(TIM)或其他外部事件触发。
可能的值包括DAC_Trigger_None(无触发)、DAC_Trigger_T2_TRGO(由TIM2的触发输出触发)等。
*/
  uint32_t DAC_Trigger;                     
/*这个字段用于配置DAC是否生成噪声波或三角波。
	可能的值包括DAC_WaveGeneration_None(不生成波形)、
	DAC_WaveGeneration_Noise(生成噪声波)和DAC_WaveGeneration_Triangle(生成三角波)。*/
  uint32_t DAC_WaveGeneration;               
/*当DAC_WaveGeneration设置为DAC_WaveGeneration_Noise时,
这个字段用于配置线性反馈移位寄存器(LFSR)的未屏蔽位,它决定了噪声波的分辨率。
当DAC_WaveGeneration设置为DAC_WaveGeneration_Triangle时,这个字段用于配置三角波的幅度。*/
  uint32_t DAC_LFSRUnmask_TriangleAmplitude; 
/*
    这个字段用于配置DAC的输出缓冲。输出缓冲通常用于减少DAC输出的噪声和失真。
    可能的值包括DAC_OutputBuffer_Enable(启用输出缓冲)和DAC_OutputBuffer_Disable(禁用输出缓冲)。
*/
  uint32_t DAC_OutputBuffer;                 
}DAC_InitTypeDef;

 

其余相关函数:

void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct)

是一个用于初始化 DAC_InitTypeDef 结构体的辅助函数。该函数通常在你想要将 DAC_InitTypeDef 结构体设置为默认值时使用,而不是手动为每个字段赋值。这样做的好处是,你可以快速地将结构体重置为已知的默认状态,然后再根据需要更改某些字段的值。

要使用这个函数,可以定义一个 DAC_InitTypeDef 类型的变量,然后调用 DAC_StructInit 函数来初始化它:

DAC_InitTypeDef DAC_InitStruct;  


// 初始化DAC_InitStruct结构体为默认值  

DAC_StructInit(&DAC_InitStruct);  

void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState)

用于启用或禁用STM32微控制器上特定DAC(数字到模拟转换器)通道的函数。该函数接受两个参数:DAC_ChannelNewState

DAC_Channel 指定了要操作的DAC通道(例如,可能是通道1或通道2,取决于具体的STM32型号),

NewState 则是一个枚举值,表示是启用(ENABLE)还是禁用(DISABLE)DAC通道。

void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState)

DAC_SoftwareTriggerCmd 函数是用于通过软件触发来启动或停止DAC(数字到模拟转换器)转换的函数。这个函数通常在DAC配置为软件触发模式时使用,允许应用程序通过软件命令来启动DAC的转换过程,而不是依赖于外部硬件事件或时钟。

函数接受两个参数:

  • DAC_Channel:指定了要操作的DAC通道。这通常是一个枚举值,表示DAC的某个特定通道(例如,通道1、通道2等,具体取决于STM32的型号和配置)。
  • NewState:表示DAC软件触发功能的启用(ENABLE)或禁用(DISABLE)状态。这也是一个枚举值,通常与FunctionalState类型相关。

void DAC_DualSoftwareTriggerCmd(FunctionalState NewState)

该函数用于通过软件触发来同时启动或停止DAC(数字到模拟转换器)的两个通道(通常指的是STM32微控制器上的DAC1和DAC2)。函数接受一个FunctionalState类型的参数NewState,用于指示是否启用软件触发。

 void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)

该函数用于设置DAC(数字到模拟转换器)通道1的数据。函数接受两个参数:DAC_AlignData

  • DAC_Align:指定数据对齐方式,例如右对齐(通常是12位数据)或左对齐(可能是12位或8位数据,取决于具体的DAC配置)。
  • Data:要写入DAC通道1的数据。

void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data)

与上同,只不过是设置DAC2

void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1)

设置DAC的两个通道(通常是DAC通道1和通道2)的数据。该函数接受三个参数:数据对齐方式DAC_Align,以及两个数据值Data2Data1,分别对应DAC通道2和通道1。

 uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel)

该函数旨在读取DAC(数字到模拟转换器)特定通道的输出值。然而,需要注意的是,DAC本身并不直接提供一个“数据输出值”的寄存器来读取当前的模拟输出值,因为DAC是一个数字到模拟的转换器,其输出是模拟信号。

void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState)

是用来控制DAC(数字到模拟转换器)的DMA(直接内存访问)功能的。它接受两个参数:DAC_Channel(要控制的DAC通道)和NewState(表示DMA功能的新状态,如开启或关闭)。

void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState) 

该函数用于配置DAC(数字到模拟转换器)的中断。它接受三个参数:DAC_Channel(要配置的DAC通道)、DAC_IT(要配置的中断类型)和NewState(表示中断的新状态,如开启或关闭)。

初始化DAC:

//DAC通道1输出初始化 PA4
void Dac1_Init(void)
{  
  GPIO_InitTypeDef  GPIO_InitStructure;
  DAC_InitTypeDef DAC_InitType;
         
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);//使能DAC时钟
           
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AN;//模拟输入
  GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_DOWN;//下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
 
  DAC_InitType.DAC_Trigger=DAC_Trigger_None;                   //不使用触发功能 TEN1=0 // 触发方式,这里设置为无触发  
  DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;     // 波形生成,这里设置为不生成波形  
  DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
  DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable;       //DAC1输出缓存关闭BOFF1=1
	
  DAC_Init(DAC_Channel_1,&DAC_InitType);       //初始化DAC通道1
 
  DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC通道1
  DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式设置DAC值
}
//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(u16 vol)
{
  double temp=vol;
  temp/=1000;
  temp=temp*4096/3.3;
 DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
}

 

测试效果图:

 dac_value 设置为 3000 时的输出:

 dac_value 设置为 2000 时的输出:

 

测试工程下载:

https://download.csdn.net/download/qq_64257614/89354623

 

网上查阅资料:

STM32CUBEIDE-F407(6)-DAC输出_cubeide dac-CSDN博客

洋桃电子STM32F407单片机入门教程笔记八:DAC数模转换功能_dac setvalue-CSDN博客

【stm32f407】DAC实验_stm32f407 dac程序库函数-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/641059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决go install 网络问题

rootiZbp1hiqzlhh6w05gloffgZ:~# go install mvdan.cc/garblelatest go: mvdan.cc/garblelatest: module mvdan.cc/garble: Get "https://proxy.golang.org/mvdan.cc/garble/v/list": dial tcp 172.217.160.81:443: i/o timeout解决方法 更换阿里代理 rootiZbp1hiq…

保障餐饮场所安全:定期送检可燃气体报警器

在餐饮行业,火灾隐患一直备受关注。餐厅、茶饮店等场所常常使用燃气设备,而这些设备带来了潜在的安全隐患。 为了及时发现并预防可燃气体泄漏,可燃气体报警器的定期送检显得尤为重要。那么,为什么可燃气体报警器需要定期送检呢&a…

python中的线程并行

文章目录 1. 单线程2. 线程池ThreadPoolExecutor 1. 单线程 现在有1154张图片需要顺时针旋转后保存到本地,一般使用循环1154次处理,具体代码如下所示,img_paths中存储1154个图片路径,该代码段耗时约用97ms。 t1time.time() for …

【再探】设计模式—代理模式

代理是指授权代理人在一定范围内代表其向第三方进行处理有关事务。 1 代理模式 需求:1)将业务代码与非业务代码分离,在不改变代码结构的基础上,为其添加新的功能。2)为系统中的某些操作做同一处理,例如进…

Dilworth 定理

这是一个关于偏序集的定理,事实上它也可以扩展到图论,dp等中,是一个很有意思的东西 偏序集 偏序集是由集合 S S S以及其上的一个偏序关系 R R R定义的,记为 ( S , R ) (S,R) (S,R) 偏序关系: 对于一个二元关系 R ⊂…

Python筑基之旅-MySQL数据库(四)

目录 一、数据表操作 1、新增记录 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除记录 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 3、修改记录 3-1、用mysql-conn…

力扣HOT100 - 21. 合并两个有序链表

解题思路&#xff1a; class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dum new ListNode(0), cur dum;while (list1 ! null && list2 ! null) {if (list1.val < list2.val) {cur.next list1;list1 list1.next;} els…

力扣刷题---3146. 两个字符串的排列差

题目描述 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 。 示例 1&#xff1a; 输入&#xff1a;s “abc”, t “b…

四万字长文详解——node.js使用移动云,EOS对象存储

目录 前言 安装及安装前的操作 前置条件 如何创建认证信息 使用npm安装SDK开发包 安装开发包命令 初始化操作 存储桶 查看结果命令 查看桶列表 查看结果命令 删除桶 查看结果命令 创建桶 获取桶列表 判断桶是否存在 查询桶所属地域 查询桶的访问权限 管理桶的…

基于springboot+vue+Mysql的校园台球厅人员与设备管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【C语言】冒泡排序详解

前言 排序&#xff0c;就是将一组数据按特定的规则调换位置&#xff0c;使这组数据具有某种顺序关系&#xff0c;一般就是递增或递减。 在接触C语言不久&#xff0c;我们就会遇到其中一种有名的排序算法——“冒泡排序”&#xff0c;不知道你是否已经掌握了&#xff0c;如果还…

2024最新 Jenkins + Docker 实战教程(五)- 配置Gitee Webhooks实现自动构建部署

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

等保建设:打造MySQL数据库审计系统

1、建设目标 在等级保护三级->应用安全->安全审计中强制需要有审计平台(满足对操作系统、数据库、网络设备的审计&#xff0c;在条件不允许的情况下&#xff0c;至少要使用数据库审计) 数据库审计服务符合等级保护三级标准&#xff0c;帮助您满足合规性要求&#xff0c;…

什么是组态?什么是工业控制中的组态软件?

随着工业4.0和智能制造的发展&#xff0c;工控软件的应用越来越广泛&#xff0c;它们在提高生产效率、降低能耗和减少人力成本等方面发挥着越来越重要的作用。 什么是工控软件&#xff1f; 工控软件是指用于工业控制系统的软件&#xff0c;主要应用于各种生产过程控制、自动化…

Java中流的概念细分

按流的方向分类&#xff1a; 输入流&#xff1a;数据流向是数据源到程序&#xff08;以InputStream、Reader结尾的流&#xff09;。 输出流&#xff1a;数据流向是程序到目的地&#xff08;以OutputStream、Writer结尾的流&#xff09;。 按处理的数据单元分类&#xff1a; 字…

在winnas中使用docker desktop遇到的问题及解决方法记录

最近在尝试从群晖转向winnas&#xff0c;一些简单的服务依然计划使用docker来部署。群晖的docker简单易用且稳定&#xff0c;在win上使用docker desktop过程中遇到了不少问题&#xff0c;在此记录一下以供后来人参考。 一、安装docker desktop后启动时遇到无法启动docker引擎 …

构建数字未来:探索Web3在物联网中的新视角

引言 随着Web3时代的来临&#xff0c;物联网技术正迎来一场新的变革。在这个数字化时代&#xff0c;Web3所带来的技术创新将为物联网的发展开辟新的视角。本文将深入探讨Web3在物联网领域的应用&#xff0c;揭示其在构建数字未来中的重要性和影响。 Web3与物联网的融合 区块链…

运用HTML、CSS设计Web网页——“西式甜品网”图例及代码

目录 一、效果展示图 二、设计分析 1.整体效果分析 2.头部header模块效果分析 3.导航及banner模块效果分析 4.分类classify模块效果分析 5.产品展示show模块效果分析 6.版权banquan模块效果分析 三、HTML、CSS代码分模块展示 1. 头部header模块代码 2.导航及bann…

QQ个性网空间日志网站模板源码

QQ个性网空间日志网站模板源码自带后台登录设置&#xff0c;适用于博客、文章、资讯、其他类网站内容使用。模板自带eyoucms内核&#xff0c;原创设计、手工书写DIVCSS&#xff0c;完美兼容IE7、Firefox、Chrome、360浏览器等;主流浏览器;结构容易优化;多终端均可正常预览。由于…

保安维稳,四信以科技构筑高速公路安全智慧防线

近日&#xff0c;广东梅大高速发生严重塌方事故&#xff0c;造成了严重的人员伤亡和财产损失。这一事件在公众心中敲响了安全的警钟&#xff0c;再次引起了公众对于交通设施运营安全性的重点关注。 国务院安委会办公室和国家防灾减灾救灾委员会办公室等主管机构先后印发紧急通知…