STM32笔记--DAC(正弦波发生)

发现STM32的音乐之美:使用DAC输出正弦波 在嵌入式系统中,音频处理是一个令人着迷的领域。STMicroelectronics的STM32系列微控制器提供了数字模拟转换器(DAC)功能,使得通过嵌入式系统输出声音变得轻而易举。本文将介绍如何在STM32上使用DAC来输出正弦波,并通过示例代码演示其用法。 阅读详情
AI摘要

本文深入探讨了DAC(数字模拟转换器)的工作原理及其在STM32平台上的应用。介绍了如何通过定时器触发进行信号生成,并实现了正弦波的输出。涵盖了DAC配置、定时器配置及DMA配置等关键步骤。

     DAC,与ADC相对,是数字量转模拟量,经常用来作为信号发生器,这里DAC一定要详细记录,但其实原理还是相对简单。首先我们看一下

DAC的触发源:

DAC的触发源有6个定时器的更新时间和一个外部触发,一般外部触发我们用于DAC的直流产生,所以我们这次使用的是定时器触发。

DAC的主要特性:(来自官方手册)

●2个DAC转换器:1个输出通道对应1个转换器
● 8位或者12位单调输出
● 12位模式下数据左对齐或者右对齐
● 同步更新功能
● 噪声波形生成
● 三角波形生成
● 双DAC通道同时或者分别转换
● 每个通道都有DMA功能
● 外部触发转换
● 输入参考电压V REF+

DAC配置的特殊注意点:

 一旦使能 DAC 通道,相应的 GPIO 管脚 (PA4 或者 PA5) 就会自动与 DAC 的模拟输出相连(DAC_OUTx) 。为了避免寄生的干扰和额外的功耗,管脚 PA4 或者 PA5 在之前应当设置成模拟输入 (AIN) 。

代码讲解(带详细注解,将整个工程用到的函数分开讲解,更加清晰)

int main(void)
{
   DAC_Mode_Init();   //DAC模式初始化
   while(1);	 
}

const uint16_t Sine12bit[32] = {
	2448,2832,3186,3496,3751,3940,4057,4095,4057,3940,
	3751,3496,3186,2832,2448,2048,1648,1264,910,600,345,
	156,39,0,39,156,345,600,910,1264,1648,2048
};


uint32_t DualSine12bit[32];

void DAC_Mode_Init(void)
{
	uint32_t Idx = 0;  

	DAC_Config();   //DAC初始化
	DAC_TIM_Config();    //定时器触发配置
	DAC_DMA_Config();    //DMA配置
        for (Idx = 0; Idx < 32; Idx++)           //for循环给Dualsin12bit赋值,双通道输出原因看下图
  {
    DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);   //每次传输一个12位数值+该值左移16位从而得到一个32位数值
  }
}

这是一个32位的寄存器,我们每次都往里面写一次相应数值,循环输出,从而得到正弦波。看下图可加深理解

static void DAC_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  DAC_InitTypeDef  DAC_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	  //开启APB2的gpioa的时钟
	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);   //开启APB1的DAC时钟,DAC挂载于APB1的通道4
	
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;    //开启GPIOA4 和 A5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;     //设置为模拟输入(看上面注意点,重要)
  GPIO_Init(GPIOA, &GPIO_InitStructure);     //写入结构体
	

  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;	  //设置为TIM2更新,即设置TIM2作为触发源					
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;	//不使用波形发生器
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;	//不适用输出缓冲,若如要输出电流可配置
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);             //初始化通道一
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);             //初始化通道二

  DAC_Cmd(DAC_Channel_1, ENABLE);    //使能通道一

  DAC_Cmd(DAC_Channel_2, ENABLE);   //使能通道二

  DAC_DMACmd(DAC_Channel_2, ENABLE);   //使能DAC对DMA的请求
}

static void DAC_TIM_Config(void)
{
	
  TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //使能定时器2
	
 // TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
  TIM_TimeBaseStructure.TIM_Period = 19;      //计时到20会更新一次   								
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      // 内部1分频,也就是计数器时钟为72M  						
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    	//外部不分频(没用到)				
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  	//向上计数
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);   // 配置触发源
  TIM_Cmd(TIM2, ENABLE);   //使能 TIM2

}


