目录

01、DAC简介

02、DAC转换

03、功能说明

04、DAC输出电压

05、代码配置


上一篇介绍了《STM32ADC详解》,既然有模拟转数字的ADC模块,那么就必然有数字转模拟的DAC模块。顾名思义,该模块仅具有ADC的补充功能。它将数字二进制值转换为模拟电压输出。DAC模块具有多种用途,包括音频生成,波形生成等。通常在大多数8位微控制器中,此模块不可用,并且通过脉宽调制(PWM)可以稍微满足其需求。部分原因是由于它们的硬件资源和运行速度相对较低。所有STM32单片机都具有PWM模块,但大容量STM32也具有DAC模块。STM32DAC模块不是很复杂,并且在工作原理方面与ADC模块相似。

01、DAC简介

从STM32F207数据手册看到,STM32F207具有两个DAC模块。

每个DAC具有独立的通道,对应的GPIO分别为:PA4和PA5。对于GPIO的复用功能(Alternatefunctions)和附加功能(Additionalfunctions),在《STM32ADC详解》有详细讲解。

除了DAC输出的管脚,还有其他相关引脚

注意:使能DAC 通道x 后,相应GPIO 引脚(PA4 或PA5)将自动连接到模拟转换器输出(DAC_OUTx)。为了避免寄生电流消耗,应首先将PA4 或PA5 引脚配置为模拟模式(AIN)。

下面的简化框图显示了STM32DAC模块的主要组件。

02、DAC转换

由框图可以看出,DAC受DORx寄存器直接控制的,但是不能直接往DORx寄存器写入数据,而是通过DHRx间接地传给DORx寄存器,实现对DAC的输出控制。

不能直接对寄存器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;

  2. 如果选中硬件触发(寄存器DAC_CR1的TENx位置1),数据传输在触发发生以后3个APB1时钟周期后完成。

一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间tSETTLING之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。

DAC控制寄存器(DAC_CR)

DMAEN1:DAC通道1DMA使能(DAC channel1 DMA enable),我们不使用DMA,故设置为0

MAMP1[3:0]:DAC通道1屏蔽/幅值选择器(DAC channel1 mask/amplitude selector)我们没有用到故这几位也设置为0

WAVE1[1:0]:DAC通道1噪声/三角波生成使能(DAC channel1 noise/triangle wave generationenable)我们也没用到故也设置为0

TEN1:DAC通道1触发使能(DAC channel1 trigger enable)我们不用触发,所以设置为0

TSEL1[2:0]:DAC通道1触发选择(DAC channel1 trigger selection)注意:该位只能在TEN1=1(DAC通道1触发使能)时设置。我们TEN1设为0,所以这几位就不用设置,默认为0

BOFF1:关闭DAC通道1输出缓存(DAC channel1 output buffer disable)我们关闭输出缓冲故设置为1

EN1:DAC通道1使能(DAC channel1 enable)我们要使能DAC通道、故设置为1。

03、功能说明

STM32的DAC等效电路如下

该电路中显示的输出缓冲器在内部3.3V电源上运行。与大多数运放在单电源(而不是+/-双电源)上运行一样,输出摆幅永远不会真正达到目标。但是,如电路所示,有两个内部开关(S1和S2)可通过寄存器控制。将它们都打开将通过两个串联的电阻(Ra和Rb)将“DACINT”信号直接连接到“DACOUT”引脚。作为参考,Ra+ Rb约为15k。

根据选择的配置模式,数据按照下文所述写入指定的寄存器:

单DAC通道x,有3种情况:

  1. 8位数据右对齐:用户须将数据写入寄存器DAC_DHR8Rx[7:0]位(实际是存入寄存器DHRx[11:4]位);

  2. 12位数据左对齐:用户须将数据写入寄存器DAC_DHR12Lx[15:4]位(实际是存入寄存器DHRx[11:0]位);

  3. 12位数据右对齐:用户须将数据写入寄存器DAC_DHR12Rx[11:0]位(实际是存入寄存器DHRx[11:0]位)。

一般采用第三种方式:12位数据右对齐比较多。

根据对DAC_DHRyyyx寄存器的操作,经过相应的移位后,写入的数据被转存到DHRx寄存器中(DHRx是内部的数据保存寄存器x)。随后,DHRx寄存器的内容或被自动地传送到DORx寄存器,或通过软件触发或外部事件触发被传送到DORx寄存器。

双DAC通道,有3种情况:

  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]位);

  3. 12位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12RD[11:0]位(实际是存入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12RD[27:16]位(实际是存入寄存器DHR2[11:0]位)。

04、DAC输出电压

当DAC的参考电压位VREF+的时候,数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。

任一DAC通道引脚上的输出电压满足下面的关系:

DAC输出= VREF x (DOR / 4095)。

注意:此时数据格式:应该选择12位数据右对齐。

05、代码配置

DAC配置

void DAC1_Config(void)
{DAC_InitTypeDef  DAC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* DMA1 clock and GPIOA clock enable (to be used with DAC) */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);/* DAC Periph clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);/* DAC channel 1 & 2 (DAC_OUT1 = PA.4)(DAC_OUT2 = PA.5) configuration */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);/* DAC channel2 Configuration */DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;DAC_Init(DAC_Channel_1, &DAC_InitStructure);/* Enable DAC Channel2 */DAC_Cmd(DAC_Channel_1, ENABLE);
}

