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

news2024/11/15 11:16:39

目录

一、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(1);    //这个数值选大了,在示波器上不容易调整出来效果,越小越容易显示效果
  }
  /* 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引脚。

吧HAL_Delay(1)设置为1ms时的显示效果。亲测的结论是该值越小越容易在示波器上调整出来效果,越大越难甚至不可能。

 

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

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

相关文章

netty入门-3 EventLoop和EventLoopGroup,简单的服务器实现

文章目录 EventLoop和EventLoopGroup服务器与客户端基本使用增加非NIO工人NioEventLoop 处理普通任务与定时任务 结语 EventLoop和EventLoopGroup 二者大概是什么这里不再赘述,前一篇已简述过。 不理解也没关系。 下面会简单使用,看了就能明白是什么 这…

加速决策过程:企业级爬虫平台的实时数据分析

摘要 在当今数据驱动的商业环境中,企业如何才能在海量信息中迅速做出精准决策?本文将探讨企业级爬虫平台如何通过实时数据分析加速决策过程,实现数据到决策的无缝衔接。我们聚焦于技术如何赋能企业,提升数据处理效率,…

深入分析 Android ContentProvider (三)

文章目录 深入分析 Android ContentProvider (三)ContentProvider 的高级使用和性能优化1. 高级使用场景1.1. 数据分页加载示例:分页加载 1.2. 使用 Loader 实现异步加载示例:使用 CursorLoader 加载数据 1.3. ContentProvider 与权限管理示例&#xff1…

On the Dimensionality of Word Embedding论文解读

基本信息 作者Zi Yindoi10.3115/v1/D14-1162发表时间2018期刊NIPS网址https://arxiv.org/abs/1812.04224 研究背景 1. What’s known 既往研究已证实 词嵌入的一元不变性。 多数的词嵌入算法本质上都是矩阵分解。 2. What’s new 创新点 提出了 Pairwise Inner Product&…

Prometheus配置alertmanager告警

1、拉取镜像并运行 1、配置docker镜像源 [rootlocalhost ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://dfaad.mirror.aliyuncs.com"] } [rootlocalhost ~]# systemctl daemon-reload [rootlocalhost ~]# systemctl restart docker2、…

单片机主控的基本电路

论文 1.复位电路 2.启动模式设置接口 3.VBAT供电接口 4.MCU 基本电路 5.参考电压选择端口 6.SDRAM电路 7.LCD模块电路 8.USB电路 9.按键电路 10.LED电路 11.SD卡电路 12.电量检测电路 13.蓝牙接口通信电路 14.SPI FLASH 电路

Spark实时(四):Strctured Streaming简单应用

文章目录 Strctured Streaming简单应用 一、Output Modes输出模式 二、Streaming Table API 三、​​​​​​​​​​​​​​Triggers 1、​​​​​​​unspecified(默认模式) 2、​​​​​​​​​​​​​​Fixed interval micro-batches&am…

总结20个Python接单赚钱的平台,兼职月入6000+_让你早日实现财富自由

今天就给大家盘点几个基本入门接私活的资源,让你轻松学python,实现经济独立。 一、Python兼职种类: 接私活刚学会python那会,就有认识的朋友介绍做一个网站的私活,当时接单赚了4K,后又自己接过开发网站后…

vue3+element-plus 实现动态菜单和动态路由的渲染

在 Vue.js 中,使用 Vue Router 管理路由数据,并将其用于渲染 el-menu(Element UI 的菜单组件)通常涉及以下几个步骤: 定义路由元数据: 在你的路由配置中,为每个路由项添加 meta 字段&#xff0c…

SQL labs-SQL注入(五,使用sqlmap进行cookie注入)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言: Cookie 是一些数据, 存储于你电脑上的文本文件中。当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息。Cookie…

新形势下职业教育大数据人才培养策略

一、引言 随着信息技术的飞速发展,大数据已成为驱动经济社会变革的关键力量。在新形势下,职业教育作为技术技能人才培养的重要阵地,面临着如何适应大数据时代要求、提升人才培养质量的紧迫任务。当前,职业教育在大数据人才培养方…

【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !

目录 C语言中指针的大小1. 指针大小的基本概念1.1 32位系统1.2 64位系统 2. 指针大小示例2.1 32位系统输出2.2 64位系统输出 3. 指针大小与数据类型无关示例输出示例 4. 跨平台的指针大小示例输出示例 5. 关键点总结5.1 指针大小与平台关系5.2 跨平台编程注意事项 6. 指针大小示…

PySide(PyQt)的小部件通过伪状态以及自定义特性改变外观

1、通过伪状态来改变外观 伪状态是一种特殊的状态,通常用于描述控件在特定条件下的外观变化。这些状态不是控件的实际属性,而是用于在样式表中应用不同样式的标记。 以QPushButton为例。在 PySide6 中,QPushButton 具有多种伪状态&#xff0c…

卷积神经网络(二)-AlexNet

前言: AlexNet是2012年ImageNet竞赛冠军(以领先第二名10%的准确率夺得冠军)获得者Hinton和他的学生Alex Krizhevsky设计的,在ILSVRC-2010测试集上取得了top-1错误率37.5%,top-5错误率17.0%(优于第二名的16.4%),明显优…

科技快讯丨智驱未来,校企共融:浪潮海岳携手山东大学软件学院开展低代码开发实训活动

近日,山东大学软件学院暑期实训活动圆满落幕。作为领先的企业数字化转型优秀服务商,浪潮海岳主导的低代码开发课题吸引了众多师生参训,取得了良好成效。 当前,低代码开发已成为软件行业降本增效、提升用户体验的必然选择&#xff…

labview实现两台电脑共享变量传输及同步

因为工作需要,需要实现多台主机间进行数据传输, 有两个备选方案, 1:建立tcp,然后自己解包 2:就是通过共享变量传输 虽然共享变量也是建立在TCP/IP上面的,但是不用自己解包呀 关于共享变量网络上…

vivo手机恢复出厂设置在哪里?清除数据后如何找回?2个技巧

随着使用时间的增长,手机可能会因为累积的缓存文件、不必要的数据或软件问题而出现性能下降或系统运行缓慢。为了解决这些问题,执行恢复出厂设置成为了一种流行的解决方案。那么,vivo手机恢复出厂设置在哪里?数据清除后该如何找回…

CCRC-DSO数据安全官:打造数据“冷链”,做强做大数据产业

在7月22日国新办举办的“推动高质量发展”系列新闻发布会上,国家数据局局长刘烈宏宣布,为响应党的二十届三中全会的决策,将加速推进数字经济发展机制的构建和完善数据要素市场制度。 他强调了对地方试点探索的支持,目标是建立强大…

基础复习(数组)

数组 一维数组 1.静态初始化 数据类型[] 数组名 new 数据类型[]{元素1,元素2,元素3,...}; 数据类型[] 数组名 {元素1,元素2,元素3...}; 2.动态初始化 数组存储的元素的数据类型[] 数组名字 new 数组存储的元素的数据类型[长度]; 3.执行原理 变量存储的是数组的地址值。…

Pyqt5新手教程

PyQt界面开发的两种方式:可视化UI 编程式UI (1)可视化UI:基于Qt Designer可视化编辑工具进行组件拖放、属性设置、布局管理等操作创建界面。 一是将其保存为.ui文件,然后在PyQt应用程序中加载和使用.ui文件。 二是使用…