细说MCU的DAC1实现两个通道同时输出的方法

news2024/9/9 1:39:31

目录

一、参考硬件

二、 建立新工程

1.配置DAC

2.配置DMA

3.配置定时器

4.配置时钟和Debug

三、修改代码

1.初始化定时器和DAC

2.定义波形数据

3.波形数据的产生方法

四、查看结果


一、参考硬件

        本项目依赖的软件和硬件工程参考本文作者写的文章: 细说MCU用自带的波形发生器实现DAC输出的方法-CSDN博客  https://blog.csdn.net/wenchm/article/details/140710913icon-default.png?t=N7T8https://blog.csdn.net/wenchm/article/details/140710913

        因为STM32G474RE可以通过GPIO输出三路模拟信号,DAC1有两个输出通道,DAC2 有一个;所以要输出两路信号,可以使用DAC1的一个通道和DAC2,也可以仅使用DAC1,用它的两个通道。

        本文介绍使用DAC1的两个通道产生两路相位不同的正弦信号。

二、 建立新工程

1.配置DAC

        在DAC1的模式(Mode)区,将两个通 道的模式(OUT1 mode和OUT2 mode)均选择为连接到外部引脚(Connected to external pin only)。

        在DAC1通道的设置区,先将它们的输出缓冲(Output Buffer)禁止 (也可以保持使能),随后分别将它们的Trigger参数选择为Timer3 Trigger Out event。

2.配置DMA

        增加一个DAC1_CH 请求(也可以是CH2)。

        DMA请求模式选择Circular,让它循环工作;将外设 (Peripheral)和存储器(Memory)的数据宽度均选择为按字(Word)的方式。其余参数保持默认值。

3.配置定时器

        选择TIM3,时钟源(Clock Source)选择为内部时钟(Internal Clock)。将预分频因子设置为0,计数器周期设为169,并将触发事件(Trigger Event Selection TRGO)选择为Update Event,其余参数保持默认值。

4.配置时钟和Debug

        将高速时钟(HSE)设置为 Crystal/Ceramic Resonator,使用片外时钟晶体作为HSE的时钟源。最后,在SYS中将 Debug设置为Serial Wire。由于没有使用中断,所以不用配置NVIC。

三、修改代码

1.初始化定时器和DAC

        由于使用了DAC的DMA功能,并且用TIM3来触发DAC,所以在初始化代码中要加入启动DAC和TIM3的语句。启动TIM3的函数通过调用库函数HAL_TIM_Base_Start()来实现。本例中还采用带DMA功能的DAC,但这次用的是DAC1的两个通道,所以要用专门的库函数来启动该功能,此函数为HAL_DACEx_Dual- Start_DMA()。将这两个函数的调用放到main函数中while(1)前的注释对中:

 /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim3);
  HAL_DACEx_DualStart_DMA(&hdac1,DAC_CHANNEL_1,DualSineWaveData, DAC_BUFFER_SIZE,DAC_ALIGN_12B_R);
/* USER CODE END 2 */

        在HAL_DACEx_DualStart_DMA()函数中,第二个参数用的是DAC_CHANNEL_1,是DAC1的通道1,这是因为前面配置DAC1的DMA参数时配置的是DAC1_CH1,如果配置的DAC1_CH2,则此处应使用DAC_CHANNEL_2;第三个参数用的是一个数组,用来存储波形数据,数据的长度为DAC_BUFFER_SIZE,该变量可以定义到main.h中: 

/* USER CODE BEGIN Private defines */
#define DAC_BUFFER_SIZE (uint16_t) 50
/* USER CODE END Private defines */

2.定义波形数据

        存储波形数据的数组DualSineWaveData在这里这个数组要定义成32位的,每个数据点包含两个16位的数,分别传递给DAC1的CH1和CH2。本例给出一个示例波形数据是两个正弦波,其中一个的幅值是另一个的一半。

