历史上的今天
返回首页

历史上的今天

今天是:2024年12月07日(星期六)

2021年12月07日 | STM32学习笔记13——DAC

2021-12-07 来源:eefocus

DAC 简介

DAC 模块是 12 位电压输出数模转换器。DAC 可以按 8 位或 12 位模式进行配置,并且可与 DMA 控制器配合使用。在 12 位模式下,数据可以采用左对齐或右对齐。DAC 有两个输出 通道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当 两个通道组合在一起同步执行更新操作时,也可以同时进行转换。可通过一个输入参考电压引脚 VREF+ (与 ADC 共享)来提高分辨率。


DAC 主要特性

● 两个 DAC 转换器:各对应一个输出通道

● 12 位模式下数据采用左对齐或右对齐

● 同步更新功能

● 生成噪声波

● 生成三角波

● DAC 双通道单独或同时转换

● 每个通道都具有 DMA 功能

● DMA 下溢错误检测

● 通过外部触发信号进行转换

● 输入参考电压 VREF+

DAC通道框图

DAC引脚

DAC引脚

DAC功能说明

DAC 通道使能

将 DAC_CR 寄存器中的相应 ENx 位置 1,即可接通对应 DAC 通道。经过一段启动时间 tWAKEUP 后,DAC 通道被真正使能。

注意:ENx 位只会使能模拟 DAC Channelx 宏单元。即使 ENx 位复位,DAC Channelx 数字接口仍 处于使能状态。

DAC 输出缓冲器使能

DAC 集成了两个输出缓冲器,可用来降低输出阻抗并在不增加外部运算放大器的情况下直接 驱动外部负载。通过 DAC_CR 寄存器中的相应 BOFFx 位,可使能或禁止各 DAC 通道输出 缓冲器。

DAC 数据格式

根据所选配置模式,数据必须按如下方式写入指定寄存器:

● 对于 DAC 单通道 x,有三种可能的方式:

— 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 双通道,有三种可能的方式:

— 8 位右对齐:将 DAC 1 通道的数据加载到 DAC_DHR8RD [7:0] 位(存储到

DHR1[11:4] 位),将 DAC 2 通道的数据加载到 DAC_DHR8RD [15:8] 位(存储到

DHR2[11:4] 位)

