STM32F1与STM32CubeIDE快速入门DAC概述
STM32F1与STM32CubeIDE快速入门-DAC概述
DAC概述
1、什么是DAC
DAC(数模)转换器是一种电子电路,它以数字或数值作为输入,并将其转换为模拟电压,该电压电平对应于 DAC 输出寄存器中的二进制数。 每当您更改 DAC 输出寄存器值时,DAC 输出电压就会发生变化,并且可以通过多种方式触发此采样过程,我们将在下文中看到。
DAC 执行与 ADC 相反的操作,而 ADC (A/D) 将模拟电压转换为数字数据,而 DAC (D/A) 将数字数字转换为输出引脚上的模拟电压。

并非所有微控制器都带有片上 DAC 外设,这就是为什么需要通常使用外部 DAC IC 或执行一些技术,如 PWM 到 DAC 转换,这在后面的文章中看到。
2、STM32中的DAC
DAC模块是一个12位电压输出数模转换器。 DAC可配置为8位或12位模式,并可与DMA控制器结合使用。在12位模式下,数据可以左对齐或右对齐。 DAC有两个输出通道,每个通道都有自己的转换器。在双 DAC 通道模式下,当两个通道组合在一起进行同步更新操作时,转换可以独立完成或同时完成。输入参考引脚
V
R
E
F
+
V_{REF+}
VREF+(与 ADC 共用)可用于获得更好的分辨率。
DAC的主要特性如下:
- 两个 DAC 转换器:每个一个输出通道
- 12 位模式下的左或右数据对齐
- 同步更新能力
- 噪声波的产生
- 三角波生成
- 双 DAC 通道独立或同时转换
- 每个通道的 DMA 功能
- 转换的外部触发器
- 输入电压参考 VREF+
DAC通道框图如下:

DAC 包括多达两个独立的输出通道。 每个输出通道都可以连接到片上外设,例如比较器、运算放大器和 ADC(如果可用)。 在这种情况下,可以将 DAC 输出通道与 DAC_OUTx 输出引脚断开,相应的 GPIO 可以用于其他目的。 DAC 输出可以缓冲或不缓冲。
1)DAC通道使能
每个 DAC 通道都可以通过在 DAC_CR 寄存器中设置其相应的 ENx 位来上电。 然后在
t
W
A
K
E
U
P
t_{WAKEUP}
tWAKEUP 启动时间后启用 DAC 通道。
注意:ENx 位仅启用模拟 DAC Channelx 宏单元。 即使 ENx 位复位,DAC Channelx 数字接口也会启用。
2)DAC 输出缓冲器使能
DAC 集成了两个输出缓冲器,可用于降低输出阻抗,并可直接驱动外部负载,无需添加外部运算放大器。每个 DAC 通道输出缓冲器可使用 DAC_CR 寄存器中的相应 BOFFx 位启用和禁用。
3)DAC 数据格式
根据所选的配置模式,数据必须写入指定的寄存器,如下所述:
单DAC通道
有以下三种情况:
- 8 位右对齐:软件必须将数据加载到 DAC_DHR8Rx[7:0] 位(存储到 DHRx[11:4] 位)
- 12 位左对齐:软件必须将数据加载到 DAC_DHR12Lx [15:4] 位(存储到 DHRx[11:0] 位)
- 12 位右对齐:软件必须将数据加载到 DAC_DHR12Rx [11:0] 位(存储到 DHRx[11:0] 位)
加载的 DAC_DHRyyyx 智能判断,用户写入的数据被取出并存储到相应的 DHRx(保持敏感 x,它们是内部非本地磁性的)。然后 DHRx 判断通过软件触发或外部事件自动触发自动加载到 DORx 中。