static void DAC_DMA_Config(void)
{	
	DMA_InitTypeDef  DMA_InitStructure;

	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);  //使能DMA2
	
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;      //定义为双通道模式,其他模式请看手册				
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit ;    //定义的写入寄存器的32位数组			
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;	               //传输方向为内存到外设					
  DMA_InitStructure.DMA_BufferSize = 32;		               //缓存大小32位					
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;     //外设地址固定	
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;	       //内存地址自增	
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;	//外设传输一个字节
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;		//内存传输一个字节			
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;	                        //循环输出					
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;				//优先级为高					
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;					//禁止内存间传输					
  DMA_Init(DMA2_Channel4, &DMA_InitStructure);                                  //开启DMA通道4	
  DMA_Cmd(DMA2_Channel4, ENABLE);                                               //使能
}

#define DAC_DHR12RD_Address      0x40007420 //0x40007420    

DAC内存地址0x40007420,两位输出寄存器偏移20,其他模式地址请查找手册


DAC得到的信号频率:

流程总结:



STM32实战项目-DAC正弦波 关于DAC相关整理 阅读详情

相关推荐

STM32DAC输出可调电压、三角波、正弦波

STM32DAC输出可调电压、三角波、正弦波

weixin_67907028的博客 7373

STM32 正弦波输出

要输出正弦波,需要好几个外设配合:Timer、DAC、DMA。TImer用来设置正弦波的频率的;DAC顾名思义将数字量转换成模拟量,在这里就是转化成电压信号;DMA直接控制DAC输出,而不用麻烦芯片内核。 下面讲讲它们之间如何配合工作。首先要配置定时器的频率,并设置定时器为输出触发。然后配置DAC的触发源为定时器触发,并打开DAC的MDA功能。接下去轮到DMA的工作了,设置DMA的操作对象为DAC。按上面配置好后,三个外设就可以正常工作了:定时器每次计数值递增,就触发DAC工作,然后DMA就控制DAC输出

qq_41440019的博客 1万+

基于STM32+DAC+DMA和AD9850的波形发生器

基于STM32+DAC+DMA和AD9850的波形发生器 试验目的 一、通过STM32单片机DAC+DMA产生频率可调正弦波、三角波、锯齿波、方波。 二、使用STM32驱动AD9850波形发生模块产生正弦波和方波。 一、AD9850/AD9851的简介 AD9850/AD9851 模块是采用 ADI 应用最广泛的 DDS(AD9850 和 AD9851)制作的模块。 主要功能特点: 模块能够输出正弦波和方波,2 个正弦波和 2 个方波输出。  AD9850: 0-40MHz  AD9851: 0-70

weixin_45353050的博客 1万+

stm32输出正弦波

本次说明是看野火的开发板学习,做个笔记 计算获取正弦波数据表; 2) 根据正弦波数据表的周期内点数和周期计算定时器触发间隔; 3) 初始化 DAC 输出通道,初始化 DAC 工作模式; 4) 配置触发 DAC 用的定时器; 5) 配置 DMA 自动转运正弦波数据表。 配置完成后,即可在 PA4、PA5 引脚中检测到信号输出。 首先 生成正弦波数据表 要输出正弦...

位文杰的博客 6万+

STM32CubeMX(STM32F051R8TX)——DAC输出正弦波

一、DAC简介 DAC(Digital-to-Analog Converter),即数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC 相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压模拟信号常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。 STM32 具有片上 DAC 外设,它的...

weixin_42880770的博客 4275

STM32外设DA实战-DAC + DMA 输出正弦波

因为 DAC 数据寄存器通常只需要写入有效数据位(如 12 位),并且我们的查找表是 uint16_t 类型,所以 DMA 的外设和内存宽度都设置为 Half Word (16位) 是最自然、最高效的配置。4,DMA 自动"喂数据": 配置 DMA 通道,在每次接收到定时器触发信号后,自动从内存中的正弦波查找表里取出下一个样本点,写入 DAC 的数据保持寄存器 (DHR)。: 启动作为触发源的定时器。(中心值,大约是 2047.5),将波形整体向上平移,使其中心对准 DAC 输出范围的中点。

