STM32-一文搞懂DAC

最新更新时间:2022-04-21来源: eefocus关键字:STM32  DAC  数字输入 手机看文章 扫描二维码
随时随地手机看文章

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。

如果使能了外部出发的方式,要在外部触发信号发生以后的3个APB1时钟周期后传到DOR。如下图所示


2.3 DAC输出电压

范围:0~Vref


关系:DAC输出 = Vref x (DOR / 4095)


DAC有一个输出缓存的功能,该功能可以加大IO口的输出驱动能力,但是有一个问题就是输出不能归零!不建议使用该功能。


2.4 噪声生成

骚操作。。生成噪声可还行!


STM32利用线性反馈以为寄存器(LFSR)产生噪声,如下图所示。了解该类寄存器产生噪声的原理点这里,还有这里。先不深入研究其原理,知道可以就行啦!

设置DAC_CR寄存器的WAVEx[1:0]位为’01’选择DAC噪声生成功能,每次触发事件后3个APB1时钟周期之后更新该寄存器的值。设置DAC_CR寄存器的MAMPx[3:0]位可以屏蔽部分或者全部LFSR寄存器的哪些位的数据。


无论是生成噪声还是接下来的生成三角波,DAC最终的输出数据是LSFR值与DAC_DHRx的数值相加,然后去掉溢出位。之后即被写入DAC_DORx寄存器。(后面关于三角波的图可以很形象地说明)


这样如果发生溢出,就可以除去一些直流部分(即DAC_DHRx里的数值部分)。


什么是去掉溢出位?


比如一个8位的数据,能表示的最大数位0xFF,再加1就变为0x00,这就叫去掉溢出位。因为0xFF+0x01=0x100,这里的最高位对八位数据来说就是溢出位,去掉之后就变为0x00。


注意:为了产生噪声或三角波,必须使能DAC触发(设CR寄存器的TENx位为1)。这是因为输出噪声或三角波不需要修改DHR寄存器的数值,就能修改DOR寄存器(由噪声算法电路或三角波计数器修改)而且修改是周期性的,所以必须通过触发的方式不断更新DA输出,一般使用定时器触发方式。


2.5 三角波生成

在DACx输出的直流信号的基础上可以添加三角波,设置WAVEx[1:0]位为’10’选择DAC的三角波生成功能。设置DAC_CR寄存器的MAMPx[3:0]位来选择三角波的幅度。

DACx模块内部有一个三角波计数器,每次触发事件之后3个APB1时钟周期后累加1。计数器的值与DAC_DHRx寄存器的数值相加并丢弃溢出位后写入DAC_DORx寄存器。在传入DAC_DORx寄存器的数值小于MAMP[3:0]位定义的最大幅度时,三角波计数器逐步累加。一旦达到设置的最大幅度,则计数器开始递减,达到0后再开始累加,周而复始。


注意:MAMP[3:0]位必须在使能DAC之前设置,否则其值不能修改。


2.6 双DAC通道

DAC支持双模块同时使用,且有双通道模式的专用数据寄存器(前文已经提到)。


双通道模式下可以有11种模式使用。

image.png

2.6.1 不使用波形发生器的独立触发

当发生DAC通道1触发事件时,(延迟3个APB1时钟周期后)寄存器DHR1的值传入寄存器DAC_DOR1。

当发生DAC通道2触发事件时,(延迟3个APB1时钟周期后)寄存器DHR2的值传入寄存器DAC_DOR2。


2.6.2 使用相同LFSR的独立触发

当发生DAC通道1触发事件时,具有相同屏蔽的LFSR1计数器值与DHR1寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR1,然后更新LFSR1计数器。

当发生DAC通道2触发事件时,具有相同屏蔽的LFSR2计数器值与DHR2寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR2,然后更新LFSR2计数器。


2.6.3 使用不同LFSR的独立触发

