【STM32F103】DAC输出2khz正弦波和歌曲音频片段波形

一、STM32 DAC简介

数模转换器,又称D/A转换器,简称DAC,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它是把连续的模拟信号转变为离散的数字信号的器件。

STM32具有片上 DAC外设,它的分辨率可配置为 8位或 12位的数字输入信号,具有两个 DAC输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错检测能力,可外部触发。

DAC通道模块框图如下

在这里插入图片描述
专用定时器

除了通过软件和外部触发器触发 DAC 转换之外,还可以通过不同的定时器触发 DAC 转换。 TIM6 和 TIM7 是两个基本定时器,主要用于 DAC 触发。 每当 DAC 接口在所选的定时器触发输出 (TIMx_TRGO)上检测到上升沿时,DAC_DHRx 寄 存器中存储的最后一个数据即会转移到 DAC_DORx 寄存器中。

二、输出周期为2khz的正弦波

原理部分详情请自行阅读官方文档 STM32 DAC

准备数字模式的正弦波形
正弦波的采样举例:
在这里插入图片描述
采样间隔为 (2*PI)/ ns (采样数)。
sin(x) 的结果值在 -1 到 1 之间,经过必要的重新校准后,可以生成 0 和 0xFFF 之间(对应电压范围为 0 V 到 3.3 V)的正向正弦波。
在这里插入图片描述
经过线性转换后,数字输入会转换为 0 到 VREF+ 之间的输出电压。
各 DAC 通道引脚的模拟输出电压通过以下公式确定:
在这里插入图片描述
注: 对于右对齐的 12 位分辨率:DAC_MaxDigitalValue = 0xFFF
对于右对齐 8 位分辨率:DAC_MaxDigitalValue = 0xFF
因此,可通过以下公式得到模拟正弦波形 ySineAnalog
在这里插入图片描述
编写matlab脚本得到正弦波表

n = 2*pi/1800 : 2*pi/1800 : 2*pi      %分成1800等份

a = sin(n)+1;                     %求取sin函数值并向上平移一个单位,消除负数值
a = a * 3.3/2;                    %调整幅值,使范围限制为0~3.3   
r = a* (2.^12) /3.3               %求取dac数值,12位dac LSB = 3.3/2.^12 
r = uint16(r);                     %double型数据转化成16位整型数据 

for i = 1:1800                        
if r(i) > 4095                      %限制数据最大不超过4095
    r(i) = 4095
end
end 

plot(n,r,'.')                     %把这些点画出来 

复制得到的输出
在这里插入图片描述

替换工程中的波形数据
实验所用工程模板参考自野火资料——DAC输出正弦波
在bsp_dac.c文件中,将数据进行替换
在这里插入图片描述

烧录程序连接示波器,得到如下波形
在这里插入图片描述

三、截取音频片段转换为C文件进行输出

准备Audition软件,这里给出下载(pojieban)链接
链接:https://pan.baidu.com/s/1LLCUw5ZYvimub7AgyfWCVA
提取码:xnrv
截取片段
打开一首你喜欢的歌曲
选取你最喜欢的片段(不要太长,两秒不能再多)
在这里插入图片描述
保存时采样类型设置为8000hz,16位,保存为.wav格式
在这里插入图片描述
通过WavToC工具,将wav音频文件转为c语言代码程序

在这里插入图片描述
替换波形文件

这里波形文件太大还是会报错,再适当经行删减,注意前面的点数要与之相对应。但是也不能删太多,不然最后的波形很短一个。
在这里插入图片描述
编译并烧录
最后输出的波形如下所示
在这里插入图片描述
在这里插入图片描述

四、总结

随着嵌入式系统的学习持续深入,接触到了越来越多的技术,也越来越接近硬件层面。我也渐渐感受到,即使是在小小的单片机上可以做的事情也有很多,嵌入式技术不是在我之前的影响中那样只是编个程序点亮几个灯,在C语言之外还有很多之前没有接触的技术,但是这些技术都能编程进行控制,这大概也是嵌入式的学习思路。
经过这一年的嵌入式学习,我也只能说是入门,期待下学期的学习,继续努力吧。

五、参考

STM32F103使用TIM DMA DAC实现播放WAV音乐
官方文档DAC

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值