细说MCU用单路DAC模块设计和输出锯齿波的实现方法

目录

一、STM32G474RE的DAC模块 

二、配置

1.配置DAC

2.选择时钟源和Debug

3.配置系统时钟

三、代码修改

1.启动DAC

2.给DAC的数据输出寄存器赋值

3.运行并观察输出


一、STM32G474RE的DAC模块 

        有些MCU本身就带有数/模转换器(Digital to Analog Converter,DAC)模块,使DAC模块就可以产生模拟信号。STM32G474RE就有两个可以引出到外部的12位DAC:DAC1和DAC2(STM32G474RE的另外两个DAC模块DAC3、DAC4无法直接从GPIO输|):其中,DAC1有两个输出通道,DAC2有一个。所以,在STM32G474RE的DAC中,总共三路模拟信号可以直接从GPIO引出。STM32G474RE上的三路DAC对应的引脚如下:

DAC1_OUT1——PA4
DAC1_OUT2——PA5
DAC2_OUT1——PA6

        另外,这三路DAC均有输出缓冲。所谓缓冲,是指信号经过运算放大器(运放)电路送。在STM32G474RE中,该运放集成在MCU内部。在进行参数配置时,可以选择是否使该缓冲电路。        

        DAC模块从MCU引脚上最终输出的电压(VDAC),与输入到它的数据输出寄存器中的数值有关。由于STM32G474RE中的DAC为12位,也就是说,当数据寄存器中的值为4095时,DAC会输出最大电压值,但这个最大值具体是几伏,还与MCU的参考电压(VREF)有关。具体公式如下:

 

        式中,DOR是DAC数据输出寄存器(data output register)中的数值。理想情况下,DAC的输出电压在0~VRF之间。不过,如果开启了DAC的缓冲(Buffer),输出的电压最小值不会为0,最大值也不会是VREF,而是会在0.2 V~VREF-0.2 V之间。VREF是参考电压,它在MCU上专门有一个外部引脚;在NUCLEO-G474RE板上,该引脚连到了电源电压上,理论值是3.3 V。所以,当给DAC的数据寄存器写入4095时,DAC的输出电压会接近3.3 V。

二、配置

1.配置DAC

        选择DAC1,OUT1模式(OUT1 mode)选择Connected to external pin only,也就是DAC1的输出通道1连接到外部引脚,该引脚为PA4;其他参数,均可暂时持默认值。

2.选择时钟源和Debug

        将高速时钟(HSE)设置为Crystal/eramic Resonator,使用片外时钟晶体作为HSE的时钟源。最后,在SYS中将Debug设置Serial Wire。

        NVIC中把tick timer的抢占式优先级设为0。

3.配置系统时钟

        系统时钟(SYSCLK)频率配置为170 MHz。

三、代码修改

        在main函数的初始化阶段,除了使用代码自动生成的函数MX_DAC1_Init()对DAC模块的基本参数进行初始化之外,还需要添加启动DAC的语句

1.启动DAC

        专门有一个库函数HAL_DAC_Start()实现启动DAC模块的功能,可将它放到main函数中的while(1)之前、MX_DAC1_Init()函数之后的注释对中:

  /* USER CODE BEGIN 2 */HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);/* USER CODE END 2 */

2.给DAC的数据输出寄存器赋值

        DAC启动之后,可以在while(1)中给其数据寄存器赋值,这样就可以通过它输出所需要的模拟电压信号。

        给DAC的数据寄存器赋值,可以使用库函数HAL_DAC_SetValue()。在while(1)中添加如下代码:

  /* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */DACIndex++;if(DACIndex  == 4096)DACIndex =0;HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,DACIndex);HAL_Delay(10);}/* USER CODE END 3 */

        HAL_DAC_SetValue()函数有4个参数:第一个是DAC句柄;第二个是DAC的通道;第三个是数据对齐方式(选用12位右对齐);第四个参数是具体赋给数据寄存器的数值这里用了一个变量DACIndex,该变量逐步增加到4096后,再从0开始。当然,需要在main函数中声明该变量。将其声明为全局变量,放到main函数前面的注释对中:

/* USER CODE BEGIN PV */
uint16_t DACIndex = 0;
/* USER CODE END PV */

3.运行并观察输出

        运行、下载。通过示波器观察PA4管脚的输出。对应开发板CN7的32引脚或CN8的第3引脚。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第20天|Diffusion扩散模型

Mindspore框架利用扩散模型DDPM生成高分辨率图像(生成高保真图像项目实践) Mindspore框架利用扩散模型DDPM生成高分辨率图像|(一)关于denoising diffusion probabilistic model (DDPM)模型Mindspore框架利…

差分进化算法原理及其MATLAB/Python代码

1.算法简介 引用自:Storn R, Price K. Differential evolution–a simple and efficient heuristic for global optimization over continuous spaces[J]. Journal of global optimization, 1997, 11: 341-359. 今天给大家带来的是一个非常经典的智能优化算法–差分…

【多模态】42、LLaVA-UHD | 支持任意纵横比和大分辨率图像输入的 LLaVA

论文:LLaVA-UHD: an LMM Perceiving Any Aspect Ratio and High-Resolution Images 代码:https://github.com/thunlp/LLaVA-UHD 出处:清华 | 新加坡国立大学 | 中国科学院大学 一、背景 现有的很多 LMM 都是将图像处理成固定的纵横比&…