当发生DAC通道1触发事件时,按照MAMP1[3:0]所设屏蔽的LFSR1计数器值与DHR1寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR1,然后更新LFSR1计数器。

当发生DAC通道2触发事件时,按照MAMP2[3:0]所设屏蔽的LFSR2计数器值与DHR2寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR2,然后更新LFSR2计数器。


2.6.4 产生相同三角波的独立触发

当发生DAC通道1触发事件时,相同的三角波幅值加上DHR1寄存器的值,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR1,然后更新DAC通道1三角波计数器。

当发生DAC通道2触发事件时,相同的三角波幅值加上DHR2寄存器的值,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR2,然后更新DAC通道2三角波计数器。


2.6.5 产生不同三角波的独立触发

当发生DAC通道1触发事件时,MAMP1[3:0]所设的三角波幅值加上DHR1寄存器数值,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR1,然后更新DAC通道1三角波计数器。

当发生DAC通道2触发事件时,MAMP2[3:0]所设的三角波幅值加上DHR2寄存器数值,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR2,然后更新DAC通道2三角波计数器。


2.6.6 同时软件启动

在此配置下,一个APB1时钟周期后,DHR1和DHR2寄存器的数值即被分别传入DAC_DOR1和DAC_DOR2寄存器。


2.6.7 不使用波形发生器的同时触发

当发生触发事件时,(延迟3个APB1时钟周期后)DHR1和DHR2寄存器的数值分别传入DAC_DOR1和DAC_DOR2寄存器。


2.6.8 使用相同LFSR的同时触发

当发生触发事件时,MAMP1[3:0]所设屏蔽的LFSR1计数器值与DHR1寄存器的数值相加,(延迟3个APB1时钟周期后)结果传入DAC_DOR1寄存器,然后更新LFSR1计数器。

同样,MAMP1[3:0]所设屏蔽的LFSR2计数器值与DHR2寄存器的数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR2,然后更新LFSR2计数器。


2.6.9 使用不同LFSR的同时触发

当发生触发事件时,具有相同屏蔽的LFSR1计数器值与DHR1寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR1,然后更新LFSR1计数器。

同时,具有相同屏蔽的LFSR2计数器值与DHR2寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR2,然后更新LFSR2计数器。


2.6.10 使用相同三角波发生器的同时触发

当发生触发事件时,相同的三角波幅值与DHR1寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR1,然后更新LFSR1计数器。

同时,相同的三角波幅值与DHR2寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR2,然后更新LFSR2计数器。


2.6.11 使用不同三角波发生器的同时触发

当发生触发事件时,MAMP1[3:0]所设的三角波幅值与DHR1寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR1,然后更新LFSR1计数器。

同时,MAMP2[3:0]所设的三角波幅值与DHR2寄存器数值相加,(延迟3个APB1时钟周期后)结果传入寄存器DAC_DOR2,然后更新LFSR2计数器。


3 相关寄存器

3.1 DAC控制寄存器(DAC_CR)

该寄存器用于配置DAC1(低8位)和DAC2(高8位),这里仅说DAC1。

3.2 DAC软件触发寄存器(DAC_SWTRIGR)

控制DAC1和DAC2的软件触发。

另一个控制DAC2。


3.3 各种DHR数据寄存器

寄存器格式如2.1节的图片所示。共9个。


3.4 两个DOR数据寄存器

最终控制DAC输出的的寄存器。

————————————————

版权声明:本文为CSDN博主「BUG从入门到精通」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wei348144881/article/details/109295021


关键字:STM32  DAC  数字输入 编辑:什么鱼 引用地址:STM32-一文搞懂DAC

上一篇:STM32-快速上手DAC
下一篇:STM32-快速上手DMA

推荐阅读

