细说MCU用DMA改变DAC输出信号频率和改善输出波形质量的方法

news2024/9/20 15:02:53

目录

一、参考硬件 

二、修改定时器参数改变输出波形频率

三、改善波形质量

四、代码修改

五、查看结果


一、参考硬件 

        本项目的软件硬件工程参考作者的其他文章:细说MCU用DMA实现DAC输出的方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/140655500icon-default.png?t=N7T8http:// https://wenchm.blog.csdn.net/article/details/140655500

二、修改定时器参数改变输出波形频率

        通过修改定时器TIM3的配置参数,可以改变输出波形的频率。

        譬如,可将定时器的预分频因子设置为0,计数器周期设置为169。此时定时器的事件更新频率将为1 MHz。如果保持数组SineWaveData中的50个数变,则此时输出的正弦波频率将为1 MHz/50=20 kHz。

        此时,再用示波器查看PA4引脚上的波形,得到的该正弦波的频率为20 kHz。

        从图中还可以看到,在波形的峰值处有饱和的现象。这是因为在引脚配置时,默认开启了DAC缓冲功能。根据前面的介绍,此时DAC实际的输出范围会在0.2 V~VREF-0.2 V之间。如果VREF为3.3 V,在开启缓冲后,虽然数据输出寄存器数据在0~4095范内变化,但DAC的真实输出会在0.2~3.1 V之间。前面例子所给的数据中,送给数据输寄存器的最大值为4090,最小值为5,所以在峰值处会有饱和现象。

三、改善波形质量

        修改MATLAB新建便编辑器文件.m的一个周期生成的点数N=200。

A=4096/2-1;	%信号幅值
N=200;		%一个周期内的数据点数
Ph=0;		%初始相位
SineData = ceil(A*sin(Ph: 2*pi/N: 2*pi*(1-1/N)+Ph)+A);
Fid = fopen('SineWaveData.txt','w');
fprintf(Fid,'%d,',SineData);
fclose(Fid);

四、代码修改

/* USER CODE BEGIN PV */
uint16_t SineWaveData[DAC_BUFFER_SIZE]={2047,2112,2176,2240,2304,2368,2431,2494,2557,2619,2680,2741,2801,2860,2919,2977,3034,3090,3144,3198,3251,3302,3352,3401,3449,3495,3540,3583,3625,3665,3704,3741,3776,3809,3841,3871,3900,3926,3951,3973,3994,4013,4030,4045,4058,4069,4078,4085,4090,4093,4094,4093,4090,4085,4078,4069,4058,4045,4030,4013,3994,3973,3951,3926,3900,3871,3841,3809,3776,3741,3704,3665,3625,3583,3540,3495,3449,3401,3352,3302,3251,3198,3144,3090,3034,2977,2919,2860,2801,2741,2680,2619,2557,2494,2431,2368,2304,2240,2176,2112,2048,1983,1919,1855,1791,1727,1664,1601,1538,1476,1415,1354,1294,1235,1176,1118,1061,1005,951,897,844,793,743,694,646,600,555,512,470,430,391,354,319,286,254,224,195,169,144,122,101,82,65,50,37,26,17,10,5,2,0,2,5,10,17,26,37,50,65,82,101,122,144,169,195,224,254,286,319,354,391,430,470,512,555,600,646,694,743,793,844,897,951,1005,1061,1118,1176,1235,1294,1354,1415,1476,1538,1601,1664,1727,1791,1855,1919,1983,
};
/* USER CODE END PV */
 /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim3);
  HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_1,(uint32_t*)SineWaveData,DAC_BUFFER_SIZE,DAC_ALIGN_12B_R);
/* USER CODE END 2 */
/* USER CODE BEGIN Private defines */
#define DAC_BUFFER_SIZE (uint16_t) 200
/* USER CODE END Private defines */

五、查看结果

        虽然定时器的更新频率保持为1 MHz,即DMA会1us传递一个数据到DAC的数据输出寄存器;但由于数据点数由50增加到200,所以传递一个完整周期的数据所需的时间,也就由原来的50us增加至200us。因此,DAC最终输出的正弦波形的频率将为5 kHz。修改代码后,编译工程并下载到硬件中,将程序运行起来。通过示波器测量DAC输出的波形:

 

 

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

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

相关文章

2024暑假友谊赛 2

Problem - 1150B - Codeforces 小C是重度强迫症晚期患者,如果某些图形无法按照他的想法排列,那么他就会迎来他的末日。某天小C来到了心心念念的女神家里(绝对不可能是女装大佬,绝对不可能),他发现地砖有两…

醒醒,别睡了...讲《数据分析pandas库》了—/—<2>

废话不多说,直接开讲! 一、 1、pandas变量类型的转换 Pandas 支持的数据类型 : 1、float:浮点型 2、int:整型 3、string:字符串类型 4、bool:布尔类型 5、datetime64[nsr]: 示精确到纳秒的日期…

跨棒距、公法线和齿厚对应关系分析

前面有一期讨论了下滚齿径向进刀量和齿厚的对应关系:《》,有小伙伴又问了,加工时是用跨棒距或者公法线去控制齿厚的,直接给齿厚是无法测量的,如果测一个值再去计算,有点麻烦,有没有他们之间的对…

【操作系统】解析线程安全中的 Synchronized 关键字

目录 synchronized一、互斥性二、可重入性三、synchronized的使用 synchronized synchronized作为确保多线程安全的重要关键字 接下来我们来学习它的特性: 互斥性可重入性 一、互斥性 synchronized会起到互斥效果,某个线程执行到某个对象的synchronized中时,其他…

【详谈】HashMAP深度剖析,全面消化吸收

