STM32 DAC详解
目录
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寄存器)。
如果没有选中硬件触发(寄存器DAC_CR1的TENx位置0),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx;
如果选中硬件触发(寄存器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种情况:
8位数据右对齐:用户须将数据写入寄存器DAC_DHR8Rx[7:0]位(实际是存入寄存器DHRx[11:4]位);
12位数据左对齐:用户须将数据写入寄存器DAC_DHR12Lx[15:4]位(实际是存入寄存器DHRx[11:0]位);
12位数据右对齐:用户须将数据写入寄存器DAC_DHR12Rx[11:0]位(实际是存入寄存器DHRx[11:0]位)。
一般采用第三种方式:12位数据右对齐比较多。
根据对DAC_DHRyyyx寄存器的操作,经过相应的移位后,写入的数据被转存到DHRx寄存器中(DHRx是内部的数据保存寄存器x)。随后,DHRx寄存器的内容或被自动地传送到DORx寄存器,或通过软件触发或外部事件触发被传送到DORx寄存器。
双DAC通道,有3种情况:
8位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR8RD[7:0]位(实际是存入寄存器DHR1[11:4]位),将DAC通道2数据写入寄存器DAC_DHR8RD[15:8]位(实际是存入寄存器DHR2[11:4]位);
12位数据左对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12LD[15:4]位(实际是存入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12LD[31:20]位(实际是存入寄存器DHR2[11:0]位);
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详解相关推荐
- stm32位操作详解
stm32位操作详解 STM32位操作原理 思想:把一个比特分成32位,每位都分配一个地址,这样就有32个地址,通过地址直接访问. 位操作基础 位运算 位运算的运算分量只能是整型或字符型数据,位运算把 ...
- STM32 定时器详解
STM32 定时器详解 吃了一个猛亏,自己理解花了大半天时间,结果一看代码发现巨简单 算了,把自己理解的放上来吧 目录 STM32 定时器详解 前言 一.定时器种类和区分 二.时钟源 三.计数过程 3 ...
- STM32 GPIO 详解
0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或 ...
- 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 ...
- [STM32]DAC全解分析
Stm32F1 Dac 全解分析 存在疑问 VREF 能不能大于VDDA 允许同步更新是什么意思 输出缓存原理和具体影响 DAC简介 主要特点: + 2个DAC转换器,支持两路输出 + 8位或者12位 ...
- STM32 ADC详解
目录 01.ADC简介 02.STM32的ADC外设 03.STM32ADC框图讲解 04.触发源 05.转换周期 06.数据寄存器 07.中断 08.电压转换 09.电路图设计 10.代码设计 01 ...
- 【STM32】DAC详解
00. 目录 文章目录 00. 目录 01. DAC简介 02. DAC主要特性 03. DAC功能说明 04. DAC 双通道转换 05. DAC寄存器 5.1 DAC 控制寄存器 (DAC_CR) ...
- stm32定时器详解
简介 在控制,电子领域中,时常需要定时控制,延时控制或者对某件事进行计数,如洗衣机的定时洗衣等等定时控制,载入通过对外部的脉冲进行计数来测量速度等 资源介绍 STM32一共有三种定时器,总共有14个定 ...
- STM32 串口详解
目录 01.USART的特点 02.USART简介 2.1.数据传输模型 2.2.帧结构 2.3.波特率 03.STM32的USART 04.代码配置 01.USART的特点 USART是通用异步收发 ...
最新文章
- SQL Sever索引
- mybatis教程--实现增删改查的入门教程
- menu什么意思中文意思_proclaim什么意思
- DataTables中提示:DataTables warning: table id=example - Cannot reinitialise DataTable.
- html5 测评游戏,暗黑之王评测:HTML5游戏铸就最华丽ARPG冒险
- BZOJ1014: [JSOI2008]火星人prefix
- 前端学习(3032):vue+element今日头条管理-反馈
- maven jar包冲突
- 突发!Nginx 之父被拘留,原因竟然是“接私活儿”?
- 在百度超级链Xuper上部署智能合约并实现存证功能
- document.write vs document.getElementById
- N1网络命令-ping
- MATLAB调用M文件
- Kubernets 污点与容忍
- 数学建模对计算机的CPU150,三星Exynos M1秒了A9处理器,能击败骁龙820吗?
- 【规范】万字集大成的C编写规范
- 中国传统文化-雨课堂期末2022
- Postman使用小技巧 - 用Postman生成Request代码
- 电脑运行java程序很卡_我的世界卡运行不流畅解决办法
- 线性代数复习总结——基本概念
热门文章
- linux max 函数,sched_get_priority_max()函数 Unix/Linux
- 主表的引用字段中找不到唯一的索引_不用找了,大厂在用的分库分表方案,都在这里!...
- 嘉奥丰农显示无法连接服务器,Arcaea无法连接服务器如何解决
- 电子科技大学计算机学院王刚,电子科技大学-团体程序设计天梯赛.PDF
- python multiprocessing 得到多进程返回的结果
- android超级管理员权限作用,Android获取超级管理员权限的实现
- 2021庐江高考成绩查询,2021庐江高考考点查询入口https://lj.hfzsks.org/list_score/index.php?seach_t...
- webpack配置:css文件打包、JS压缩打包和HTML文件发布
- lintcode-137-克隆图
- NSURLSessionDownloadTask实现大文件下载