ACM8625/ACM8628/ACM8622 I2S输入内置DSP数字功放IC系列助推音频产品升级迭代
引言随着科技地不断发展和进步,大家对音质听感上也有更高的追求,音乐能让生活充满激情也可以让紧张的心情得到放松,在生活中有很大的作用,是文化的延续。不管是听歌还是看电视,音响都起到了非常重要的作用。音响是将音频信号转换放大声音的一种设备。音响体内自带功率放大器,对音频信号进行放大处理后由音响本身放出声音,使声音放大,音响音质的好坏会直接影响音乐的品质。近几年越来越多的音频厂家选择从模拟输入功放升级到I2S数字功放,例如高性能Soundbar产品、大屏电视、车载音频、蓝牙音箱等,工程师越来越倾向于用数字功放。I2S输入数字功放芯片有以下优势:(1) 底噪超小。数字功放芯片因音频信号传输过程中不受干扰,底噪比模拟功放本身小很多。(2) 走
发表于 2022-11-23
ACM8625/ACM8628/ACM8622 I2S<font color='red'>输入</font>内置DSP<font color='red'>数字</font>功放IC系列助推音频产品升级迭代
STM32入门系列-开发工具keil5安装
主要介绍如下三部分内容:keil5软件获取keil5安装安装STM32芯片包软件获取可以通过搜索引擎搜索关键字“KEIL5下载”,找到其官方网站http://www.keil.com。我们这里使用MDK5.14版本,如果后面出了更高的版本选择性升级即可,不过也没有必要什么都追求最新的,这一个软件用着习惯就行。登录armkeil官方网站,网站首页有软件下载连接,在这里我们选择MDK-Arm。会让你先注册,注册完成之后就可以开始下载了。软件安装安装此软件时一定要注意以下几点:安装路径不能带中文,必须是英文路径。安装目录不能跟51的KEIL或者KEIL4冲突,三者目录必须分开。KEIL5的安装比起KEIL4多了一个步骤,必须添加芯片包,不
发表于 2022-11-18
<font color='red'>STM32</font>入门系列-开发工具keil5安装
STM32入门系列-存储器与寄存器介绍
介绍两部分内容:什么是存储器映射什么是寄存器及寄存器映射为了让大家对存储器与寄存器有一个更清楚的认识,并且为之后使用 C 语言来访问 STM32 寄存器内容打下基础。等明白了如何使用 C 语言封装底层寄存器,也就为后面学习库函数的开发做好了铺垫。什么是存储器映射程序存储器、数据存储器、寄存器和I/O端口排列在同一顺序的4GB地址空间内。这就是我们曾提到过的被控总线的连接部分,而编程时就是操作这一块地方。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 STM32F103ZET6 数据手册中存储器映射图如下所示。从上图中可以看到 ARM 把这 4GB 的存储
发表于 2022-11-18
STM32入门系列-GPIO概念介绍
GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过 GPIO 最简单的应用还属点亮 LED 灯了,只需通过软件控制 GPIO 输出高低电平即可。当然 GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。其中STM32F103xC、STM32F103xD和STM32F103xE有144个引脚的芯片如下图所示。那么是不是所有引脚都是 GPIO 呢?当然不是,STM32 引脚可以分为这么几大类:电源引脚:引脚图中的 VDD、V
发表于 2022-11-18
STM32入门系列-GPIO结构
已经了解了STM32 GPIO的基本概念及引脚分类。现在来看下STM32 GPIO内部的结构是怎样的。IO端口位的基本结构如下图所示。从图中可以看出GPIO内部结构还是比较复杂的,只要将这张GPIO结构图理解好,那么关于GPIO的各种应用模式将非常清楚。图中最右端I/O端口就是STM32芯片的引脚,其它部分都在STM32芯片内部。上图中我们将每部分都用红色数字标号了,按照顺序我们逐一讲解。保护二极管引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD_FT或VDD时,上方的二极管导通吸收这个高电压,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。尽管STM32芯片内部有
发表于 2022-11-18
<font color='red'>STM32</font>入门系列-GPIO结构
STM32入门系列-创建寄存器模板
介绍如何使用 KEIL5 软件创建寄存器模板, 方便之后使用寄存器方式来操作STM32开发板上的LED,让大家创建属于自己的寄存器工程模板。获取工程模板的基础文件首先我们在电脑任意位置创建一个文件夹,命名为“寄存器模板创建”,然后在其下面新建 2 个文件夹,如下:Obj 文件夹: 用于存放编译产生的 c/汇编/链接的列表清单、 调试信息、hex文件、预览信息、封装库等文件。User 文件夹: 用于存放用户编写的 main.c、 STM32F1 启动文件、stm32f10x.h头文件。我们需要将寄存器工程模板所需的基础文件 main.c、STM32F1 启动文件及stm32f10x.h 头文件放入到 User 文件夹内。在工程实例的U
发表于 2022-11-18
<font color='red'>STM32</font>入门系列-创建寄存器模板

