一、DAC简介
-
DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计 算机处理完成后,再由 DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器 件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。
-
STM32具有片上 DAC外设,它的分辨率可配置为 8位或 12位的数字输入信号,具有两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错检测能力,可外部触发。
-
功能框图:
-
DAC通道模块:
- 图中
VDDA
和VSSA
为DAC 模块模拟部分的供电,而Vref+
则是 DAC 模块的参考电压。DAC_OUTx
就是 DAC的输出通道(DAC_OUT1
对应PA4 ,DAC_OUT2 PA5
引脚)。当 DAC 的参考电压为Vref+
的时候,DAC 的输出电压是线性的从0~Vref+
,12 位模式下 DAC 输出电压与Vref+
以及DORx
的计算公式如下: DACx 输出电压=Vref*(DORx/4095)- DAC的控制寄存器
DAC_CR
的低 16 位用于控制通道 1,而高 16 位用于控制通道 2。- DAC 输出是受
DORx
寄存器直接控制的,但是DORx
寄存器不能被直接写入数据,而是通过DHRx
间接的传给DORx
寄存器,实现对 DAC 输出的控制。前面我们提到,STM32F4
的 DAC 支持 8/12 位模式,8 位模式的时候是固定的右对齐的,而 12 位模式又可以设置左对齐/右对齐。
单 DAC 通道 x,总共有 3 种情况:
① 8 位数据右对齐:用户将数据写入DAC_DHR8Rx
[7:0]位(实际存入 DHRx[11:4]位)。
② 12 位数据左对齐:用户将数据写入DAC_DHR12Lx
[15:4]位(实际存入 DHRx[11:0]位)。
③ 12 位数据右对齐:用户将数据写入DAC_DHR12Rx
[11:0]位(实际存入 DHRx[11:0]位)。STM32F4
的 DAC集成了两个输出缓存器,通过DAC_CR
的BOFFx位控制,可使能或禁止各通道的输出缓冲器,但做的有些不好,如果使能的话,虽然输出能力强一点,但是输出没法到 0,在不使用输出缓存时可设置该位为 1。
二、输出周期为2kHz的正弦波
1.打开DAC\Project\RVMDK(uv5)\BH-STM32
,找到如下函数:
2.通过如下公式计算出,周期频率位为2kHz大约需要采集1800个点:
3.找到.m文件,用matlab
打开,对代码进行修改:
4.运行:
5.将dac_sinWave
中的数据复制到uint16_t Sine12bit
,周期32改成3600:
6.编译,成功后烧录到板子上,连接示波器,通过调频得到结果:
三、音频信号输出
1.通过 Adobe Audition 截取生成一段音频文件,打开AU,在文件里打开下载的歌曲:
2.设置参数,然后导出:
3.通过WavToC工具,将wav音频文件转为c语言代码程序:
4.将生成的数据替换工程中的波形数据:
5.烧录程序,通过示波器显示: