STMCU小助手
发布时间:2022-4-17 21:24
|
既然有模拟转数字的ADC模块,那么就必然有数字转模拟的DAC模块。顾名思义,该模块仅具有ADC的补充功能。它将数字二进制值转换为模拟电压输出。DAC模块具有多种用途,包括音频生成,波形生成等。通常在大多数8位微控制器中,此模块不可用,并且通过脉宽调制(PWM)可以稍微满足其需求。部分原因是由于它们的硬件资源和运行速度相对较低。所有STM32单片机都具有PWM模块,但大容量STM32也具有DAC模块。STM32DAC模块不是很复杂,并且在工作原理方面与ADC模块相似。0 Q( E% }4 T7 {2 `# O1 A1 s( f; S % w% G7 m! N2 ?/ @! v) R* h 01、DAC简介5 d9 n1 c4 _2 D) \( R/ C 从STM32F207数据手册看到,STM32F207具有两个DAC模块。; G) c- A- A- J' K1 I # L2 P8 t# t' p+ i/ U9 b7 K
每个DAC具有独立的通道,对应的GPIO分别为:PA4和PA5。对于GPIO的复用功能(Alternatefunctions)和附加功能(Additionalfunctions)。 ( S w8 z d3 `& \7 E 除了DAC输出的管脚,还有其他相关引脚
- r7 k" i( l, u( K( d% M/ y 注意:使能DAC 通道x 后,相应GPIO 引脚(PA4 或PA5)将自动连接到模拟转换器输出(DAC_OUTx)。为了避免寄生电流消耗,应首先将PA4 或PA5 引脚配置为模拟模式(AIN)。 . b0 {: O; S5 e0 [7 y" e! y3 x 下面的简化框图显示了STM32DAC模块的主要组件。1 N9 F' \( i% j( Y* I' q % ^/ y3 o. }2 Q L
# N( [/ U6 x* r6 I+ [ 02、DAC转换3 \% [' e6 v* q; ?; ]3 V5 \0 M 由框图可以看出,DAC受DORx寄存器直接控制的,但是不能直接往DORx寄存器写入数据,而是通过DHRx间接地传给DORx寄存器,实现对DAC的输出控制。+ }& i; X! ]9 \+ Y D $ Z) D! ~( Y. r) x! N( a 不能直接对寄存器DAC_DORx写入数据,任何输出到DAC通道x的数据都必须写入DAC_DHRx寄存器(数据实际写入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者DAC_DHR12RD寄存器)。 " C, |8 L4 [# N1 Z% \ W/ `& c/ p 1.如果没有选中硬件触发(寄存器DAC_CR1的TENx位置0),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx; 2.如果选中硬件触发(寄存器DAC_CR1的TENx位置1),数据传输在触发发生以后3个APB1时钟周期后完成。 一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间tSETTLING之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。8 Q9 S+ A* o9 f7 C0 H% ~ ! r: |6 c5 |; T3 P- R; L& J+ p" ?
+ z/ j) C3 `2 I$ ^+ A7 j5 u. M DAC控制寄存器(DAC_CR) DMAEN1:DAC通道1DMA使能(DAC channel1 DMA enable),我们不使用DMA,故设置为0* q6 A( L0 M Z9 A3 W MAMP1[3:0]:DAC通道1屏蔽/幅值选择器(DAC channel1 mask/amplitude selector)我们没有用到故这几位也设置为0 WAVE1[1:0]:DAC通道1噪声/三角波生成使能(DAC channel1 noise/triangle wave generationenable)我们也没用到故也设置为01 E# h* w' V8 m- f$ t. g TEN1:DAC通道1触发使能(DAC channel1 trigger enable)我们不用触发,所以设置为08 \% c3 _% q/ U ; I( U2 i3 P5 z# X& P, a1 ] TSEL1[2:0]:DAC通道1触发选择(DAC channel1 trigger selection)注意:该位只能在TEN1=1(DAC通道1触发使能)时设置。我们TEN1设为0,所以这几位就不用设置,默认为0! Y2 B0 ?! [5 l- P7 {7 b BOFF1:关闭DAC通道1输出缓存(DAC channel1 output buffer disable)我们关闭输出缓冲故设置为1 EN1:DAC通道1使能(DAC channel1 enable)我们要使能DAC通道、故设置为1。) n) ~2 j5 s! ^0 h! d8 o. C 1 [/ v/ Q5 X4 `( v6 t 03、功能说明3 _* y: i) j1 |: I9 @+ r9 O! e7 i STM32的DAC等效电路如下
- ?! {; v0 P* p& i) W 该电路中显示的输出缓冲器在内部3.3V电源上运行。与大多数运放在单电源(而不是+/-双电源)上运行一样,输出摆幅永远不会真正达到目标。但是,如电路所示,有两个内部开关(S1和S2)可通过寄存器控制。将它们都打开将通过两个串联的电阻(Ra和Rb)将“DACINT”信号直接连接到“DACOUT”引脚。作为参考,Ra+ Rb约为15k。 根据选择的配置模式,数据按照下文所述写入指定的寄存器: 单DAC通道x,有3种情况:+ W; b: |, b+ G' v# Q. x4 a8 H 1.8位数据右对齐:用户须将数据写入寄存器DAC_DHR8Rx[7:0]位(实际是存入寄存器DHRx[11:4]位);. D5 J% l. o& r+ r' m5 Y) ^) Y0 A# d 2.12位数据左对齐:用户须将数据写入寄存器DAC_DHR12Lx[15:4]位(实际是存入寄存器DHRx[11:0]位); ! P/ L2 _4 e$ I, p, o. I 3.12位数据右对齐:用户须将数据写入寄存器DAC_DHR12Rx[11:0]位(实际是存入寄存器DHRx[11:0]位)。2 v' b' B0 x3 ], Y6 s; Q% H 6 ~0 r- \/ u/ Q. S: b. d 一般采用第三种方式:12位数据右对齐比较多。 ; X# V% s; n& l! B 根据对DAC_DHRyyyx寄存器的操作,经过相应的移位后,写入的数据被转存到DHRx寄存器中(DHRx是内部的数据保存寄存器x)。随后,DHRx寄存器的内容或被自动地传送到DORx寄存器,或通过软件触发或外部事件触发被传送到DORx寄存器。4 c/ B" D' ~; P! ?5 y' T4 R
8 \% K! `' Y8 T5 R' {" W 双DAC通道,有3种情况:" A$ J2 J* K0 q# r8 b 1.8位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR8RD[7:0]位(实际是存入寄存器DHR1[11:4]位),将DAC通道2数据写入寄存器DAC_DHR8RD[15:8]位(实际是存入寄存器DHR2[11:4]位);- W$ f5 x3 x5 w) q5 g. r 1 E4 F: K. n; v0 j5 z- _ 2.12位数据左对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12LD[15:4]位(实际是存入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12LD[31:20]位(实际是存入寄存器DHR2[11:0]位); 1 \" g/ B) S/ Q9 G! V* z+ v 3.12位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12RD[11:0]位(实际是存入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12RD[27:16]位(实际是存入寄存器DHR2[11:0]位)。3 C; x5 z( G e3 G9 Y/ Q M7 v; a$ W/ f% A2 I$ H
04、DAC输出电压 当DAC的参考电压位VREF+的时候,数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。* C9 F% X" f3 y7 ~5 q0 w' A4 Q( R 任一DAC通道引脚上的输出电压满足下面的关系:1 G$ ?4 W+ a7 d9 I6 [# H; a DAC输出= VREF x (DOR / 4095)。 " g( n1 @6 O6 S7 ^: E8 R 注意:此时数据格式:应该选择12位数据右对齐。 05、代码配置 DAC配置1 Y/ Q, [! T. ]6 t 0 n6 i8 B& s+ \3 a$ I
设置输出电压# s. L1 t7 L t; D % |2 C$ e. O$ I8 Z
测试用例很简单,就是反复输出1.2V和3.0V电压
下载验证 4 F Y' O8 \0 U3 r- {8 ]
/ h* ?" \$ q0 c6 ^8 g0 Q |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版