/* USER CODE BEGIN PV */
uint32_t DualSineWaveData[DAC_BUFFER_SIZE] = {134155263,150998007,167578591,183569335,
198839168,213060412,226036458,237570700,247466532,255592883,261753148,265947327,268044352,
268044223,265946944,261752515,255592012,247465435,237569395,226034965,213058755,198837375,
183567432,167576608,150995976,134218752,117376008,100795424,84804680,69534847,55313603,
42337557,30803315,20907483,12781132,6620867,2426688,329663,329792,2427071,6621500,12782003,
20908580,30804620,42339050,55315260,69536640,84806583,100797407,117378039};
/* USER CODE END PV */

        将上述数组DualSineWaveData定义为全局变量,放到主函数的注释对中。 

3.波形数据的产生方法

         使用MATLAB软件,在新编辑器窗口,编辑并生成波形数据:

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

四、查看结果

        根据TIM3参数的设置,生成的正弦波形频率应该为20 kHz。

        DAC1_OUT1对应PA4,DAC1_OUT2对应PA5。PA5通过NUCLEO- G474RE板上CN10的第11引脚或CN5的第6引脚引出(该引脚就是控制板上发光二极管 LD2的引脚)。通过示波器测量PA4、PA5引脚上的电压,将会得到两个正弦波,频率均为 20 kHz。

 

        由示波器波形图可以看到,两路信号的幅值不同,相位也不同,这是由于在32位数组中组组合了两个波形数据。

        SineData是两路数据(SineDataPh0和SineDataPh90)合成的结果。SineDataPh90的初始相位为90°(即pi/2),所以在sin()函数的参数里,是从pi/2开始的。在SineData中,低16位对应的是初始相位为90°的数据,并且幅值为A/2。在DMA传递数据时,低 16位会传递给DAC1的通道1。

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

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

相关文章

手写RPC框架,与Spring整合,基于Netty作为网络框架,protobuf作为序列化协议。可以和实际项目相结合完美运行

注:由于RPC框架过于庞大所以本篇文章只是作为阅读RPC源码的一个指导,设计精巧之处还需要各位读者结合源码进行实践 RPC源码地址:https://github.com/xhpcd/rpc git clone: https://github.com/xhpcd/rpc.git 如果觉得有收获麻烦留下一颗st…

使用 Easysearch 打造企业内部知识问答系统

大家可能都有这样的经历,刚入职一家企业时,同事往往会给你分享一些文档资料,有可能是产品信息、规章制度等等。这些文档有的过于冗长,很难第一时间找到想要的内容。有的已经有了新版本,但员工使用的还是老版本。 基于…

centos7-8/redhat7-8一键安装配置vsftp服务

1.脚本介绍 1.1.介绍: linux下一键安装及配置vsftpd服务 ,通过执行install.sh脚本,脚本会根据参数区域的值执行安装和配置vsftp服务,安装后会创建一个默认ftp用户wangxf密码wangxf2023 1、支持自定义安装(更改脚本内参数值) 2、…

javaweb_01:http

一、什么是http HTTP 是一个简单的请求-响应协议,它通常运行在TCP之上,它指定了客户端可能发送给服务器什么样的消息,以及得到什么样的响应。请求和响应都是以ASCll码的形式给出;而消息内容则具有一个类似MIME的格式。这个简单模…

面试Redis篇

本篇主要总结一下面试官可能会在Redis上询问的主要问题。 Redis的使用场景 问:你的项目中哪些场景中用到了Redis? 答:根据你的项目回答,一般会在一下几个部分缓存、分布式锁...... 缓存 缓存穿透 查询一个不存在的数据&#xff…

黑马点评--给店铺类型查询添加缓存

controller/ShopTypeController.java /*** 店铺分类查询,用于展示首页头部店铺分类* return*/GetMapping("list")public Result queryTypeList() {return typeService.queryList();} service/IShopTypeService.java Result queryList(); service/impl/S…

4234324

作者主页: 作者主页 本篇博客专栏:C 创作时间 :2024年6月20日 最后: 十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我: 1.一个冷知识: …

alg-in-go-1:动态连通性问题

前言: 有本算法书叫:Algorithms 4th Edition.pdf,它是用java实现的,但是算法的内核是一样,不在乎于语言,考虑到java当今的…, 咱们尝试用golang学习算法. 问题: 思考🤔&#xff…