双DAC通道,有3种情况:
- 8 位右对齐:DAC 通道 1 的数据加载到 DAC_DHR8RD [7:0] 位(存储到 DHR1[11:4] 位)和 DAC 通道 2 的数据加载到DAC_DHR8RD [15:8] 位( 存储到 DHR2[11:4] 位)
- 12 位左对齐:DAC 通道 1 的数据加载到 DAC_DHR12LD[15:4] 位(存储到 DHR1[11:0] 位)和 DAC 通道 2 的数据加载到DAC_DHR12LD [31:20] 位( 存储到 DHR2[11:0] 位)
- 12 位右对齐:DAC 通道 1 的数据加载到 DAC_DHR12RD[11:0] 位(存储到 DHR1[11:0] 位)和 DAC 通道 2 的数据加载到DAC_DHR12RD [27:16] 位( 存储到 DHR2[11:0] 位)
根据加载的 DAC_DHRyyyD 寄存器,用户写入的数据将被移位并存储到 DHR1 和 DHR2(数据保持寄存器,即内部非存储器映射寄存器)中。然后 DHR1 和 DHR2 寄存器将被加载到 DOR1 和 DOR2 分别通过软件触发或外部事件触发自动注册。

4)DAC 转换
DAC_DORx 不能直接写入,任何到 DAC 通道 x 的数据传输都必须通过加载 DAC_DHRx 寄存器来执行(写入 DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD 或 DAC_DHR12LD)。
如果未选择硬件触发(DAC_CR 寄存器中的 TENx 位复位),则存储在 DAC_DHRx 寄存器中的数据会在一个 APB1 时钟周期后自动传输到 DAC_DORx 寄存器。然而,当硬件触发器(DAC_CR寄存器中的TENx位被设置)被选择并且触发发生,传输在三个 APB1 时钟周期后执行。
DAC_DORx 加载 DAC_DHRx 内容时,模拟输出电压在
t
S
E
T
T
L
I
N
G
t_{SETTLING}
tSETTLING 时间后变为可用,这取决于电源电压和模拟输出负载。

5)DAC输出电压
数字输入通过 0 和
V
R
E
F
+
V_{REF+}
VREF+ 之间的线性转换转换为输出电压。每个 DAC 通道引脚上的模拟输出电压由以下公式确定:

6)DAC触发选择
如果 TENx 控制位被设置,则转换可由外部事件(定时器计数器、外部中断线)触发。 TSELx[2:0] 控制位确定 8 个可能事件中的哪一个将触发转换,如下表所示:

每次 DAC 接口检测到所选定时器 TRGO 输出或所选外部中断线 9 上的上升沿时,存储在 DAC_DHRx 寄存器中的最后数据将传输到 DAC_DORx 寄存器中。 DAC_DORx 寄存器在触发发生后三个 APB1 周期更新。
如果选择软件触发,一旦 SWTRIG 位被设置,转换就会开始。一旦 DAC_DORx 寄存器加载了 DAC_DHRx 寄存器的内容,SWTRIG 就会被硬件复位。
注意:当设置 ENx 位时,不能更改 TSELx[2:0] 位。当选择软件触发器时,DAC_DHRx到DAC_DORx 寄存器传输只需要一个APB1时钟周期。
7)DMA请求
每个 DAC 通道都具有 DMA 功能。 两个 DMA 通道用于服务 DAC 通道 DMA 请求。
当 DMAENx 位被设置时发生外部触发(但不是软件触发)时,会生成 DAC DMA 请求。 然后将 DAC_DHRx 寄存器的值传输到 DAC_DORx 寄存器。
在双模式下,如果两个 DMAENx 位都置位,则会生成两个 DMA 请求。 如果只需要一个 DMA 请求,您应该只设置相应的 DMAENx 位。 通过这种方式,应用程序可以通过使用一个 DMA 请求和唯一的 DMA 通道在双模式下管理两个 DAC 通道。
DAC DMA 请求不排队,因此如果第二个外部触发器在最后一个请求的确认之前到达,则新请求将不会得到服务并且不会报告错误。
8)DMA 欠载
DAC DMA 请求未排队,因此如果第二个外部触发在收到第一个外部触发的确认(第一个请求)之前到达,则不会发出新的请求,并且 DAC_SR 寄存器中的 DMA channelx 欠载标志 DMAUDRx 被设置, 报告错误情况。 DAC channelx 继续转换旧数据。
软件应通过写 1 清除 DMAUDRx 标志,清除所用 DMA 流的 DMAEN 位,并重新初始化 DMA 和 DAC 通道 x 以正确重新启动传输。 软件应修改 DAC 触发转换频率或减轻 DMA 工作负载,以避免新的 DMA 欠载。 最后,可以通过启用 DMA 数据传输和转换触发来恢复 DAC 转换。
9)噪声产生
为了产生可变幅度的伪噪声,可以使用 LFSR(线性反馈移位寄存器)。 通过将 WAVEx[1:0] 设置为 01”来选择 DAC 噪声生成。 LFSR 中的预加载值为 0xAAA。 根据特定的计算算法,在每次触发事件后的三个 APB1 时钟周期更新该寄存器。