— 12 位左对齐:将 DAC 1 通道的数据加载到 DAC_DHR12RD [15:4] 位(存储到

DHR1[11:0] 位),将 DAC 2 通道的数据加载到 DAC_DHR12RD [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 寄存器。

DAC双通道模式

DAC 转换

DAC_DORx 无法直接写入,任何数据都必须通过加载 DAC_DHRx 寄存器(写入 DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD 或 DAC_DHR12LD)才能传输到 DAC 通道 x。

如果未选择硬件触发(DAC_CR 寄存器中的 TENx 位复位),那么经过一个 APB1 时钟周 期后,DAC_DHRx 寄存器中存储的数据将自动转移到 DAC_DORx 寄存器。但是,如果选 择硬件触发(置位 DAC_CR 寄存器中的 TENx 位)且触发条件到来,将在三个 APB1 时钟 周期后进行转移。

当 DAC_DORx 加载了 DAC_DHRx 内容时,模拟输出电压将在一段时间 tSETTLING 后可用, 具体时间取决于电源电压和模拟输出负载。

TEN=0的转换时序

DAC 输出电压

经过线性转换后,数字输入会转换为 0 到 VREF+ 之间的输出电压。

各 DAC 通道引脚的模拟输出电压通过以下公式确定:

这里写图片描述

DAC 触发选择

如果 TENx 控制位置 1,可通过外部事件(定时计数器、外部中断线)触发转换。TSELx[2:0] 控制位将决定通过 8 个可能事件中的哪一个来触发转换,如表所示。

外部触发器

每当 DAC 接口在所选定时器 TRGO 输出或所选外部中断线 9 上检测到上升沿时,DAC_DHRx 寄存器中存储的最后一个数据即会转移到 DAC_DORx 寄存器中。发生触发后再经过三个 APB1 周期,DAC_DORx 寄存器将会得到更新。

如果选择软件触发,一旦 SWTRIG 位置 1,转换即会开始。DAC_DHRx 寄存器内容加载到 DAC_DORx 寄存器中后,SWTRIG 即由硬件复位。

注意:ENx 位置 1 时,无法更改 TSELx[2:0] 位。

如果选择软件触发,DAC_DHRx 寄存器的内容只需一个 APB1 时钟周期即可转移到 DAC_DORx 寄存器。


DMA 请求

每个 DAC 通道都具有 DMA 功能。两个 DMA 通道用于处理 DAC 通道的 DMA 请求。

当 DMAENx 位置 1 时,如果发生外部触发(而不是软件触发),则将产生 DAC DMA 请 求。DAC_DHRx 寄存器的值随后转移到 DAC_DORx 寄存器。

在双通道模式下,如果两个 DMAENx 位均置 1,则将产生两个 DMA 请求。如果只需要一个 DMA 请求,应仅将相应 DMAENx 位置 1。这样,应用程序可以在双通道模式下通过一个 DMA 请求和一个特定 DMA 通道来管理两个 DAC 通道。

DMA 下溢

DAC DMA 请求没有缓冲队列。这样,如果第二个外部触发到达时尚未收到第一个外部触发 的确认,将不会发出新的请求,并且 DAC_SR 寄存器中的 DAM 通道下溢标志 DMAUDRx 将置 1,以报告这一错误状况。DMA 数据传输随即禁止,并且不再处理其他 DMA 请求。 DAC 通道仍将继续转换旧有数据。

软件应通过写入“1”来将 DMAUDRx 标志清零,将所用 DMA 数据流的 DMAEN 位清零, 并重新初始化 DMA 和 DAC 通道,以便正确地重新开始 DMA 传输。软件应修改 DAC 触发 转换频率或减轻 DMA 工作负载,以避免再次发生 DMA 下溢。最后,可通过使能 DMA 数据 传输和转换触发来继续完成 DAC 转换。

对于各 DAC 通道,如果使能 DAC_CR 寄存器中相应的 DMAUDRIEx 位,还将产生中断。


生成噪声

为了生成可变振幅的伪噪声,可使用 LFSR(线性反馈移位寄存器)。将 WAVEx[1:0] 置为 “01”即可选择生成噪声。LFSR 中的预加载值为 0xAAA。在每次发生触发事件后,经过三 个 APB1 时钟周期,该寄存器会依照特定的计算算法完成更新。

DAC LFSR寄存器计算算法

LFSR 值可以通过 DAC_CR 寄存器中的 MAMPx[3:0] 位来部分或完全屏蔽,在不发生溢出的 情况下,该值将与 DAC_DHRx 的内容相加,然后存储到 DAC_DORx 寄存器中。

如果 LFSR 为 0x0000,将向其注入“1”(防锁定机制)。

可以通过复位 WAVEx[1:0] 位来将 LFSR 波形产生功能关闭。

LFSR产生波形的DAC转换

注意:要生成噪声,必须通过将 DAC_CR 寄存器中的 TENx 位置 1 来使能 DAC 触发。


生成三角波

可以在直流电流或慢变信号上叠加一个小幅三角波。将 WAVEx[1:0] 置为“10”即可选择 DAC 生成三角波。振幅通过 DAC_CR 寄存器中的 MAMPx[3:0] 位进行配置。每次发生触发 事件后,经过三个 APB1 时钟周期,内部三角波计数器将会递增。在不发生溢出的情况下, 该计数器的值将与 DAC_DHRx 寄存器内容相加,所得总和将存储到 DAC_DORx 寄存器 中。只要小于 MAMPx[3:0] 位定义的最大振幅,三角波计数器就会一直递增。一旦达到配置 的振幅,计数器将递减至零,然后再递增,以此类推。

可以通过复位 WAVEx[1:0] 位来将三角波产生功能关闭。

生成DAC三角波

生成DAC三角波

生成三角波波形的DAC转换(使能软件触发)

生成三角波波形的DAC转换

DAC 双通道转换

为了在同时需要两个 DAC 通道的应用中有效利用总线带宽,DAC 模块实现了三个双寄存器: DHR8RD、DHR12RD 和 DHR12LD。这样,只需一个寄存器访问即可同时驱动两个 DAC 通道。

通过两个 DAC 通道和这三个双寄存器可以实现 11 种转换模式。但如果需要,所有这些转换 模式也都可以通过单独的 DHRx 寄存器来实现。

具体模式详见F4参考手册


STM32F4的DAC库

DAC通道

STM32支持两个DAC通道,可以使用独立或者双端模式。

DAC通道1使用DAC_OUT1(PA4)做为输出

DAC通道2使用DAC_OUT2(PA5)作为输出

DAC触发

DAC转换器可以通过DAC_Trigger_None配置成非触发模式,一旦DAC_SetChannel1Data()/DAC_SetChannelData()函数写数据到DHRx寄存器将产生DAC_OUT1/DAC_OUT2输出。

DAC可以通过下面三种方式进行触发

1.外部事件触发:通过DAC_Trigger_Ext_IT9将EXTI Line 9与仍和GPIO9相连接。相应的GPIOx_Pin9必须配置成输入模式。

2.定时器触发:TIM2,TIM4,TIM5,TIM6,TIM7,TIM8(DAC_Trigger_T2_TRGO,DAC_Trigger_T4_TRGO…)通过函数TIM_SelectOutputTrigger()选择定时器触发事件。

3.通过DAC_Trigger_Software配置成软件触发。

DAC缓存模式特性

每个DAC通道都支持DAC缓存模式以减少输出阻抗,从而不需要额外正价运算放大器来驱动外部负载。使能DAC输出缓冲需要执行下面配置1DAC_InitStructure.DAC_OutputBuffer= DAC_OutputBuffer_Enable;

在使用输出缓冲和不适用输出换从的情况下,输出阻抗的大小可以通过参考数据手册获得。

DAC生成波形

通过DAC_WaveGeneration_noise配置产生噪声。

通过DAC_WaveGenertion_Triangle配置产生三角波。

DAC数据格式

通过DAC_Align_8b_R配置成8位数据右对齐。

通过DAC_Align_12b_L配置成12为数据左对齐。

通过DAC_Align_12b_R配置成12位数据右对齐。

DAC数据到电压值的转换

DAC_OUTx = VREF+*DOR/4095

DOR:表示DAC输出数据寄存器。

VREF+:表示输入参考电压。

举一个例子:若果要DAC_OUT1输出0.7v的电压,可以通过下面的函数来实现DAC_SetChannel1Data(DAC_Align_12b_R,868);

假设VREF+=3.3v,DAC_OUT1=(3.3*868)/4095 = 0.7V

DMA请求

通过DAC_DMACmd()使能DAC的DMA通道1.DMA请求的映射关系如下:

DAC通道1映射到DMA1 Stream5 channel7

DAC通道2映射到DMA1 Stream6 channel7

DAC的驱动方法

通过使能DAC时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE).

