初学stm32 --- DAC输出三角波和正弦波
输出三角波实验简要:
1,功能描述
通过DAC1通道1(PA4)输出三角波,然后通过DS100示波器查看波形
2,关闭通道1触发(即自动)
TEN1位置0
3,关闭输出缓冲
BOFF1位置1
4,使用12位右对齐模式
将数字量写入DAC_DHR12R1寄存器
输出三角波函数

/*** @brief 设置DAC_OUT1输出三角波* @note 输出频率 ≈ 1000 / (dt * samples) Khz, 不过在dt较小的时候,比如小于5us时, 由于delay_us* 本身就不准了(调用函数,计算等都需要时间,延时很小的时候,这些时间会影响到延时), 频率会偏小.* * @param maxval : 最大值(0 < maxval < 4096), (maxval + 1)必须大于等于samples/2* @param dt : 每个采样点的延时时间(单位: us)* @param samples: 采样点的个数, samples必须小于等于(maxval + 1) * 2 , 且maxval不能等于0* @param n : 输出波形个数,0~65535** @retval 无*/
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n)
{uint16_t i, j;float incval; /* 递增量 */float Curval; /* 当前值 */if(samples > ((maxval + 1) * 2))return ; /* 数据不合法 */incval = (maxval + 1) / (samples / 2); /* 计算递增量 */for(j = 0; j < n; j++){ Curval = 0;HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval); /* 先输出0 */for(i = 0; i < (samples / 2); i++) /* 输出上升沿 */{Curval += incval; /* 新的输出值 */HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);delay_us(dt);}for(i = 0; i < (samples / 2); i++) /* 输出下降沿 */{Curval -= incval; /* 新的输出值 */HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);delay_us(dt);}}
}
输出正弦波函数实验简要:
1,功能描述
通过DAC1通道1(PA4)输出正弦波,然后通过DS100示波器查看波形
2,使用定时器7 TRGO事件触发转换
TEN1位置1、TSEL1[2:0]=010
3,关闭输出缓冲
BOFF1位置1
4,使用DMA模式
DMAEN1位置1
5,使用12位右对齐模式
将数字量写入DAC_DHR12R1寄存器
DAC输出正弦波实验配置步骤
1,初始化DMA
HAL_DMA_Init()
2,将DMA和ADC句柄联系起来
__HAL_LINKDMA()
3,初始化DAC
HAL_DAC_Init()
4,DAC MSP初始化
HAL_DAC_MspInit() 配置NVIC、CLOCK、GPIO等
5,配置DAC相应通道相关参数
HAL_DAC_ConfigChannel()
6,启动DAM传输
HAL_DMA_Start()
7,配置定时器溢出频率并启动
HAL_TIM_Base_Init()、 HAL_TIM_Base_Start()
8,配置定时器触发DAC转换
HAL_TIMEx_MasterConfigSynchronization()
9,停止/启动DAC转换、DMA传输
HAL_DAC_Stop_DMA()、 HAL_DAC_Start_DMA()
输出正弦波函数