10)DAC 通道操作模式
每个 DAC 通道都可以配置为正常模式或采样保持模式。 可以启用输出缓冲器以实现高驱动能力。 在使能输出缓冲器之前,需要校准电压偏移。 此校准在工厂执行(复位后加载),并可在应用程序运行期间通过软件进行调整。
正常模式(Normal Mode)
在正常模式下,通过更改缓冲器状态和更改 DAC_OUTx 引脚互连,有四种组合。
要启用输出缓冲器,DAC_MCR 寄存器中的 MODEx[2:0] 位应为:
- 000:DAC 连接到外部引脚
- 001:DAC 连接到外部引脚和片上外围设备
要禁用输出缓冲器,DAC_MCR 寄存器中的 MODEx[2:0] 位应为:
- 010:DAC连接到外部引脚
- 011:DAC连接片上外设
**采样保持模式(Sample And Hold Mode)
在采样和保持模式下,DAC 内核在触发转换时转换数据,然后将转换后的电压保持在电容器上。 不转换时,DAC 内核和缓冲器在采样之间完全关闭,DAC 输出为三态,因此降低了整体功耗。 在每次新转换之前需要一个新的稳定期,其值取决于缓冲状态。
在此模式下,除 APB1 时钟外,DAC 内核以及所有相应的逻辑和寄存器都由低速时钟 (LSI) 驱动,从而允许在停止模式等深度低功耗模式下使用 DAC 通道。
11)外部触发器上的 DAC 转换
如果 TENx 控制位被设置,则转换可由
外部事件(定时器计数器、外部中断线)触发。 TSELx[2:0] 控制位确定 8 个可能事件中的哪个将触发转换。
每次 DAC 接口检测到所选触发源的上升沿时,存储在 DAC_DHRx 寄存器中的最后一个数据都会传输到 DAC_DORx 寄存器中。 DAC_DORx 寄存器在触发发生后三个 APB1 周期更新。
如果选择软件触发,一旦设置 SWTRIG 位,转换就开始。 一旦 DAC_DORx 寄存器加载了 DAC_DHRx 寄存器内容,SWTRIG 就由硬件复位。
12)DAC 校准
N 位数模转换器 (DAC) 的传递函数为:

