精华内容
下载资源
问答
  • DAC输出音乐

    2020-08-17 11:21:54
    单片机可使用自带DAC输出模拟信号,借此可输出音乐,过程中把握好定时器频率和缓存数据及时刷新。 另外在网上看到有使用定时器直接触发DAC DMA发送的,我经过测试发现发送的是瞬间完成而不是触发一次发送一次,我的...

    简介

    单片机可使用自带DAC输出模拟信号,借此可输出音乐,过程中把握好定时器频率和缓存数据及时刷新。

    另外在网上看到有使用定时器直接触发DAC DMA发送的,我经过测试发现发送的是瞬间完成而不是触发一次发送一次,我的测试没有通过

    本篇和WAV解析篇联系极大https://blog.csdn.net/shaynerain/article/details/108052144

    DAC配置

    直接开启ADC不需要其他额外配置,如果单声道可以只开一个,立体声就开两个

    定时器配置

    定时器配置中断,和音乐源的采样频率相同,如果是立体声,则频率是二分之一倍,下面是我在STM32F4的分配

    应用程序

    开启DAC

    开启定时器

    调用wav文件解析的wav_decode_play函数

    wav相关https://blog.csdn.net/shaynerain/article/details/108052144https://download.csdn.net/download/shaynerain/12712663

    定时器如下:

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    		HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);
    	
    	if(wav_buf_stats)
    	{		
    		if(tim_now == 0) 
    		{
    			tim_now = wav_buf_stats&0x01;
    			if(tim_now==0) tim_now = wav_buf_stats&0x02;
    		}
    		
    		temp+=1;
    		if(temp >= WAV_BUFSIZE){
    			temp=0;
    			if(tim_now==1) {tim_now=2; wav_buf_stats &= 0x02;}
    			else if(tim_now == 2) {tim_now = 1;wav_buf_stats &= 0x01;}
    		}
    		if(tim_now == 0x01){
    			HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_8B_R,wav_buf[temp]);
    			HAL_DAC_SetValue(&hdac,DAC_CHANNEL_2,DAC_ALIGN_8B_R,wav_buf[temp]);
    		}
    		if(tim_now == 0x02){
    			HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_8B_R,wav_buf2[temp]);
    			HAL_DAC_SetValue(&hdac,DAC_CHANNEL_2,DAC_ALIGN_8B_R,wav_buf2[temp]);
    		}
    	}
    }

     

    展开全文
  • DAC输出特定波形

    千次阅读 2019-11-23 01:17:37
    DAC输出特定波形 我所做的任务是用stm32F4的DAC输出一段特定频率和形状的波。 下面我将其分为几个步骤。 初始化 配置DAC 配置DMA 写入波形形状 初始化 配置DAC 首先查找到能够作为DAC的串口...

    DAC输出特定波形

    我所做的任务是用stm32F4DAC输出一段特定频率和形状的波。

    简述过程:

    DMA将一个存储器(在这里选用的是一个数组)和一个外设(在这里选择的是DAC)连接起来,接着只要使能,就可以完成DAC的输出了。可以将DAC输出的通道连接到示波器或者逻辑分析仪上查看所输出的波形。
    下面我将其分为几个步骤。

    • 初始化
    • 配置DAC
    • 配置DMA
    • 写入波形形状

    初始化

    • 配置DAC

    首先查找到能够作为DAC的串口(在这里我选择的是PA4),接着分别使能所选择的串口和DAC。
    下图是各引脚的复用功能,这里我选择的就是PA4的DAC1-OUT。
    在这里插入图片描述
    第一步是使能刚刚所选择的引脚

    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitType;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//此处选择模拟输出,模拟输入或者其它都可以。
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //这里选择什么也都可以,不必纠结。
    GPIO_Init(GPIOA, &GPIO_InitStructure);//完成GPIOA的初始化。

    完成了引脚的初始化,接着就是DAC的配置了。

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC的时钟 
    DAC_InitType.DAC_Trigger=DAC_Trigger_T2_TRGO; //选择DAC的触发方式,这里选择的是定时器2,也就意味着对定时器2的配置就完成了DAC输出频率的配置。  
    DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不产生波形
    DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽幅值设置  
    DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭
     DAC_Init(DAC_Channel_1,&DAC_InitType);  //初始化DAC通道1,只是普通的输出通道,不用在意为什么选通道一。
     DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC通道1,这一步特别重要!!!
      
      DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式来设置DAC的值

    然后记得在main函数里头加上定时器2的初始化使能!

    TIM2_Int_Init(100-1,8400-1);//此处定时器2的频率就是DAC的输出频率了,而频率该怎么计算,大家可在网上查找或者看我的其他文章。
    • DMA配置

    首先得说明一下,在stm32F4里头,DMA的配置是通过DMA的数据流和通道来配置的,而F1只是配置通道,但大致方法是差不多的。
    此处DMA的初始化放在了一个函数里面。

    void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
    { 
     DMA_InitTypeDef  DMA_InitStructure;
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
      DMA_DeInit(DMA_Streamx);//对通道和数据流的选择看下面的图
    
    while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置 
      /* 配置 DMA Stream */
      DMA_InitStructure.DMA_Channel = chx;  //对通道和数据流的选择看下面的图
      DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA所连接到的外设的地址,par我认为应该是Peripheral的缩写。
      DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器的地址,由于这里用的是数组,所以存储器的地址也就是数组的地址了。
      DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//选择存储器到外设模式,顾名思义,不难理解。在其他场景中我们也可以选择其他模式。
      DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量,也就是数组的大小
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量,这里外设选择的是DAC,所以不需要外设增量
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式,也就是传输时会自动地按顺序将数组中的数一个个传输到DAC。
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据长度,由于我选用的数据长度是32位,所以这里选择了全字,其实没必要这么大,大家可以自行选择。全字的长度是32,半字是16,字节是8。这里也跟前面的12位右对齐有关。
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//存储器数据长度,道理同上面。
      DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;//循环模式,也就是循环地不断输出该波形。 
      DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//这个程序中没有太多的中断,所以这个可以随意选。
      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输。
      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
      DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化该数据流。
     DMA_Cmd(DMA_Streamx, ENABLE); //使能。
     DAC_DMACmd(DAC_Channel_1,ENABLE);//将DAC和DMA连接起来。

    在这里插入图片描述
    在这里插入图片描述对于这个初始化函数,填完对应的数据流,通道,memory_address,可能就是外设地址比较令人头疼,那外设地址怎么找?
    在这里插入图片描述找到stm32f4xx.h或者是stm32f1xx.h,在里面找到你所需要的外设的结构体,结构体中就包括了这个外设所涉及的各种寄存器地址,根据描述选中你需要的地址。
    最终如下:(DMA1,STEAM5,CH7,外设为dac2,这里选的是dac channel1 12位右对齐;然后下一个是数组的地址,最后一个参数是数组的大小)

    MYDMA_Config(DMA1_Stream5,DMA_Channel_7,(u32)&DAC->DHR12R1,(u32)DATA2,SEND_BUF_SIZE);//DMA1,STEAM5,CH7,外设为dac2,这里选的是dac channel1 12位右对齐;然后下一个是数组的地址,最后一个参数是数组的大小
    
    • 写入数组,也就是所谓的存储器。

    这里大家想要输出什么波形就输入对应的数据(要记得乘以4096再除以3.3)。

    如果在运行过程中需要改变波形,只需在运行过程改变该数组里面的值,不需要再次调用初始化的函数,或者再次使能DMA,DAC。

    比如在按键触发的中断中改变数组的值,或者直接将指针指向其他数组。就能够实现按键改变输出波形。

    下面是我的数组数据。

    u32 DATA2[SEND_BUF_SIZE]={
      2460,
    2440,2420,2400,2380,2360,2340,2320,2300,2280,2260,2240,2220,2200,2180,2160,2140,2120,2100,2080,2060,
    2040,2020,2000,1980,1960,1940,1920,1900,1880,1860,1840,1820,1800,1780,1760,1740,1720,1700,1680,1660,
    1640,1620,1600,1580,1560,1540,1520,1500,1480,1500,1520,1540,1560,1580,1600,1620,1640,1660,1680,1700,
    1720,1740,1760,1780,1800,1820,1840,1860,1880,1900,1920,1940,1960,1980,2000,2020,2040,2060,2080,2100,
    2120,2140,2160,2180,2200,2220,2240,2260,2280,2300,2320,2340,2360,2380,2400,2420,2440,2460,2480,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    12,25,38,51,64,77,90,103,116,129,142,155,168,181,194,206,219,232,245,258,
    270,283,296,308,321,333,346,358,371,383,395,408,420,432,444,456,468,480,492,504,
    516,528,540,551,563,575,586,597,609,620,631,642,654,665,676,686,697,708,719,729,
    740,750,760,770,781,791,801,811,820,830,840,849,859,868,877,886,895,904,913,922,
    931,939,948,956,964,972,980,988,996,1004,1011,1019,1026,1033,1040,1047,1054,1061,1068,
     };

    觉得对你有帮助就点个赞或收藏吧,熬夜肝的的确不容易。

    展开全文
  • DAC输出正弦波

    2013-01-28 12:48:08
    DAC输出正弦波 非常有用的文档 stm32的
  • stm32的DAC输出

    2021-01-03 21:19:35
    stm32的DAC输出一、DAC原理二、DAC初始化三、输出正弦波四、输出音频 一、DAC原理 DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对 应的模拟电压输出,它的功能与 ADC相反。在常见的...

    一、DAC原理

    DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对 应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号 被化成电压信号,而 ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计 算机处理完成后,再由 DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器 件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。 STM32具有片上 DAC外设,它的分辨率可配置为 8位或 12位的数字输入信号,具有 两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错 检测能力,可外部触发。

    在这里插入图片描述
    整个 DAC模块围绕框图下方的“数字至模拟转换器 x”展开,它的左边分别是参考电 源的引脚:𝑉𝐷𝐷𝐴、𝑉𝑆𝑆𝐴及𝑉𝑟𝑒𝑓+,其中 STM32 的 DAC 规定了它的参考电压𝑉𝑟𝑒𝑓+输入范围为 2.4——3.3V。“数字至模拟转换器 x”的输入为 DAC 的数据寄存器“DORx”的数字编码, 经过它转换得的模拟信号由图中右侧的“DAC_OUTx”输出。而数据寄存器“DORx”又 受“控制逻辑”支配,它可以控制数据寄存器加入一些伪噪声信号或配置产生三角波信号。 图中的左上角为 DAC的触发源,DAC根据触发源的信号来进行 DAC转换,其作用就相当 于 DAC转换器的开关,它可以配置的触发源为外部中断源触发、定时器触发或软件控制触 发。如本章实验中需要控制正弦波的频率,就需要定时器定时触发 DAC进行数据转换。

    二、DAC初始化

    1、定时器初始化
    在这里插入图片描述
    TIM2的定时周期被配置为 20,向上计数,不分频。即 TIM2 每隔 20*(1/72M)秒就会触发一次 DAC 事件,作 DAC触发源使用的定时器并不需要设置中断,当定时器计数器向上计数至指定的 值时,产生Update事件,同时触发DAC把DHRx寄存器的数据转移到DORx,从而开始进 行转换。

    2、DAC初始化
    在这里插入图片描述
    在 DAC_Config 函数中,完成了 DAC 通道的 GPIO 的初始化和 DAC 模式配置。其中 GPIO 按照要求被配置为模拟输入模式(没有模拟输出模式),在该模式下才能正常输出模 拟信号。 配置 DAC 工作模式时,则使用了 DAC_InitTypeDef 类型的初始化结构体,把 DAC 通 道 1 和 2 都配置成了使用定时器 TIM2 触发、不使用波形发生器以及不使用 DAC 输出缓冲 的模式。 初始化完 GPIO 和 DAC 模式后,还使用了 DAC_Cmd、DAC_DMACmd 函数使能了通 道以及 DMA 的请求。由于本实验中对 DAC1 和 2 的操作是同步的,所以只要把 DMA 与 DAC通道 2关联起来即可,当使用DMA设置通道2的数据值时,同时更新通道1的内容。

    3、输出波形周期计算
    在这里插入图片描述

    三、输出正弦波

    1、计算需要生成点数

    需要2000Hz的正弦波,由上述公式计算得出需要生成1800个点。
    可用以下python代码生成采样点

    #! python3
    #coding=utf-8
    
    """
    Python版本:3.x
    外部库:matplotlib1.5.3、numpy1.11.2
    
    运行方式:
    在命令行中输入:python sinWave.py 
    
    运行结果:
    命令行中会打印计算得的各点数据,
    在当前目录下会生成py_dac_sinWav.c文件,包含上述数据,
    并且会弹出描绘曲线的对话框。
    """
    
    import matplotlib.pyplot as plt 
    import numpy as np
    import math
    
    #修改本变量可以更改点数,如16、32、64等
    POINT_NUM = 32
    
    pi = math.pi
    
    #一个周期 POINT_NUM 个点
    n = np.linspace(0,2*pi,POINT_NUM)
    
    #计算POINT_NUM个点的正弦值
    a = map(math.sin,n)
    
    r =[]
    for i in a:
        #调整幅值至在0~1区间
        i+=1       
        
        #按3.3V电压调整幅值
        i*= 3.3/2   
    
        #求取dac数值,12位dac LSB = 3.3V/2**12 
        ri = round(i*2**12/3.3) 
    
        #检查参数
        if ri >= 4095:
            ri = 4095
    
        #得到dac数值序列
        r.append( ri )
    
    
    print(list(map(int,r)))
    
    #写入序列到文件
    with open("py_dac_sinWav.c",'w',encoding= 'gb2312') as f:
        print(list(map(int,r)),file= f)
    
    #绘图
    plt.plot(n,r,"-o")
    plt.show()
    
    
    
    
    

    2、将生成的采样点放入dac.c文件的采样点数组
    在这里插入图片描述
    3、2000Hz正弦波形
    在这里插入图片描述

    四、输出音频

    1、生成音频数据

    • 使用AU软件编辑音频文件,截取3s-5s的音频,以8000Hz的采样率,生成16位的wav文件
      在这里插入图片描述
      在这里插入图片描述
      2、使用Uedit等工具打开生成的wav文件
      在这里插入图片描述
      3、选择中间数据区域的数据,保存在文本文件中,使用以下代码,增加前缀0x
    import re
    
    path=r'C:\Users\G3\Desktop\test.txt'	#文件路径
    t=re.compile(r'\d\d')
    file=open(path)	
    txt=file.read()
    print(file.read())
    file.close()
    test=t.findall(txt)
    
    file=open(path,'w')
    j=0
    for i in test:
        i=''.join(['0x',str(i),', '])
        if j == 16:
            j = 0
            file.write('\n')	#换行
        file.write(i)
        j = j + 1
    file.close()
    
    

    4、将转换好的内容复制到上面正弦波的数据数组中
    在这里插入图片描述
    5、音频波形
    在这里插入图片描述

    展开全文
  • DAC输出正弦波50hz.zip

    2020-07-27 16:06:46
    两种方式实现DAC输出正弦波,一种方法是构造正弦波数组表,另一种用函数的形式,第一种的数码表可用相应的软件生成,个人倾向于第二种,所以在程序中把第一种方法注释掉了
  • STM32L0系列DAC输出

    2019-01-26 16:22:32
    这是本人自己写的一个STM32L0系列的DAC输出电压程序,分享给大家参考,使用的HAL库
  • UART串口控制DAC输出

    2014-07-20 15:29:30
    在PC上用串口控制DAC输出的模拟电压值,用这个电压来驱动LED发光
  • STM32_HAL_多路DAC输出

    2018-10-18 18:55:03
    基于HAL库的多路DAC输出,以及PWM输出。CUBEMX生成库。
  • TP023-DAC输出正弦波实验.zip
  • STM32-DAC输出正玄波详解
  • 实验22 DMA实验-1K正弦波DAC输出.rar
  • STM32 DAC输出正弦波测试程序
  • Stm32 - keil5 - dac输出正弦波加adc多通道采集;Stm32 - keil5 - dac输出正弦波加adc多通道采集;Stm32 - keil5 - dac输出正弦波加adc多通道采集
  • 非均匀DAC输出电平可提高IM-DD OFDM系统的性能
  • 关于DAC 输出功率问题 目前有些客户会说我们的 DAC 输出功率调不大,即使用 EQ 把整体幅值拉大,也提不出需要的功率,遇到这 个问题点,需要注意如下的设置,这里包括 AC691 和 AC692 都要注意。如下截图箭头所指的...

    关于DAC 输出功率问题
    目前有些客户会说我们的 DAC 输出功率调不大,即使用 EQ 把整体幅值拉大,也提不出需要的功率,遇到这
    个问题点,需要注意如下的设置,这里包括 AC691 和 AC692 都要注意。如下截图箭头所指的地方范围是 0-7,0
    最小,7 最大,这里写为 7,芯片 DAC 输出最大的功率。
    DAC_VSEL 6 改为7

    展开全文
  • STM32F0xx_DAC输出电压配置详细过程 验证通过
  • 该例程用的stm32发03vc,keil5。有12路pwm,用pwm模拟dac输出电压的,不过如果不改变频率,只改变占空比,最高电压只有3.2V,已达到我的要求,就没用改变频率的部分
  • 在使用STM32F405的DAC过程中发现其DAC输出波形在低电压端似乎有问题。 本来想用DAC-DMA模拟出一段10KHZ方波出来,于是往DAC寄存器中循环输入0和100(DAC范围0到4096),结果DAC的输出波形并不是方波,而是在方波从高...
  • STM32DAC输出遇到的问题

    千次阅读 2018-12-05 11:19:02
    DATA:2018/12/05: ...提高DAC输出的驱动能力,DAC输出缓冲打卡,未测试,猜测效果会好转。 硬件:DAC输出端加电压跟随器,所有问题全部解决(加电压跟随器后还是不能输出0V)。 总结:DAC的输出能力可以使用软...
  • 本文介绍了一种无需精密电阻的DAC输出转换为单端信号的电路设计方案。
  • 单片机DAC输出方波简易实验 简易的DAC实验,想要输出方波,但是输出了的是一条直线。 改P0为端口P2 排查原因了解到是端口的问题 P0口:双向8位三态I/O口,每个口可独立控制。51单片机P0口内部没有上拉电阻,为高...
  • 13-STM32F1 DAC输出

    千次阅读 2018-01-23 15:21:46
    STM32F1 DAC输出 数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。 DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。 DAC工作在12位模式时,数据可以设置成左对齐或右对齐。 DAC模块有...
  • AC620FPGA学习笔记——DAC输出显示DAC输出显示硬件结构整体框架tlv5618a_devicetlv5618a_interface代码部分顶层代码 DAC输出显示 工程地址:...
  • 利用DSP实现ADC采集数据以及DAC输出

    万次阅读 2018-05-28 14:31:42
    1、 解决方案(必要的公式、文字等)在课外实验中,我们选择利用ADC对输入的信号进行采集,然后利用串口控制DAC的输出,实现通过串口控制DAC输出采集到的波形的功能。在本实验中,是通过判断串口发送的数据来实现对...
  • stm32DAC输出任意形状的波形 开发板:任意ST的nucler-64板子 软件:crubeMX KEIL 核心思想: 事先准备好一个数组,这个数组保存的是你要显示的波形,数组的成员大小是0-4095(DAC的精度可以最大到4095), 然后...
  • DAC输出正弦波和三角波,输出正弦波和三角波.txt
  • DAC 可以设置电流等级有 1-4 总共 4 个等级,正比例增大,数值越大,电流也越大,如果设置 电流小,可能音质达不到要求,这是可以适当提升 DAC 输出电流。
  • 基于STM32的DAC输出一、简介:1.1 pwm简介:二级目录三级目录 一、简介: 1.1 pwm简介: PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含...
  • 消除R-2R DAC输出干扰

    2020-08-01 01:43:28
    在上一篇 DAC 基础知识博文中,我们对高精度数模转换器 (DAC) 中的输出干扰源进行了探讨。若您希望在增加代码的过程中获得线性转换,那么这些输出脉冲可能会扰乱系统运行。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,705
精华内容 1,082
关键字:

dac输出