2402_89015641的博客 3020

基于STM32的DAC简易信号发生器设计(HAL库)

基于STM32的DAC简易信号发生器设计,信号源包括:方波、正弦波、三角波与噪声波。可输出预设频率的各种类型信号,HAL库版本,代码开源!

black_sneak的博客 1万+

STM32物联网项目-DAC输出模拟量以及正弦波

​ STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 VREF+以获得更精确的转换结果。

weixin_46251230的博客 5987

STM32CubeMX学习笔记(20)——DAC接口使用(输出正弦波)

一、DAC简介 DAC(Digital-to-Analog Converter),即数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC 相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压模拟信号常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。 STM32 具有片上 DAC 外设,它的分辨率

Leung的博客 2万+

STM32实验-输出DAC正弦波

其中形参的取值范围是(samples/2)

Mr_rustylake的博客 4959

stm32的DAC输出正弦波.doc

stm32的DAC输出正弦波.doc

STM32 DAC+TIMER+DMA输出正弦波

前段时间学习了STM32使用DAC模块输出正弦波的功能,在学习过程中遇到了一些问题,在此和各位分享。 DAC是数字/模拟转换模块的简称,STM32中的DAC是12位数字输入,这个就决定了其精度。STM32的DAC模块具有两个通道,可单独进行转换,也就是说可以同时输出两个正弦波或其他波形。输出正弦波的原理简单讲就是每隔一定时间向DAC的数据寄存器写入数据,然后进行数据转换,输出不同电压,然后在时间轴上显示出波形。 这里比较重要的一个公式就是数字量和模拟量的转换公式: STM32芯片内部有个参考电压:VREF

zjn15000的博客 1万+

Vivado时序违例debug

显示了数据路径延迟。例如,对于违例路径,若布线延迟超过50%,说明该延迟是导致时序不能收敛的主要因素,因此可围绕降低布线延迟这一靶心达到时序收敛。对于跨时钟域路径,Requirement数值会有所变化,但如果数值为0.1,显然是不合理的。目的时钟路径单元,时钟从adc0_bufg/O输出,到达PLLE4_ADV,经过BUFGCE输出,最终到达SRLC32E移位寄存器,对应。源时钟路径单元,时钟从adc0_bufg/O输出,到达PLLE4_ADV,经过BUFGCE输出,最终到达FDRE触发器,对应。

weixin_44513618的博客 1621

STM32CubeMX | STM32使用DAC+DMA+TIM生成10KHz正弦波

STM32CubeMX | STM32使用DAC+DMA+TIM生成10KHz正弦波 目录STM32CubeMX | STM32使用DAC+DMA+TIM生成10KHz正弦波前言工程配置时钟配置到72M主频:配置DAC配置DMA配置定时器 工程环境: STM32F103RC KEIL MDK 5.20 STM32CubeMX 6.0 前言 开始教程之前先回顾一下初中学过的三角函数相关内容。 正弦波曲线的函数公式是:y=sin(x) y的范围区间是[-1:1] x的取值范围是任意实数

^_^ 1万+

[pytorch]FixMatch代码详解(超详细)

FixMatch代码详解-训练过程参数数据产生构建模型训练参数设置weight decay(权值衰减)学习率衰减(learning rate decay)指数移动平均(EMA)model训练过程运行结果 上一篇大概讲了数据加载的过程,这一篇更进一步,分析一下训练是怎样进行的 上一篇链接: [pytorch]FixMatch代码详解-数据加载 参数 所有的参数我都默认使用作者给出的例子: python train.py --dataset cifar10 --num-labeled 4000 --arch w

qq_38736504的博客 1万+

三维重建笔记_光束平差法(Bundle Adjustment, BA)

目录 1 光束平差法(Bundle Adjustment, BA) 1.1 SFM (Structure‐from‐Motion) 定义 问题描述 1.2 重投影误差 (Reprojection Error) 目标函数 1.3 使用 Levenberg‐Marquardt Algorithm 进行优化 问题描述 简化目标函数 参考 Gauss‐Newton Method ...

惊鸿一博 2万+

STM32 DAC 输出正弦波、三角波、方波