Ubuntu编译ffmpeg并添加cmake工程

文章目录 前言前提须知为什么要自己编译 FFmpeg前提软件包与工具的安装编译ffmpeg写CMakeList.txt包含ffmpeg到我们项目中 总结 前言 FFmpeg 是一个领先的多媒体框架,能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有人类和机器创造的内容。FFmpeg 包…

设计模式11-原型模式

设计模式11-原型模式 写在前面对象创建模式典型模式原型模式动机结构代码推导应用特点要点总结 原型模式与工厂方法模式对比工厂方法模式原型模式什么时候用什么模式 写在前面 对象创建模式 通过对象创建模式绕开动态内存分配来避免创建过程中所导致的耦合过紧的问题。从而支…

数学建模--国赛备赛---TOPSIS算法

目录 1.准备部分 1.1提交材料 1.2MD5码相关要求 2.TOPSIS算法 2.1算法概述 2.2基本概念 2.3算法核心思想 2.4拓展思考 3.适用赛题 3.1适用赛题说明 3.2适用赛题举例 4.赛题分析 4.1指标的分类 4.2数据预处理 4.2.1区间型属性的变换 4.2.2向量规范化 4.3数据加…

基于 Three.js 的 3D 模型加载优化

作者:来自 vivo 互联网前端团队- Su Ning 作为一个3D的项目,从用户打开页面到最终模型的渲染需要经过多个流程,加载的时间也会比普通的H5项目要更长一些,从而造成大量的用户流失。为了提升首屏加载的转化率,需要尽可能…

IDEA的断点调试(Debug)

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …

【内网安全】横向移动-Kerberos-SPN-WinRM-RDP

目录 环境介绍与横向移动前置域横向移动-WinRM-WinRS移动条件: 步骤0、攻击机开启winrm服务:1.CS探针5985端口:2.连接目标主机并执行命令:3.上线CS&MSF:4.CS内置横向移动-winrm 域横向移动-RDP简介与条件RDP横向移动连接的三种…

TCP状态转换详解

1.什么是TCP的状态转换 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中,连接的状态会随着不同阶段的通信而发生变化,这些变化被称为状…

嵌入式Linux入门知识点汇总-启动过程、设备树、设备框架、锁

目录 1.BootLoader启动过程? 引导加载程序(Bootloader) 补充u-boot的理解 通用的bootloader 2.系统调用过程? 3.设备驱动模型的三个重要成员? 4.驱动和设备注册是否存在先后顺序? 5.framebuffer机制? 6.字符设备和块设备的区别并分别举例? 1.字符设备 2.块设备…

SVN 服务 安装部署 Docker(compose) 方式

通过 dockerhub 或者 命令行运行 : docker search svn 查看 svn 的镜像 如命令行: [rootSGP ~]# docker search svn NAME DESCRIPTION STARS OFFICIAL AUTOMATED garethflower…

景联文科技构建高质量心理学系知识图谱,助力大模型成为心理学科专家

心理大模型正处于快速发展阶段,在临床应用、教育、研究等多个领域展现出巨大潜力。 心理学系知识图谱能够丰富心理大模型的认知能力,使其在处理心理学相关问题时更加精确、可靠和有洞察力。这对于提高心理健康服务的质量和效率、促进科学研究以及优化教育…

【Django】网上蛋糕商城后台-订单管理

概念 前面通过多篇文章以完全实现了用户在网上蛋糕商城平台上的所有功能和操作,从本文开始,实现网站的后台管理功能的介绍和操作。 导入静态资源 在static文件夹下,创建admin文件夹,在该文件夹下导入静态资源 在templates文件夹…

cs224w笔记(p5)

链接预测任务的两种类型:随机缺失边;随时间演化边。 第一种假设可以以蛋白质之间的交互作用举例,缺失的是研究者还没有发现的交互作用。 第二种假设可以以社交网络举例,随着时间流转,人们认识更多朋友。 基于相似性进…

zookeeper+kafka消息队列集群部署

一.消息队列 1、什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(MessageQueue)是一种在软件系统中用…

1、springboot3 vue3开发平台-后端-项目构建

文章目录 1. 创建项目1.1 前置环境条件1.2 项目创建 2. 模块配置2.1 父工程配置概述2.2 配置启动模块2.3 父工程相关依赖管理 1. 创建项目 1.1 前置环境条件 idea2023, jdk17 1.2 项目创建 创建父工程并删除不需要的文件目录: 右键父工程依次创建其他模块 最…

Windows 、Linux、MacOS 进程管理机制

本心、输入输出、结果 文章目录 Windows 、Linux、MacOS 进程管理机制前言Windows 进程管理机制Linux 进程管理macOS 进程管理内存不够了,几个操作系统如何处理Windows 、Linux、MacOS 进程管理机制 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 …

【Qt】窗口

文章目录 QMainWindow菜单栏工具栏状态栏浮动窗口对话框自定义对话框Qt内置对话框QMessageBox QMainWindow Qt中的主窗口以QMainWindow表示,其总体结构如下: 菜单栏 菜单栏MenuBar,可包含多个菜单Menu,每个菜单也可以包含多个菜…

03 Git的基本使用

第3章:Git的基本使用 一、创建版本仓库 一)TortoiseGit ​ 选择项目地址,右键,创建版本库 ​ 初始化git init版本库 ​ 查看是否生成.git文件(隐藏文件) 二)Git ​ 选择项目地址&#xff0c…