uint16_t g_dac_sin_buf[4096]; /* 发送数据缓冲区 *//*** @brief 产生正弦波序列函数* @note 需保证: maxval > samples/2* @param maxval : 最大值(0 < maxval < 2048)* @param samples: 采样点的个数* @retval 无*/
void dac_creat_sin_buf(uint16_t maxval, uint16_t samples)
{uint8_t i;float outdata = 0; /* 存放计算后的数字量 */float inc = (2 * 3.1415962) / samples; /* 计算相邻两个点的x轴间隔 */if(maxval <= (samples / 2))return ; /* 数据不合法 */for (i = 0; i < samples; i++){/* * 正弦波函数解析式:y = Asin(ωx + φ)+ b* 计算每个点的y值,将峰值放大maxval倍,并将曲线向上偏移maxval到正数区域* 注意:DAC无法输出负电压,所以需要将曲线向上偏移一个峰值的量,让整个曲线都落在正数区域*/outdata = maxval * sin(inc * i) + maxval;if (outdata > 4095)outdata = 4095; /* 上限限定 *///printf("%f\r\n",outdata);g_dac_sin_buf[i] = outdata;}
}
注意:在配置定时器触发DAC转换
HAL_TIMEx_MasterConfigSynchronization();
关键结构体
/*** @brief TIM Master configuration Structure definition*/
typedef struct
{uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selectionThis parameter can be a value of @ref TIM_Master_Mode_Selection */uint32_t MasterSlaveMode; /*!< Master/slave mode selectionThis parameter can be a value of @ref TIM_Master_Slave_Mode@note When the Master/slave mode is enabled, the effect ofan event on the trigger input (TRGI) is delayed to allow aperfect synchronization between the current timer and itsslaves (through TRGO). It is not mandatory in case of timersynchronization mode. */
} TIM_MasterConfigTypeDef;
其中MasterOutputTrigger为配置定时器触发输出的选择
/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection* @{*/
#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */
#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */
#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */
#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */
#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */
#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */
#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */
#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */
/*** @}*/
配置的相关寄存器为:

MMS[2:0]我们选择010更新,事件被选为触发输入(TRGO)。
其中MasterSlaveMode为设置主从模式,这里我们选择无作用。


注意:使用DMA2来转移数据到DAC寄存器中

相关文章:
初学stm32 --- DAC输出三角波和正弦波
输出三角波实验简要: 1,功能描述 通过DAC1通道1(PA4)输出三角波,然后通过DS100示波器查看波形 2,关闭通道1触发(即自动) TEN1位置0 3,关闭输出缓冲 BOFF1位置1 4,使用12位右对齐模式 将数字量写入DAC_…...
开源cJson用法
cJSON cJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。 cJSON项目托管在Github上,仓库地址如下: https://github.com/DaveGamble/cJSON 使用Git命令将其拉…...
【学习笔记】理解深度学习和机器学习的数学基础:数值计算
深度学习作为人工智能领域的一个重要分支,其算法的实现和优化离不开数值计算。数值计算在深度学习中扮演着至关重要的角色,它涉及到如何在计算机上高效、准确地解决数学问题。本文将介绍深度学习中数值计算的一些关键概念和挑战,以及如何应对…...
如何使用CSS让页面文本两行显示,超出省略号表示
talk is cheap, show me the code 举个栗子,如下: <span class"a">我说说<b class"b">打瞌睡党风建设打火机</b>说说色儿</span>a{display:block/inline-block;width:100px;overflow: hidden; white-spac…...
likeshop同城跑腿系统likeshop回收租赁系统likeshop多商户商城安装及小程序对接方法
前言:首先likeshop是一个开发平台,是一个独创的平台就像TP内核平台一样,你可以在这个平台上开发和衍生出很多伟大的产品,以likeshop为例,他们开发出商城系统,团购系统,外卖点餐系统,…...
C# 与 Windows API 交互的“秘密武器”:结构体和联合体
一、引言 在 C# 的编程世界里,当我们想要深入挖掘 Windows 系统的底层功能,与 Windows API 打交道时,结构体和联合体就像是两把神奇的钥匙🔑 它们能够帮助我们精准地操控数据,实现一些高级且强大的功能。就好比搭建一…...
PHP 使用 Redis
PHP 使用 Redis PHP 是一种广泛使用的服务器端编程语言,而 Redis 是一个高性能的键值对存储系统。将 PHP 与 Redis 结合使用,可以为 Web 应用程序提供快速的读写性能和丰富的数据结构。本文将详细介绍如何在 PHP 中使用 Redis,包括安装、连接、基本操作以及一些高级应用。 …...
嵌入式系统Linux实时化(四)Xenomai应用开发测试
1、Xenomai 原生API 任务管理 Xenomai 本身提供的一系列多任务调度机制,主要有以下一些函数: int rt_task_create (RT_TASK task, const char name, int stksize, int prio, intmode) ; 任务的创建;int rt_task_start(RT_TASK task, void(entry)(void cookie), void cookie…...
26个开源Agent开发框架调研总结(2)
根据Markets & Markets的预测,到2030年,AI Agent的市场规模将从2024年的50亿美元激增至470亿美元,年均复合增长率为44.8%。 Gartner预计到2028年,至少15%的日常工作决策将由AI Agent自主完成,AI Agent在企业应用中…...
Element UI与Element Plus:深度剖析
文章目录 前言一、概述二、技术特性三、设计理念四、使用体验五、迁移指南结语 前言 随着前端开发技术的快速发展,Vue.js 生态系统中的组件库也在不断进化。Element UI 和 Element Plus 是两个深受开发者喜爱的 Vue 组件库,它们分别构建于 Vue 2.x 和 V…...
二、BIO、NIO编程与直接内存、零拷贝
一、网络通信 1、什么是socket? Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口,一般由操作 系统提供。客户端连接上一个服务端,就会在客户端中产生一个 socket 接口实例,服务端每接受 一个客户端…...
VSCode 更好用的设置
配置 {"terminal.integrated.fontSize": 15,"security.workspace.trust.untrustedFiles": "open","editor.minimap.enabled": false,"workbench.colorTheme": "Visual Studio 2017 Light - C","gnuGlobal.c…...
【git】-3 github创建远程仓库,上传自己的项目,下载别人的项目
一、如何使用Github 1、创建远程仓库 2、使用github拉取/推送代码 克隆仓库 向远程仓库推送代码-git push 二、上传我们自己的项目到github 方法一:直接上传 方法二:使用git命令 方法三: 将仓库拉取到本地上传 三、下载别人的项目 …...
计算机组成原理(1)
系统概述 计算机硬件基本组成早期冯诺依曼机现代计算机 计算机各部分工作原理主存储器运算器控制器计算机工作过程 此文章的图片资源获取来自于王道考研 计算机硬件基本组成 早期冯诺依曼机 存储程序是指将指令以二进制的形式事先输入到计算机的主存储器,然后按照…...
Openstack网络组件之Neutron
从Nova到Neutron:OpenStack网络架构的演变 在云计算和虚拟化技术迅猛发展的背景下,OpenStack 成为了构建私有云和公有云平台的首选解决方案之一。早期版本中,Nova 项目不仅负责计算资源的管理,还承担了提供基本网络连接的任务。然…...
神州数码交换机和路由器命令总结
神州数码交换机和路由器命令总结 一、神州数码交换机命令总结 1. 交换机恢复出厂设置及其基本配置. 1) //进入特权模式 2) del startup.cfg 2. Telnet方式管理交换机. 1) //进入全局配置模式 2) enable password 0 [密码] 3) Line 0 4 4) Password 0 [密码] 5) Login 3. 交换机…...
Spring MVC简单数据绑定
【图书介绍】《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》_springspringmvcmybatis从零开始 代码、课件、教学视频与相关软件包下载-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版&…...
《SQL ORDER BY》
《SQL ORDER BY》 介绍 SQL(Structured Query Language)是一种用于管理关系数据库管理系统的标准编程语言。ORDER BY语句是SQL中的一个重要部分,它用于对查询结果进行排序。在本篇文章中,我们将详细介绍SQL ORDER BY语句的用法、语法、示例以及一些高级应用。 语法 ORD…...
RabbitMQ基础(简单易懂)
RabbitMQ高级篇请看: RabbitMQ高级篇-CSDN博客 目录 什么是RabbitMQ? MQ 的核心概念 1. RabbitMQ 的核心组件 2. Exchange 的类型 3. 数据流向说明 如何安装RabbitQueue? WorkQueue(工作队列): Fa…...
DNS解析域名简记
域名通常是由: 权威域名.顶级域名.根域名组成的。 从左往右,级别依次升高,这和外国人从小范围到大范围的说话习惯相关。(我们自己是更习惯先说大范围再说小范围,如XX省XX市XX区XX路) DNS解析域名时,会先查…...
Linux C编程基础知识(命令行参数)
getopt接口int getopt(int argc, char *const argv[], const char *optstring);参数说明:参数作用argc/argv直接传入 main 函数的命令行参数(个数 数组)optstring选项规则字符串,核心规则:- 单个字符(如 h…...
从Java到Vue的全栈开发之路:一次真实的面试对话
从Java到Vue的全栈开发之路:一次真实的面试对话 在一家互联网大厂的面试中,一位名叫林晨的28岁程序员正接受着技术面试官的提问。他拥有硕士学历,有5年的Java全栈开发经验,曾参与多个大型项目,涉及电商平台、内容社区与…...
with open方法详解
Python with open 方法详解 with open 是 Python 中操作文件最推荐、最安全的写法,核心作用是自动管理文件资源,不用手动关闭文件,也能避免文件泄露、数据丢失等问题。 一、基础语法 python 运行 # 标准格式 with open(文件路径, 模式, 编码) as 变量名:# 缩进内写文件操…...
Binder Hook机制深度解析:understand-plugin-framework跨进程通信黑科技
Binder Hook机制深度解析:understand-plugin-framework跨进程通信黑科技 【免费下载链接】understand-plugin-framework demos to help understand plugin framwork 项目地址: https://gitcode.com/gh_mirrors/un/understand-plugin-framework 在Android开发…...
OpenClaw开发提效方案:Qwen3-14b_int4_awq辅助日志分析与告警
OpenClaw开发提效方案:Qwen3-14b_int4_awq辅助日志分析与告警 1. 为什么需要AI辅助日志分析 作为一名全栈开发者,我每天要面对数十个微服务的日志文件。最头疼的就是半夜被报警电话吵醒,然后花几个小时在一堆日志中寻找那个导致服务崩溃的关…...
C++的std--ranges视图转换函数异常安全与资源清理在惰性求值中的处理
C的std::ranges视图转换函数异常安全与资源清理在惰性求值中的处理 现代C引入的std::ranges库为序列操作提供了声明式编程支持,其中视图转换函数(如transform、filter等)通过惰性求值优化性能。惰性求值机制与异常安全、资源清理的交互可能引…...
计算机毕业设计 | SpringBoot+vue文理医院预约挂号系(附源码+论文)
1,绪论 1.1 研究背景与意义 信息化管理模式是将行业中的工作流程由人工服务,逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速,使用起来非常简单容易,用户甚至不用掌握相关的专业知识,根据教程指导即…...
ModTheSpire终极指南:5个技巧让杀戮尖塔模组加载零烦恼
ModTheSpire终极指南:5个技巧让杀戮尖塔模组加载零烦恼 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 厌倦了每次想体验新模组都要手动修改游戏文件的繁琐操作吗ÿ…...
[具身智能-235]:OpenCV - 图像是RGB三通道,Mask是单通道
在 OpenCV 和计算机视觉中,图像(Image)通常是三维的(高 H 宽 W 通道 C,例如 RGB 三通道),而 掩膜(Mask)通常是二维的(高 H 宽 W,单通道黑白&am…...
市电转低压直流这事儿玩过的人都知道,反激式拓扑是性价比首选。最近手头刚做完两个工业电源项目,正好拿6W和12W两个方案来唠唠实战细节
220V转12V成熟设计,做过相关认证。 两种电路。 1)6W,包含原理图和pcb,附芯片手册,包含变压器设计. 2) 12W,包含原理图和pcb,附 BOM,变压器参数,芯片手册。 备注:方案一芯片比方案二芯片价格偏低…...
