STM32F4——DAC
DAC简介
DAC(Digital to analog converter)即数字模拟转换器,它可以将数字信号转换为模拟信号。它的功能与ADC相反。在常见的数字信号系统中,大部分传感器信号被转化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。
STM32F4 DAC模块是 12 位电压输出数模转换器,它可以配置为 8 位或 12 位模式,也可以与DMA 控制器配合使用。DAC工作在 12 位模式下,数据可以采用左对齐或右对齐。DAC工作在8位模式下,数据只有右对齐方式。DAC 有两个输出通道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当两个通道组合在一起同步执行更新操作时,也可以同时进行转换。DAC可通过一个输入参考电压引脚 VREF+ (与ADC 共享)来提高转换后的数据精度。
STM32F4 DAC主要特性:
● 两个 DAC 转换器:各对应一个输出通道
● 12 位模式下数据采用左对齐或右对齐
● 同步更新功能
● 生成噪声波
● 生成三角波
● DAC 双通道单独或同时转换
● 每个通道都具有 DMA 功能
● DMA 下溢错误检测
● 通过外部触发信号进行转换
● 输入参考电压 VREF+
(1)标号1:电压输入引脚
同ADC一样,VDDA与VSSA是DAC模块的供电引脚,而VREF+是DAC模块的参考电压,开发板上已经将VREF+连接到VDDA,所以参考电压范围是0-3.3V。
(2)标号2:DAC转换
DAC 输出是受 DORx 寄存器直接控制的,但是我们不能直接往DORx 寄存器写入数据,而是通过 DHRx 间接的传给 DORx 寄存器,实现对 DAC 输出的控制。如果未选择硬件触发( DAC_CR 寄存器中的 TENx 位复位),那么经过一个 APB1 时钟周期后,DAC_DHRx 寄存器中存储的数据将自动转移到 DAC_DORx 寄存器。但是,如果选择硬件触发(置位 DAC_CR 寄存器中的 TENx 位)且触发条件到来,将在三个 APB1 时钟周期后进行转移。
当 DAC_DORx 加载了 DAC_DHRx 内容时,模拟输出电压将在一段时间 tSETTLING 后可用,具体时间取决于电源电压和模拟输出负载。我们可以从STM32F407ZGT6 的数据手册查到的典型值为 3us,最大是 6us。所以 DAC 的转换速度最快是 333K 左右。
DHRx内装载着我们要输出的数据,前面我们提到,STM32F4 的 DAC 支持 8/12 位模式,8 位模式的时候数据是固定的右对齐的,而 12 位模式数据可以设置左对齐/右对齐。对于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] 位)。
每个 DAC 通道都具有 DMA 功能。两个 DMA 通道用于处理 DAC 通道的 DMA 请求。当 DMAENx 位置 1 时,如果发生外部触发(而不是软件触发),则将产生 DAC DMA 请求。 DAC_DHRx 寄存器的值随后转移到 DAC_DORx 寄存器。在双通道模式下,如果两个 DMAENx 位均置 1,则将产生两个 DMA 请求。如果只需要一个DMA 请求,应仅将相应 DMAENx 位置 1。这样,应用程序可以在双通道模式下通过一个DMA 请求和一个特定 DMA 通道来管理两个 DAC 通道。
由于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位,还将产生中断。
(3)标号3:DAC触发选择
如果 TENx 控制位置 1,可通过外部事件(定时计数器、外部中断线
)触发转换。TSELx[2:0]控制位将决定通过 8 个可能事件中的哪一个来
触发转换,外部触发源如图
如果选择软件触发,一旦 SWTRIG 位置 1, 转换即会开始。DAC_DHRx 寄存器的内容只需一个 APB1 时钟周期即可转移到DAC_DORx
寄存器,加载完成后,SWTRIG 即由硬件复位。
(4)标号4:DAC输出
DAC_OUTx 就是 DAC 的输出通道,DAC1_OUT对应 PA4引脚,DAC1_OUT对应 PA5引脚。要让DAC通道正常输出,需将 DAC_CR 寄存器中的相应 ENx 位置 1,这样就可接通对应 DAC 通道。经过一段启动时间tWAKEUP 后,DAC 通道被真正使能。使能 DAC 通道 x 后,相应 GPIO 引脚(PA4 或 PA5)将自动连接到模拟转换器输出(DAC_OUTx)。为了避免寄生电流消耗,应首先将 PA4 或 PA5 引脚配置为模拟模式 (AIN)。
当 DAC 的参考电压为 Vref+的时候,DAC 的输出电压是线性的从0~Vref+, 12 位模式下 DAC 输出电压与 Vref+以及 DORx 的计算公式
如下:
STM32F4 DAC配置步骤
(1)使能端口及DAC时钟,设置引脚为模拟输入
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
(2)初始化DAC,设置DAC工作模式
void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);
DAC_Trigger:设置是否使用触发功能。前面介绍框图时已经说了DAC具有多个触发源,有定时器触发,外部中断线9触发,软件触发和不使用触发。
DAC_WaveGeneration:设置是否使用波形发生。
DAC_LFSRUnmask_TriangleAmplitude:设置屏蔽/幅值选择器。这个变量只在使用波形发生器的时候才有用,通常我们设置为 0 即可,值为DAC_LFSRUnmask_Bit0。
DAC_OutputBuffer:设置输出缓存控制位。通常我们不使用输出缓存功能,所以配置参数为DAC_OutputBuffer_Disable。
(3)使能DAC的输出通道
void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState);
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC通道1
(4)设置DAC的输出值
通过前面 4 个步骤的设置, DAC 就可以开始工作了,如果我们使用 12 位右对齐数据格式,我们通过设置 DHR12R1,就可以在 DAC 输出引脚(PA4)得到不同的电压值了。设置DHR12R1 的库函数是:
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
库函数中,还提供一个读取 DAC 对应通道最后一次转换的数值,函数是:uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel);
D1指示灯用来提示系统运行状态,K_UP按键用来增加DAC输入值,K_DOWN按键用来减小DAC输入值,输入值的改变将控制DAC1_OUT电压输出。通过串口1将DAC1_OUT输出的电压值打印出来。
dac.c
#include "dac.h"void DAC1_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_InitStructure;//使能端口和DAC时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//初始化端口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模拟输入模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//管脚设置GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//浮空GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化端口结构体//初始化DAC,设置DAC工作模式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); //通道一初始化DACDAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC通道1}
main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "dac.h"
#include "key.h"int main()
{ u8 i=0;u8 key;int dac_value = 0;u16 dacval;float dac_vol;SysTick_Init(168);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组LED_Init();USART1_Init(9600);DAC1_Init();KEY_Init();while(1){key = KEY_Scan(0);if(key == KEY_UP){dac_value += 400;if(dac_value>=4000){dac_value = 4000;}DAC_SetChannel1Data(DAC_Align_12b_R, dac_value); //将值赋给寄存器}if(key == KEY_DOWN){dac_value -= 400;if(dac_value <= 0){dac_value = 0;}DAC_SetChannel1Data(DAC_Align_12b_R, dac_value); //将值赋给寄存器}i++;if(i%20==0){led1=!led1;}if(i%100 == 0){dacval = DAC_GetDataOutputValue(DAC_Channel_1); //读取DAC 对应通道最后一次转换的数值dac_vol = (float)dacval*(3.3/4096);printf("输出DAC电压值为%.2f\r\n",dac_vol);}myDelay_ms(10);}
}
STM32F4——DAC相关推荐
- STM32F4 DAC
国电临近,总结一下之前写过的一些程序和电路.时间不多,只能抽空写了,等闲的时候再一并写好,以飨读者. 数据手册里的 : TRGO:触发输出 TRGI:触发输入 STM32F103VCT6自带两个12位 ...
- 正点原子探索者原理图_正点原子【STM32-F407探索者】第二十六章 DAC 实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 http://weixin.qq.com/r/hEhUT ...
- STM32F4 (hal库)ADC+TIM1+DAC的配置
写在前面:感谢XXX大佬的指导,点击可查看他的博客 实现的功能: 用定时器TIM产生PWM波来控制ADC的采样频率,在ADC中断中将采样值直接通过DAC输出.本文主要展示ADC.TIM.DAC的配置( ...
- 玩转X-CTR100 l STM32F4 l DAC数字模拟转换
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 DAC接口输出功能, ...
- ST公司STM32F4与STM32F1的区别
本文来源于互联网,不保证正确性和完整性.STM32F4相对于STM32F1的改进不只一点点,为了便于初学者了解,我们比对相关资料将改进点进行了汇总. F1采用Crotex M3内核,F4采用Crote ...
- 【STM32】DAC程序示例
00. 目录 文章目录 00. 目录 01. DAC简介 02. 硬件模块 03. 程序设计 04. 结果验证 05. 预留 06. 附录 07. 声明 01. DAC简介 STM32F4的DAC模块 ...
- 【STM32】DAC相关函数和类型
00. 目录 文章目录 00. 目录 01. DAC简介 02. 相关类型 03. 相关函数 04. 结构体封装 05. 预留 06. 附录 07. 声明 01. DAC简介 STM32F4的DAC模 ...
- STM32F4开发板硬件简介
参考:STM32F4开发板硬件平台简介 作者:SKY丶丿平才 发布时间: 2021-03-20 10:44:41 网址:https://blog.csdn.net/weixin_48264057/ar ...
- STM32F4端口复用
一.复用功能映射配置 1.系统功能 将I/O连接到AF0,然后根据所用功能进行配置: JATG/SWD:在各器件复位后,会将这些引脚指定为专用引脚,可供片上调试模块立即 使用(不受GPIO控制器控制) ...
最新文章
- 用 Celery 实现邮件推送系统
- [导入]c#中的关于string的转换的问题
- 结合file和iconv命令转换文件的字符编码类型
- (转载)控制反转(IoC)与依赖注入(DI)
- php 日期转毫秒_【小技巧】 各种日期操作方法汇总
- filter IE滤镜(Internet Explorer)CSS
- 云计算之路:数据库服务器的选择——舍RDS取云服务器
- HBuilderX连接夜神模拟器
- cadence 617工艺库安装以及相关问题解决
- 12. JLINK在线调试+软件调试方法与技巧
- Excel中Match()函数使用方法
- Crowd 和 JIRA、Confluence、Fisheye and Crucible共享账户集成登入
- xp系统查找局域网计算机名,WinXP系统内网IP查询的方法
- cluster(1)
- Java实现蓝桥杯VIP 算法训练 sign函数
- md文件 linux,MD 文件扩展名: 它是什么以及如何打开它?
- 巴菲特:我可以发2100万个巴菲特币|附视频
- 4. 串的【朴素模式匹配算法】、【KPM算法:求next数组、nextval数组】
- 在html页面实时显示系统时间
- 高项.十大管理47个过程
热门文章
- 校内计算机技能考核,校内专业技能达标认证.PDF
- IT行业校企合作下一个10年何处去——美斯坦福首届校企合作人才培养论坛见真章
- Python实现 体育竞技问题分析(嵩天老师)
- 个人理财第六课-基金投资之货币基金和债券基金
- 利用freemarker做html页面静态化
- TuneUp Utilities 2013 序列号
- php使用fpm fcgi模式,为所有PHP模式安装Ioncube Loader(CLI,CGI,FCGI和FPM)在Debian Wheezy...
- 构建一个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合
- IIS连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解
- 引用Geoip实现由IP地址获取国家城市等信息