STM32 使用DAC输出三角波、正弦波和方波

Ljh0408abc的博客 3万+

[官方培训]07-UE材质基础 孙丹璐 Epic 笔记

勾选允许自定义深度写入再在模型上勾选然后可以通过Scene Texture节点拿到渲染的自定义深度信息,有了自定义深度信息就可以与当前渲染的像素深度进行对比,自定义深度信息存放的是最靠近我们的深度,如果当前像素离自定义深度比较远我们就不要这个像素。效果如下这种方案的缺点也很明显,因为这样看不到第二层的透明了,如果是两层的半透明的裙摆,这样就看不到第二层的裙摆了。对于半透明排序问题最根本能解决的还是光线追踪,ue5中又加入了OIT(基于像素的排序)。官方透明材质的理解和应用。

Tcohneyn的博客 1562

stm32的DAC输出

stm32的DAC输出一、DAC原理二、DAC初始化三、输出正弦波四、输出音频 一、DAC原理 DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对 应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号 被化成电压信号,而 ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计 算机处理完成后,再由 DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器 件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。 STM32具有片上

被无情调岗的痛苦狗头 1万+

AFC自动售检票系统与人工智能AI结合的关键应用方案

针对售检票、大客流管理、设备运维及服务优化提供了可落地的技术支持和实现细节,可作为地铁智慧交通项目的实践参考

leijinquan01的博客 1513

从DDH到FastANI:原核生物分类黄金标准的进化史与技术对比

本文系统梳理了原核生物分类标准从DDH到FastANI的四次技术革命,详细解析了95%相似度阈值的科学依据及应用场景。通过对比DDH、16S rRNA、ANI和FastANI的技术特点与性能指标,为微生物研究者提供基因组分类的实战指南,并展望第三代测序时代的分类新挑战。

weixin_29275257的博客 413

STM32——DAC生成正弦波

DAC生成正弦波原理分析

火红色祥云 1万+

Flutter加载本地HTML的优雅解决方案:轻松实现富文本展示

通过以上步骤,我们实现了Flutter加载本地HTML的完整流程,并简单介绍了如何通过WebView与HTML页面进行交互。HTML文件作为一种灵活、易维护的富文本展示方式,能有效提升Flutter应用的内容呈现能力。这种方法在展示新闻、资讯或帮助文档等内容时非常有用,能够让开发者灵活调整内容的样式和排版。希望这篇文章能对你在Flutter开发中的HTML加载有所帮助!

四楼没电梯的专栏 3644

基于STM32的DAC实现音频波形的输出

本文目的是使用STM32的DAC(数模转换)实现音频信号波形的输出。这里分为两个部分:第一部分实现特定频率单音频信号波形的输出;第二部分实现歌曲音频信号波形的输出。 目录(一)DAC简介1.STM32的DAC2.DAC主要特征3.DAC通道模块框图(二)单音频正弦波输出1.实验目的2.ADC 配置3.输出信号3.歌曲音频信号波形输出(三)总结 (一)DAC简介 1.STM32的DAC 数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位 或12位模式,也可以与D.

qq_45237293的博客 1万+

告别卡顿!用AVPro Video在Unity 2022.3里流畅播放4K视频的保姆级配置流程

本文详细介绍了如何在Unity 2022.3中使用AVPro Video插件实现4K视频的流畅播放。从环境配置、插件选型到核心性能优化技巧,包括解码器设置、内存管理策略和多平台适配方案,帮助开发者彻底解决卡顿问题,提升视频播放体验。

weixin_32349561的博客 318

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32 CubeMX生成DAC+DMA+TIM生成正弦波

1.首先配置好系统时钟 2.打开DAC 3.配置DMA,在DAC中的"DMA Setting"选项卡中添加DMA,DMA模式选择循环模式 4.配置定时器,在第二步中选择的是TIM6 ,在第一步中设置的定时器频率是36MHz,这里进行总共12000倍分频,最终结果是3KHz频率. ( 36000000/1000/12=3000Hz).这里设置的只是DMA的触发频率, 注意:...

qq_41675998的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: STM32笔记--呼吸灯
下一篇: STM32笔记--RTC
VCA821
博客等级 码龄9年 395粉丝 36原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值