其中
V
O
U
T
V_{OUT}
VOUT 是模拟输出,D 是数字输入,G 是增益,Vref 是标称满量程电压,Vos 是偏移电压。 对于理想的 DAC 通道,G = 1 且 Vos = 0。
由于输出缓冲器特性,电压偏移可能因器件而异,并在模拟输出上引入绝对偏移误差。 为了补偿 Vos,需要通过微调技术进行校准。 校准仅在 DAC 通道 x 在启用缓冲器的情况下运行时有效(MODEx[2:0] = 000b 或 001b 或 100b 或 101b)。 如果在缓冲区关闭时应用于其他模式,则无效。 校准期间:
- 缓冲器输出将从引脚内部/外部连接断开并置于三态模式 (HiZ),
- 缓冲器将充当比较器,感测中间代码值 0x800 并通过内部桥将其与 VREF+/2 信号进行比较,然后根据比较结果(CAL_FLAGx 位)将其输出信号切换为 0 或 1
提供了两种校准技术:
- 工厂调整:(始终启用)DAC 缓冲器偏移在工厂调整。 DAC_CCR 寄存器中 OTRIMx[4:0] 位的默认值是出厂调整值,一旦 DAC 数字接口复位就会加载。
- 用户微调:当工作条件与标称工厂微调条件不同时,尤其是当 VDD/VDDA 电压、温度、VREF+ 值发生变化时,可以进行用户微调,并且可以在应用过程中的任何时候通过软件进行。
STM32 HAL 确实在 DAC API 中提供了一个专门用于启动校准过程的功能,并且如前所述,这是在系统上电时初始化 DAC 硬件之后的推荐步骤,以防的操作条件与标称出厂设置不同。 否则,可以使用出厂校准设置。
13)DAC 分辨率、参考、公式
DAC 分辨率
STM32 DAC 的分辨率为 12 位,也可以配置为 8 位。 根据的应用程序,可以在两个选项之间进行选择,显然 12 位分辨率非常适合音频应用程序。
DAC 参考电压
DAC 参考电压可配置为来自外部引脚或使用内部 VREFBUF 模块在内部提供。 为 DAC 操作选择的参考电压将定义最大允许电压摆幅以及输出电压分辨率。
DAC 公式
DAC 输出电压在前面已经介绍,在这里不再做描述。
14)DAC中断
在 DAC DMA 欠载条件下只能触发一个中断信号。

15)DAC 速度(采样率)
输出缓冲效应和输出阻抗、电容
当在 DAC 输出上启用输出缓冲器时,速度由输出缓冲器性能指定。 该数字在产品数据表中的 Tsettling 或 Update rate 中指明。
当输出缓冲器禁用时,输出信号速度仅遵循 RC 常数,该常数由 DAC 输出阻抗 RDAC (= 2 x Ra) 和 DAC_OUT 焊盘上的容性负载决定。
例如,STM32F407 将缓冲器关闭时的阻抗输出定义为最大值 15 kΩ。 如果考虑 10 pF 容性负载(包括 STM32F407 器件在 DAC_OUT 焊盘上的寄生电容),要获得最终值的 ±1 LSB(从最低代码到最高代码),我们有:

求解 T 得到
T
C
R
×
N
×
l
n
(
2
)
0.693
×
R
C
×
N
1.8
µ
s
T = CR \times N \times ln(2) = 0.693 \times RC \times N = 1.8 µs
T=CR×N×ln(2)=0.693×RC×N=1.8µs,因此,在此配置中,转换时间不能小于 1.8 µs(相当于 555 kHz 的频率)。 该分析不包括 DAC 本身的开关速度及其瞬态的任何影响。 在使用高速时,这些因素不可忽视,它们会降低性能。
数字数据更新率
STM32 DAC输出数据需要写入DAC保持寄存器(DHR),然后数据移动到DAC输出寄存器(DOR)进行转换。 通常,数据保存在RAM中,CPU负责将数据从RAM传输到DAC。
使用 DMA 时,通过释放内核来提高系统的整体性能。 这是因为数据通过 DMA 从内存移动到 DAC,无需 CPU 执行任何操作。 这可以为其他操作保留 CPU 资源。 DAC 转换的触发可以由软件、外部触发器或定时器来完成。 对于高速转换情况,建议将定时器触发与 DMA 完成的数据传输结合使用。
- 从存储器到 DAC 的传输速度受多种因素的限制,其中包括:
- APB 或 AHB(DAC 时钟)的时钟周期从内存到 DAC 的 DMA 传输周期(包括 AHB 到 APB 桥接器)
- 触发机制本身

文章来源: https://iotsmart.blog.csdn.net/article/details/123522650