弹幕背后:B站UP主创作服务解析

引言 在B站,每一条飘过的弹幕都是一个故事的碎片,它们汇聚成一幅幅生动的社交画卷。这里,不仅仅是一个视频分享平台,弹幕背后更是一个充满活力的创作者生态系统。B站以其独特的弹幕文化,为创作者和观众之间搭建起了一座…

【电控笔记-xuan】各种估测器扰动估计性能比较

各种扰动观测器观测结果 蓝色: 扰动值 隆博戈估测器扰动补偿 论文53disturb扰动补偿 2order eso 观测

《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-01-层次式体系结构概述

文章目录 1. 常用层次是架构2. 层次式架构设计的注意点2.1 污水池反模式2.2 应用变得庞大 本章教材又赘述了一遍架构的定义和层次架构风格的概述,我之前的笔记都写了 架构的定义回看《第7章-系统架构设计基础知识-01-软件架构(Software Architecture&…

AD的问题

连续放置同规则元件:先选择再按Tab编辑放置; 拖动元件:(shift 空格 :旋转元件;原理图中按x水平,按y垂直翻转)按ctrl键可以丝滑流畅放置 测试距离:RM 距离单位转…

初学Mybatis之动态 SQL

动态 SQL 是指根据不同的条件生成不同的 SQL 语句 动态 SQL 详情请看链接 搭建环境: mysql 建立博客表 CREATE TABLE blog(id VARCHAR(50) NOT NULL COMMENT 博客id,title VARCHAR(100) NOT NULL COMMENT 博客标题,author VARCHAR(30) NOT NULL COMMENT 博客作者…

华为od机试真题:悄悄话(Python)

2024华为OD机试(C卷D卷)最新题库【超值优惠】Java/Python/C合集 题目描述 给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一个悄悄话想要传…

windows家庭版安装Hyper-V

uniapp开发鸿蒙需要开启Hyper-V,但家庭版默认没有,去网上搜索整理了一下。 1.检查是否安装过Hyper-V 直接搜索 Hyper-V,如果出现就代表有,如果没出现,就搜索 启用或关闭windows功能 。 如果有Hyper-V这一项&…

eclipse手动安装Ivy插件

1、下载四个文件 (1)从这个网址选择一个自己需要的版本的“ivy-”开头的文件夹进去(是“ivy”开头,不是“ivyde”) https://archive.apache.org/dist/ant/ivyde/updatesite/ 我这里选的是“ivy-2.5.0.final_201910201…

TortoiseSVN迁移到本地git

TortoiseSVN迁移到本地git 文章目录 TortoiseSVN迁移到本地git0 背景1 环境准备2 SVN库迁移到VisualSVN2.1 导出dump2.2 将dump文件灌入VisualSVN2.3 获取SVN仓最新URL 3 迁移到Git库中4 迁移分支到Git库 0 背景 之前在前东家工作都是采用git进行项目管理,高效便捷…

大模型应用中常听说的投毒实验是什么?

大模型应用中常听说的投毒实验是什么? 大模型投毒实验是指在训练或使用大规模人工智能模型(如GPT-4等)时,通过有意加入恶意数据或修改训练过程,使模型产生不正确或有害输出的行为。随着人工智能技术的快速发展&#x…

【深度学习】声码器(Vocoder),Vocos 论文

Vocos: Closing the gap between time-domain and Fourier-based neural vocoders for high-quality audio synthesis https://arxiv.org/abs/2306.00814 https://github.com/gemelo-ai/vocos?tabreadme-ov-file 文章目录 Vocos:弥合时域和基于傅里叶的神经声码器…

必看!50个ChatGPT顶尖学术论文指令,助你高效学术研究

随着人工智能技术的进步,AI已成为学术创作的重要工具。本文将为您展示如何利用AI来润色您的论文。我们精心整理了50个顶级ChatGPT学术论文指令,强烈建议您加以利用! 这些指令不仅实用,还能大幅提升您的写作效率。无论是翻译难懂的…