【万字长文】 还没写完!!还没写完!!!还在码字中,只是先放上,防止又写着没了,自己文件没了… 最近,可以说的上自己博客停更大约有一两个月了,一直在忙于公司中的项目和业务,典型的牛马看了都流泪 今天,自己刚刚优化了一个查询耗时的BUG,在这里我就引入的hashmap作为我存储队列的…

Linux 某进程 CPU 高问题,用 Shell 脚本发现处理

发现高CPU使用率进程 首先,我们需要编写一个Shell脚本来发现系统中CPU使用率最高的进程。以下是一个简单的脚本示例: #!/bin/bash# 设置 CPU 使用率的阈值,一般设置90;这里是demo,所以用30 CPU_THRESHOLD30# 获取占用 CPU 最高的…

学习笔记 韩顺平 零基础30天学会Java(2024.7.24)

P416 匿名内部类本质 IA tiger new IA(){//IA是一个接口 //重写 System.out.println(“老虎叫唤。。。”); } P417 匿名内部类使用 基于类的匿名内部类 Father father new father(“jack”){};//不带大括号运行类型是Father,带大括号就是匿名内部类,相当于是匿名…

【深度学习入门】安装conda/miniconda、所需包类、CUDA与conda/Miniconda间的关系

深度学习入门 须知 本教程跟随李沐老师课程随笔,课程链接点击此处。 CUDA和Anaconda的关系 CUDA Toolkit是由Nvidia官方提供的完整工具包,其中提供了Nvidia驱动程序、开发CUDA程序相关的开发工具包等。 Anaconda在安装Pytorch等会用到的CUDA的框架时…

操作系统(三)中断----软中断

软中断与硬中断很像 软中断是纯软件实现的,宏观效果看上去和中断差不多的一种方式。 什么叫宏观效果呢?意思就是说,中断在宏观层面看来,就是打断当前正在运行的程序,转而去执行中断处理程序,执行完之后再返…

【Python机器学习】使用Matplotlib注解绘制树形图

通过数据集可以创建树,但是字典的表示形式非常不易于理解,而且直接绘制图形也比较困难。但是通过Matplotlib库可以绘制树形图。 决策树的主要优点就是直观、易于理解,如果不能将其直观的显示出来,就无法发挥其优势。 Matplotlib…

y=λsin(πx)分岔的研究

使用如下的迭代格式,λ为可变的参数 用如下代码对收敛的λ的值进行探究,这里的r代表λ %通过观察是否凝聚在同一个点来判断是否收敛 clear;clf; axis([0,4,0,4]); grid; hold on for r0:0.3:3.9x[0.1];for i2:150x(i)r*sin(pi*x(i-1));endpause(0.5);fo…

心动小站Ⅶ--人工智能的虚假承诺

前言 1770 年,匈牙利作家兼发明家 Wolfgang von Kempelen 推出了一款名为“土耳其机器人”的自动国际象棋机器。该机器在欧洲各地展示了其自动化国际象棋大师技能,在与人类对手的比赛中频频获胜。据说它甚至击败了拿破仑和本杰明富兰克林等著名人物。土…

Prometheus之数据类型和函数

前言: 在了解Prometheus数据类型前,我们先了解下面几个统计学名词概念: 平均数(Mean): 平均数是所有数据加起来除以数据个数得到的结果。它表示数据的中心趋势。 最大值(Maximum&#xff09…

Hadoop集群安装配置

文章目录 Hadoop部署配置集群配置历史服务器配置日志的聚集分发Hadoop群起集群Hadoop群起脚本 准备工作:需要3台虚拟机,每台虚拟机搭建好JDK并配置环境变量 Hadoop部署 1)集群部署规划 注意:NameNode和SecondaryNameNode不要安…

Vue中el的两种写法

大家好我是前端寄术区博主PleaSure乐事。今天了解到了Vue当中有关el的两种写法,记录下来与大家分享,希望对大家有所帮助。 方法一 解释 第一种方法我们直接用new创建并初始化一个新的 Vue 实例,并定义了 Vue 实例的数据对象,在给…

数组算法--二分查找

目录 一.前言 二.算法的核心思路 三.算法的核心代码以注释详解 一.前言 二分查找也叫折中查找,为什么会这样叫呢?就是因为我们二分查找的核心逻辑就是每查找完一次,都能将查找的范围给缩小一半,也就是折中。但使用二分查找又有个…

宏VB的1004问题,方法作用于对象错误,如何解决?

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

RV1126 Linux 系统,接外设,时好时坏(二)排查问题的常用命令

在 RV1126 Linux 系统中,排查外设连接问题时,可以使用多种命令来诊断和调试。以下是一些常用的命令和工具: 1. 查看系统日志 dmesg: 显示内核环形缓冲区的消息,通常包含设备初始化、驱动加载和错误等信息。 dmesg | grep <设备名或相关关键字>journalctl: 查看系统…

windows 下删除一个文件夹及其子文件夹下相同后缀名的文件

问题 我有一个工作目录&#xff0c;沉积了四五年的工作 文件。其中有一个相同格式的中间过程文件暂用很大体积&#xff0c;也不需要保留&#xff0c;并且可以通过其他文件生成。因此想一次删除这个工作目录下的所有相同后缀的文件。 解决方法 在工作目录的地址栏输入“cmd”…

leaflet【九】使用天地图改变地图底色

本文将详细探讨如何在Leaflet地图框架中集成天地图&#xff0c;并介绍如何通过调整背景色和滤镜来改变地图的显示效果。首先&#xff0c;我们将解释如何在Leaflet中配置天地图作为底图&#xff0c;包括API密钥的获取与使用。接下来&#xff0c;文章将展示如何通过CSS和JavaScri…