配置DAC_OUTx(DAC_OUT1: PA4, DAC_OUT2: PA5)为模拟模式。

通过DAC_Init()初始化DAC。

通过函数DAC_Cmd()使能DAC。

推荐阅读

史海拾趣

CR Magnetics公司的发展小趣事

CR Magnetics深知品质是企业的生命线。因此,公司始终坚持以质量为核心的管理理念,从原材料的采购到产品的生产、检测、包装等每一个环节都严格把控。此外,公司还通过了ISO9001:2008质量管理体系认证,并确保所有产品均符合RoHS等环保要求。这些举措使得CR Magnetics的产品赢得了客户的广泛信赖和好评。

Discrete Semiconductor Industries公司的发展小趣事

“创新动力”是Discrete Semiconductor Industries公司中一家以创新驱动发展的典范。该公司注重研发投入,积极引进和培养科技人才,建立了完善的研发体系。通过不断的技术创新和产品升级,创新动力不断推出具有市场竞争力的新产品。同时,公司还积极探索新的应用领域和市场机会,不断拓展业务范围。这种创新驱动的发展战略使得创新动力在激烈的市场竞争中保持了强劲的发展势头。

CyOptics Inc公司的发展小趣事

CyOptics Inc公司自创立以来,一直专注于磷化铟(InP)光学芯片及组件的研发和生产。凭借其在光学领域的深厚积累和技术创新,CyOptics逐渐在数据通讯及电信市场上树立了技术领先的形象。公司的850nm多模VCSEL和PIN器件等产品,因其高性能和可靠性,被广泛应用于短距离数据通信网络中,获得了市场的广泛认可。