推荐帖子

电流、电动势与电压
一、电流带电离子有次序的移动就是电流。所带电荷的多少就叫电量,用字母Q表示。单位是库仑,6.24×1,000,000,000,000,000,000个电子所具有的电量等于1库仑。单位时间内通过导线横截面的电量称为电流强度,用符号“I”或“i”表示。如果电流的大小和方向都不随时间而变化,称为恒定电流,简称直流。(DC)如果电流的方向均随时间变化,称为交流,简称交流(AC)显然,对恒定电流而言,电流强度I可用下式表示:I=Q/tt为时间,Q为这段时间内通过导线横截面的电量。
zdr 单片机
程序是如何通过BSL下载到单片机内部的?具体过程是啥样?
程序是如何通过BSL下载到单片机内部的?具体过程是啥样?求大神解答 程序是如何通过BSL下载到单片机内部的?具体过程是啥样?
王一天 微控制器 MCU
GaAs多频段数控0-360度移相器
本文介绍了一种可以复盖1JI-},L,S和C波段的GaAs单片有源移相器.该装里与一个900混合藕合电路结合、能产生以11.25阶跃的,从0-90的相移,窄波段使用时,数控相移误差在20以内,而在频率从1^-8GHz内改变相位时,最大相位误差不大于5dB。最大幅度变化不大于2.5dB,芯片尺寸为45X45X20密耳.文中讨论了多波段、多倍孩程移相器的应用GaAs多频段数控0-360度移相器
JasonYoo 模拟电子
两个电压相同的电源模块并联问题?
手头上有两个3.3V-1W的隔离模块电源,因为需要带一个3.3V供电的LCD和一个单片机单子,但是LCD功率加板子的功率大于1W。所以想用一个模块单独给LCD供电,一个模块给3.3V的板子。板子的GPIO和LCD的接口直接相连。但是总是觉得有什么问题?请各位高手给分析一下。 两个电压相同的电源模块并联问题?
bigbat 电源技术
【转帖】掌握这五大方法, 让你的MCU轻松低功耗
低功耗是MCU的一项非常重要的指标,比如某些可穿戴的设备,其携带的电量有限,如果整个电路消耗的电量特别大的话,就会经常出现电量不足的情况,影响用户体验。平时我们在做产品的时候,基本的功能实现很简单,但只要涉及低功耗的问题就比较棘手了,比如某些可以低到微安级的MCU,而自己设计的低功耗怎么测都是毫安级的,电流竟然能够高出标准几百到上千倍,遇到这种情况千万不要怕,只要认真你就赢了。下边咱们仔细分析一下这其中的原因。第一条:掐断外设命脉——关闭外设时钟先说最直观的,也是工程师都比较注意的方面,就是关闭
皇华Ameya360 电源技术
学Verilog时候的错题合辑
Verilog错题合辑(1)1.Always语句错误 always@(posedgesclkornss)❌ always@(posedgesclkorposedgenss)✔ 在always语句里不能既用posedge这种沿触发,又用nss这种电平触发,修改nss为沿触发即可。2.寄存器变量的使用 always@(temp_reg)b
xutong FPGA/CPLD
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved