所谓DAC,就是数(Digital)模(Analog)转换,将数字信号转换为模拟信号。骚气的是STM32竟然还能输出噪声和三角波,必须得试试!
目录
1 STM32的DAC概述
STM32的DAC模块是12位数字输入,电压输出的数字/模拟转换器,2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。DAC模块在APB1时钟下!
注意:STM32的DAC模块只存在于大容量产品中(FLASH容量在256K~512K之间的)。
1.1 主要特性
- 2个DAC转换器:每个转换器对应1个输出通道
- 8位或者12位单调输出
- 12位模式下数据左对齐或者右对齐
- 同步更新功能
- 噪声波形生成
- 三角波形生成
- 双DAC通道同时或者分别转换
- 每个通道都有DMA功能
- 外部触发转换
- 输入参考电压VREF+
1.2 框图
单个DAC的框图如下:
主要分为以下部分:
电源和参考电压、输出、触发源、控制寄存器(对应白色)、数据寄存器DHR、数模转换单元。
电源引脚在《STM32-一文搞懂ADC》部分已经有介绍了。
输出也没什么好说的,需要注意的是,一旦使能DACx通道,相应的GPIO引脚(PA4或者PA5)就会自动与DAC的模拟输出相连
(DAC_OUTx)。DAC1和DAC2模块的输出引脚分是PA4、PA5。为避免寄生的干扰和额外的功耗,使用DAC功能时,相应的引脚应当设置成模拟输入(AIN)。
触发源主要如下如果TENx位被置1,DAC转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制位TSELx[2:0]可以选择8个触发事件之一触发DAC转换。
所谓触发是指将数据寄存器DORx中的数据转换成模拟信号输出的信号。简单的来说就是刷新输出的信号,因为DOR数据寄存器中的数据更新后并不会立马进行转换,而是要等到触发信号之后才能转换。
触发可以选择为:
(1)不使用触发方式,这种方式下,只在向DAC数据寄存器DHR写入数据之后,DAC转化模块自动转换一次。
(2)软件触发方式,这种方式下,向软件触发寄存器SWTRIGR中写入命令时触发转换,也就是将DOR寄存器中的数据进行转换。
(3)外部触发方式。
(3.1)定时器触发,这是一种周期性的触发方式,也就是周期性刷新方式。那什么时候会用到这种方式呢?复杂波形!比如输出三角波。后面会说到,三角波的数据生成是由一个单独的计数器往复加减生成的,每次触发之后该计数器会加1/减1。试想,如果我们通过定时器来进行触发使其输出幅度以固定时间间隔增减,再设定了这个计数器的最大值,不就可以生成一定频率的三角波了吗?
(3.2)外部中断EXTI线触发,主要用于外部信号控制DAC转换。
控制寄存器主要对通道x进行配置,如DMA使能、噪声/三角波生成、触发源选择、通道x触发使能等等。后文详述。
数据寄存器DHR共有9个,但本质上是用于存放输出DAC的数据的,这里的数据会在适当的时候传入ODR寄存器进而进行DA输出。
数模转换单元,将数据寄存器中的数据加载到DOR寄存器中,并进行DA转换。
DAC 输出是受 DORx 寄存器直接控制的,但是我们不能直接往 DORx寄存器写入数据,而是通过 DHRx 间接的传给 DORx 寄存器,实现对 DAC 输出的控制。
2 功能详解
2.1 DAC数据格式
具有双DAC模块的STM32产品,其DAC模块有9个数据寄存器(DHR)!其中单通道模式下DAC1好DAC2分别独立使用三个,双通道模式下也有3个寄存器。
单通道模式下的三种数据格式,包括8位右对齐、12位左对齐、12位右对齐。如下图所示
双通道模式下的三种数据格式,同样是8位右对齐、12位左对齐、13位右对齐。如下图所示
2.2 数据寄存器DHR和DOR的关系
数据寄存器DHR是面向开发的寄存器,可以直接写入数据,该数据就是输出到相应的DAC通道的数据。
数据寄存器DOR是直接控制DAC数据输出的寄存器,不能直接对该寄存器写入数据,该寄存器的数据由数据寄存器DHR传入。
如果没有使能外部触发的方式输出DAC,存入寄存器DHR的数据会在一个APB1时钟周期后自动传至DOR。