Electro-Films Inc Semi-Films Div公司的发展小趣事

进入21世纪后,随着全球电子产业的蓬勃发展,Semi-Films Division 开始积极拓展国际市场。公司参加了多个国际性的电子产品展览会,与全球各地的客户建立了联系。同时,公司还加大了对海外市场的投入,设立了多个海外办事处和代理商,为客户提供更加便捷的服务。这些举措使得 Semi-Films 的产品逐渐走向世界,成为国际知名的薄膜材料供应商。

Clever Little Box公司的发展小趣事

Clever Little Box公司成立于1964年,当时正值电子行业的蓬勃发展时期。创始人凭借对音频和电子技术的深厚理解,以及对市场的敏锐洞察,决定成立这家公司,专注于音频和电子组件的分销。创业初期,公司面临着资金短缺、市场竞争激烈等诸多挑战,但创始人凭借坚定的信念和不懈的努力,逐渐在市场中站稳了脚跟。

CBM_America_Corporation公司的发展小趣事

随着环保意识的提高,CBM_America_Corporation开始关注自身的社会责任和可持续发展。公司积极采用环保材料和生产工艺,减少了对环境的污染。同时,CBM还参与了多项公益事业,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,还吸引了更多消费者的关注和支持。在可持续发展的道路上,CBM不断前行,为电子行业的绿色发展树立了榜样。

这些故事虽然是虚构的,但它们反映了电子行业中公司可能经历的一些典型情况和挑战。您可以根据这些故事框架进行进一步的创作和修改,以适应您特定的需求和背景。

问答坊 | AI 解惑

三恒星-中国最便宜的ARM7开发板知道吗?

听说现在三恒星科技推出一个中国最便宜的ARM7开发板,才198元,我晕,谁了解行情啊?ARM有这么便宜的吗?高手指点一下! 小弟QQ:727887572…

查看全部问答>

初学者请教关于WinCE开发的问题

我需要用VS2005开发一个MFC的网关,但是要用在WinCE上面。我安装了PB 5.0,是否是这样的流程啊? (1)需要自己新建一个平台,然后把要添加的内核文件添加进去。但是新建一个paltform的时候是选gateway吗? (2)接着新建好这个平台之后,要新建 ...…

查看全部问答>

WINCE修改开机画面问题

    现在想在PB中修改WINCE的开机画面,不是开机后的(应用程序已经开机运行了)。具体怎么操作啊…

查看全部问答>

求购开发板

需要嵌入式Linux与VxWorks开发板各一块,最好CPU频率400MHz以上, 必须带BSP支持。最好带完整的嵌入式Linux系统。VxWorks开发板支持WindML. 有意者请联系:010-51615759 邮箱:ancring.hk@163.com …

查看全部问答>

请高手帮忙: 在C代码中嵌入读ARM CPU ID 问题

当本人把以下代码嵌入到C文件中         __asm        {                 MRC p15,0,r10,c0,c0,0;         } 编译出错的信息为: War ...…

查看全部问答>

stm32驱动nrf905程序 调好可用

本帖最后由 paulhyde 于 2014-9-15 03:49 编辑 stm32驱动nrf905程序 调好可用  …

查看全部问答>

【MSP430共享】战时生命体征实时监测系统设计

在战场上能否尽快地对伤员进行快速处理,决定着能否把染病率和死亡率减少到最低限度。研 究发现,如果一名伤员在受伤后的最初一小时内接受及时有效的医疗护理,将大大增加其生存和康复的几率。  基于此目的,本文设计了一种战时生命体征实时监 ...…

查看全部问答>

菜鸟求解。。请问msp430g2231的工作电压只要是1.8到3.6v都行吗?

如题,就是vcc应该接多少v呢? 另外io口的输出电压又是多少啊。。。。入门级菜鸟望指教…

查看全部问答>

课后练习二十一之UCOS 单任务

课后练习二十一之UCOS 单任务   1.前言 1.     μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS-II 的前身是μC/O ...…

查看全部问答>

如何获得精度高的直流电源

请教各位大侠,怎样获得精度比较高的±50V(200mA)直流电源?…

查看全部问答>