
既然有模拟转数字的ADC模块,那么就必然有数字转模拟的DAC模块。顾名思义,该模块仅具有ADC的补充功能。它将数字二进制值转换为模拟电压输出。DAC模块具有多种用途,包括音频生成,波形生成等。通常在大多数8位微控制器中,此模块不可用,并且通过脉宽调制(PWM)可以稍微满足其需求。部分原因是由于它们的硬件资源和运行速度相对较低。所有STM32单片机都具有PWM模块,但大容量STM32也具有DAC模块。STM32DAC模块不是很复杂,并且在工作原理方面与ADC模块相似。$ R5 W- W9 ` d- J9 o6 ?# l 01、DAC简介4 K& {# F9 q, c- F1 M, P+ w$ U9 G" K; } 从STM32F207数据手册看到,STM32F207具有两个DAC模块。 ! k D8 R: G' i& g- Y" V( s# C5 k% y" [ ![]() 4 V& F. K5 r5 m, p1 Q 每个DAC具有独立的通道,对应的GPIO分别为:PA4和PA5。对于GPIO的复用功能(Alternatefunctions)和附加功能(Additionalfunctions)。+ D" t, l& p2 s7 j! Y7 r + a. v8 K2 o! z, B' {0 g' \2 Y3 V1 } 除了DAC输出的管脚,还有其他相关引脚 ![]() : V& ]$ g. H1 @' U- s 注意:使能DAC 通道x 后,相应GPIO 引脚(PA4 或PA5)将自动连接到模拟转换器输出(DAC_OUTx)。为了避免寄生电流消耗,应首先将PA4 或PA5 引脚配置为模拟模式(AIN)。* g9 R6 E" n7 a q( e( I! x 下面的简化框图显示了STM32DAC模块的主要组件。 ![]() 02、DAC转换 由框图可以看出,DAC受DORx寄存器直接控制的,但是不能直接往DORx寄存器写入数据,而是通过DHRx间接地传给DORx寄存器,实现对DAC的输出控制。: P8 K5 ~" J7 `# l / Q5 z- }. F! ]1 Q9 Z# _, i 不能直接对寄存器DAC_DORx写入数据,任何输出到DAC通道x的数据都必须写入DAC_DHRx寄存器(数据实际写入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者DAC_DHR12RD寄存器)。 1.如果没有选中硬件触发(寄存器DAC_CR1的TENx位置0),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx;# ^6 ]3 ^" p# @8 b 2.如果选中硬件触发(寄存器DAC_CR1的TENx位置1),数据传输在触发发生以后3个APB1时钟周期后完成。$ N& B' x, C. ~' R 一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间tSETTLING之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。 ![]() DAC控制寄存器(DAC_CR)$ ?+ K" f6 l* N7 }; d/ ? / J- V( ~* f( v+ a6 \; P2 } DMAEN1:DAC通道1DMA使能(DAC channel1 DMA enable),我们不使用DMA,故设置为05 q, b0 ~1 T+ t) Y; X+ ]4 L 9 j; i5 z$ l+ e3 C* }. `1 F6 f: V9 F MAMP1[3:0]:DAC通道1屏蔽/幅值选择器(DAC channel1 mask/amplitude selector)我们没有用到故这几位也设置为0: Y; ^' ]1 r* u WAVE1[1:0]:DAC通道1噪声/三角波生成使能(DAC channel1 noise/triangle wave generationenable)我们也没用到故也设置为01 u/ Y0 q- y! Y+ a1 o1 v5 _2 k; k TEN1:DAC通道1触发使能(DAC channel1 trigger enable)我们不用触发,所以设置为0 3 q0 r+ f8 r1 s5 e TSEL1[2:0]:DAC通道1触发选择(DAC channel1 trigger selection)注意:该位只能在TEN1=1(DAC通道1触发使能)时设置。我们TEN1设为0,所以这几位就不用设置,默认为0+ m0 l/ i4 Z& Z5 b# n9 F , R6 x9 a5 d8 E, T+ O BOFF1:关闭DAC通道1输出缓存(DAC channel1 output buffer disable)我们关闭输出缓冲故设置为1 EN1:DAC通道1使能(DAC channel1 enable)我们要使能DAC通道、故设置为1。% o2 K1 g- N+ c9 z! y, n7 E1 |; i 03、功能说明- c4 U$ i D: R% ^3 H: w# s) r STM32的DAC等效电路如下 ~8 u. a+ d7 L# i8 B ![]() 该电路中显示的输出缓冲器在内部3.3V电源上运行。与大多数运放在单电源(而不是+/-双电源)上运行一样,输出摆幅永远不会真正达到目标。但是,如电路所示,有两个内部开关(S1和S2)可通过寄存器控制。将它们都打开将通过两个串联的电阻(Ra和Rb)将“DACINT”信号直接连接到“DACOUT”引脚。作为参考,Ra+ Rb约为15k。 根据选择的配置模式,数据按照下文所述写入指定的寄存器: % G1 |, `; F& C! B 单DAC通道x,有3种情况:. n/ K8 E# d2 Q6 q/ S+ D% M/ b% X 0 ~1 Z$ ~0 ^* [2 _ 1.8位数据右对齐:用户须将数据写入寄存器DAC_DHR8Rx[7:0]位(实际是存入寄存器DHRx[11:4]位);1 n/ Z3 o# x* }8 \' H # a) ?% V+ m2 c+ ]$ a 2.12位数据左对齐:用户须将数据写入寄存器DAC_DHR12Lx[15:4]位(实际是存入寄存器DHRx[11:0]位);' Y0 A7 P! G8 E3 J6 p7 X 3.12位数据右对齐:用户须将数据写入寄存器DAC_DHR12Rx[11:0]位(实际是存入寄存器DHRx[11:0]位)。 b% h% l% h" h: v& c$ h) b- O6 M 一般采用第三种方式:12位数据右对齐比较多。) C2 l* H6 \* v5 `$ A" [ V& U 根据对DAC_DHRyyyx寄存器的操作,经过相应的移位后,写入的数据被转存到DHRx寄存器中(DHRx是内部的数据保存寄存器x)。随后,DHRx寄存器的内容或被自动地传送到DORx寄存器,或通过软件触发或外部事件触发被传送到DORx寄存器。& n+ Q, O0 s8 g8 S- U0 J # b" T! ]1 _" T; Y O6 t' h1 I ![]() 双DAC通道,有3种情况:" {$ H" s0 Z4 r' J; \; C2 t% x/ e# { 1.8位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR8RD[7:0]位(实际是存入寄存器DHR1[11:4]位),将DAC通道2数据写入寄存器DAC_DHR8RD[15:8]位(实际是存入寄存器DHR2[11:4]位); 2.12位数据左对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12LD[15:4]位(实际是存入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12LD[31:20]位(实际是存入寄存器DHR2[11:0]位);' l. }8 V0 N' o7 a/ W: ^# l 3.12位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12RD[11:0]位(实际是存入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12RD[27:16]位(实际是存入寄存器DHR2[11:0]位)。+ h. s4 h1 M' r9 t( n; B0 d ; U6 F/ }6 O* q- K6 u ![]() 04、DAC输出电压 当DAC的参考电压位VREF+的时候,数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。 任一DAC通道引脚上的输出电压满足下面的关系: % ~4 J; ]4 {9 H; ]$ c- H7 v DAC输出= VREF x (DOR / 4095)。 注意:此时数据格式:应该选择12位数据右对齐。; p3 w7 z. _5 {0 { 05、代码配置 DAC配置 / n5 u, ~. S B0 a9 o
设置输出电压0 M4 v% A% Y# \! n- x" K 1 W7 f& J3 e8 ?- r
测试用例很简单,就是反复输出1.2V和3.0V电压
下载验证/ I$ h* [0 g8 J- V8 J# ?9 { ![]() $ C6 r/ `" d; Y9 Q , J4 h, G: F0 J7 n! q , `4 J" Q3 y% v9 I |
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化