设置输出电压

//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(uint16_t vol)
{double temp=vol;temp/=1000;temp=temp*4096/3.3;DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
}

测试用例很简单,就是反复输出1.2V和3.0V电压

 while (1){GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄灭LED灯Dac1_Set_Vol(1200);LCD_ShowString(0,0,"DAC OUT 1.2V");Delay(500);                      //延时500msGPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯Dac1_Set_Vol(3000);LCD_ShowString(0,0,"DAC OUT 3.0V");Delay(500);                      //延时500ms}

下载验证

硬件和软件开源地址:

https://github.com/strongercjd/STM32F207VCT6

点击查看本文所在的专辑,STM32F207教程

关注公众号,第一时间收到文章更新。评论区不能及时看到,需要交流可以到公众号沟通

STM32 DAC详解相关推荐

  1. stm32位操作详解

    stm32位操作详解 STM32位操作原理 思想:把一个比特分成32位,每位都分配一个地址,这样就有32个地址,通过地址直接访问. 位操作基础 位运算 位运算的运算分量只能是整型或字符型数据,位运算把 ...

  2. STM32 定时器详解

    STM32 定时器详解 吃了一个猛亏,自己理解花了大半天时间,结果一看代码发现巨简单 算了,把自己理解的放上来吧 目录 STM32 定时器详解 前言 一.定时器种类和区分 二.时钟源 三.计数过程 3 ...

  3. STM32 GPIO 详解

    0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或 ...

  4. STM32 SPI详解

    目录 1.SPI简介 2.SPI特点 2.1.SPI控制方式 2.2.SPI传输方式 2.3.SPI数据交换 2.4.SPI传输模式 3.工作机制 3.1.相关缩写 3.2.CPOL极性 3.3.CP ...

  5. [STM32]DAC全解分析

    Stm32F1 Dac 全解分析 存在疑问 VREF 能不能大于VDDA 允许同步更新是什么意思 输出缓存原理和具体影响 DAC简介 主要特点: + 2个DAC转换器,支持两路输出 + 8位或者12位 ...

  6. STM32 ADC详解

    目录 01.ADC简介 02.STM32的ADC外设 03.STM32ADC框图讲解 04.触发源 05.转换周期 06.数据寄存器 07.中断 08.电压转换 09.电路图设计 10.代码设计 01 ...

  7. 【STM32】DAC详解

    00. 目录 文章目录 00. 目录 01. DAC简介 02. DAC主要特性 03. DAC功能说明 04. DAC 双通道转换 05. DAC寄存器 5.1 DAC 控制寄存器 (DAC_CR) ...

  8. stm32定时器详解

    简介 在控制,电子领域中,时常需要定时控制,延时控制或者对某件事进行计数,如洗衣机的定时洗衣等等定时控制,载入通过对外部的脉冲进行计数来测量速度等 资源介绍 STM32一共有三种定时器,总共有14个定 ...

  9. STM32 串口详解

    目录 01.USART的特点 02.USART简介 2.1.数据传输模型 2.2.帧结构 2.3.波特率 03.STM32的USART 04.代码配置 01.USART的特点 USART是通用异步收发 ...

最新文章

  1. SQL Sever索引
  2. mybatis教程--实现增删改查的入门教程
  3. menu什么意思中文意思_proclaim什么意思
  4. DataTables中提示:DataTables warning: table id=example - Cannot reinitialise DataTable.
  5. html5 测评游戏,暗黑之王评测:HTML5游戏铸就最华丽ARPG冒险
  6. BZOJ1014: [JSOI2008]火星人prefix
  7. 前端学习(3032):vue+element今日头条管理-反馈
  8. maven jar包冲突
  9. 突发!Nginx 之父被拘留,原因竟然是“接私活儿”?
  10. 在百度超级链Xuper上部署智能合约并实现存证功能
  11. document.write vs document.getElementById
  12. N1网络命令-ping
  13. MATLAB调用M文件
  14. Kubernets 污点与容忍
  15. 数学建模对计算机的CPU150,三星Exynos M1秒了A9处理器,能击败骁龙820吗?
  16. 【规范】万字集大成的C编写规范
  17. 中国传统文化-雨课堂期末2022
  18. Postman使用小技巧 - 用Postman生成Request代码
  19. 电脑运行java程序很卡_我的世界卡运行不流畅解决办法
  20. 线性代数复习总结——基本概念

热门文章

  1. linux max 函数,sched_get_priority_max()函数 Unix/Linux
  2. 主表的引用字段中找不到唯一的索引_不用找了,大厂在用的分库分表方案,都在这里!...
  3. 嘉奥丰农显示无法连接服务器,Arcaea无法连接服务器如何解决
  4. 电子科技大学计算机学院王刚,电子科技大学-团体程序设计天梯赛.PDF
  5. python multiprocessing 得到多进程返回的结果
  6. android超级管理员权限作用,Android获取超级管理员权限的实现
  7. 2021庐江高考成绩查询,2021庐江高考考点查询入口https://lj.hfzsks.org/list_score/index.php?seach_t...
  8. webpack配置:css文件打包、JS压缩打包和HTML文件发布
  9. lintcode-137-克隆图
  10. NSURLSessionDownloadTask实现大文件下载