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相关推荐

  1. STM32F4 DAC

    国电临近,总结一下之前写过的一些程序和电路.时间不多,只能抽空写了,等闲的时候再一并写好,以飨读者. 数据手册里的 : TRGO:触发输出 TRGI:触发输入 STM32F103VCT6自带两个12位 ...

  2. 正点原子探索者原理图_正点原子【STM32-F407探索者】第二十六章 DAC 实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 http://weixin.qq.com/r/hEhUT ...

  3. STM32F4 (hal库)ADC+TIM1+DAC的配置

    写在前面:感谢XXX大佬的指导,点击可查看他的博客 实现的功能: 用定时器TIM产生PWM波来控制ADC的采样频率,在ADC中断中将采样值直接通过DAC输出.本文主要展示ADC.TIM.DAC的配置( ...

  4. 玩转X-CTR100 l STM32F4 l DAC数字模拟转换

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 DAC接口输出功能, ...

  5. ST公司STM32F4与STM32F1的区别

    本文来源于互联网,不保证正确性和完整性.STM32F4相对于STM32F1的改进不只一点点,为了便于初学者了解,我们比对相关资料将改进点进行了汇总. F1采用Crotex M3内核,F4采用Crote ...

  6. 【STM32】DAC程序示例

    00. 目录 文章目录 00. 目录 01. DAC简介 02. 硬件模块 03. 程序设计 04. 结果验证 05. 预留 06. 附录 07. 声明 01. DAC简介 STM32F4的DAC模块 ...

  7. 【STM32】DAC相关函数和类型

    00. 目录 文章目录 00. 目录 01. DAC简介 02. 相关类型 03. 相关函数 04. 结构体封装 05. 预留 06. 附录 07. 声明 01. DAC简介 STM32F4的DAC模 ...

  8. STM32F4开发板硬件简介

    参考:STM32F4开发板硬件平台简介 作者:SKY丶丿平才 发布时间: 2021-03-20 10:44:41 网址:https://blog.csdn.net/weixin_48264057/ar ...

  9. STM32F4端口复用

    一.复用功能映射配置 1.系统功能 将I/O连接到AF0,然后根据所用功能进行配置: JATG/SWD:在各器件复位后,会将这些引脚指定为专用引脚,可供片上调试模块立即 使用(不受GPIO控制器控制) ...

最新文章

  1. 用 Celery 实现邮件推送系统
  2. [导入]c#中的关于string的转换的问题
  3. 结合file和iconv命令转换文件的字符编码类型
  4. (转载)控制反转(IoC)与依赖注入(DI)
  5. php 日期转毫秒_【小技巧】 各种日期操作方法汇总
  6. filter IE滤镜(Internet Explorer)CSS
  7. 云计算之路:数据库服务器的选择——舍RDS取云服务器
  8. HBuilderX连接夜神模拟器
  9. cadence 617工艺库安装以及相关问题解决
  10. 12. JLINK在线调试+软件调试方法与技巧
  11. Excel中Match()函数使用方法
  12. Crowd 和 JIRA、Confluence、Fisheye and Crucible共享账户集成登入
  13. xp系统查找局域网计算机名,WinXP系统内网IP查询的方法
  14. cluster(1)
  15. Java实现蓝桥杯VIP 算法训练 sign函数
  16. md文件 linux,MD 文件扩展名: 它是什么以及如何打开它?
  17. 巴菲特:我可以发2100万个巴菲特币|附视频
  18. 4. 串的【朴素模式匹配算法】、【KPM算法:求next数组、nextval数组】
  19. 在html页面实时显示系统时间
  20. 高项.十大管理47个过程

热门文章

  1. 校内计算机技能考核,校内专业技能达标认证.PDF
  2. IT行业校企合作下一个10年何处去——美斯坦福首届校企合作人才培养论坛见真章
  3. Python实现 体育竞技问题分析(嵩天老师)
  4. 个人理财第六课-基金投资之货币基金和债券基金
  5. 利用freemarker做html页面静态化
  6. TuneUp Utilities 2013 序列号
  7. php使用fpm fcgi模式,为所有PHP模式安装Ioncube Loader(CLI,CGI,FCGI和FPM)在Debian Wheezy...
  8. 构建一个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合
  9. IIS连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解
  10. 引用Geoip实现由IP地址获取国家城市等信息