前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【STM32】HAL库 STM32CubeMX教程十—DAC「建议收藏」

【STM32】HAL库 STM32CubeMX教程十—DAC「建议收藏」

作者头像
全栈程序员站长
发布于 2022-08-11 03:05:39
发布于 2022-08-11 03:05:39
3.9K01
代码可运行
举报
运行总次数:1
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用

所用工具:

1、芯片: STM32F407ZET6/ STM32F103ZET6

2、STM32CubeMx软件

3、IDE: MDK-Keil软件

4、STM32F1xx/STM32F4xxHAL库

知识概括:

通过本篇博客您将学到:

DAC工作原理

STM32CubeMX创建DAC例程

HAL库定时器DAC函数库

DAC

Digital-to-Analog Converter的缩写。数模转换器。又称D/A转换器,简称DAC,是指将离散的数字信号转换为连续变量的模拟信号的器件

典型的数字模拟转换器将表示一定比例电压值的数字信号转换为模拟信号

STM32F1中有两个DAC,可以同时使用STM32的DAC模块是12位数字输入,电压输出型的DAC。

DAC 有两个用途:输出波形输出固定电压

DAC工作原理

DAC工作框图

这里我们把它分为三部分讲解:

“触发方式 ” “控制逻辑” “数模转换器”

触发方式

第一部分,触发方式,是指DAC转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制位TSELx[2:0]可以选择8个触发事件之一触发DAC转换,任意一种触发源都可以触发DAC转换。

具体的外部触发可看下图:

六个是定时器触发:TIM2,TIM4,TIM5,TIM6,TIM7和TIM8。剩下两个分别是:EXTI线路9(PC9)和软件触发

每次DAC接口侦测到来自选中的定时器TRGO输出,或者外部中断线9的上升沿,近存放在寄 存器DAC_DHRx中的数据会被传送到寄存器DAC_DORx中。在3个APB1时钟周期后,寄存器 DAC_DORx更新为新值。

如果选择软件触发,一旦SWTRIG位置’1’,转换即开始。在数据从DAC_DHRx寄存器传送到 DAC_DORx寄存器后,SWTRIG位由硬件自动清’0’

2控制逻辑

此部分决定了DAC的波形控制,输出方式,DMA传输,等等,

我们来具体讲解下, 从框图可以看出,DAC受DORx寄存器直接控制的,但是 数据并不是直接传入DORx的,需要先传入DHRx 之后在间接地传给DORx寄存器 不能直接往DORx寄存器写入数据

  • 如果没有选择硬件触发(TENx=0),在一个APB1周期后传入DORx,
  • 如果选择硬件触发(TENx=1),则在3个APB1周期后传入DORx

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

上图的DMAENx TENx MAMOx[3:0],WAVENx[1:0]位 都是由DAC_CR寄存器控制的

DMAENx 控制DAC通道1/2 的DMA使能

MAMP2[3:0]:DAC通道2屏蔽/幅值选择器 位 27:24 由软件设置这些位, 用来在噪声生成模式下选择屏蔽位,在三角波生成模式下选择波形的幅值

WAVE2[1:0]:DAC通道2噪声/三角波生成使能

位23:22

决定是否产生波形,和产生什么波形。 00:关闭波形发生器; 10:使能噪声波形发生器; 1x:使能三角波发生器。

TENx:DAC通道x触发使能,用来使能/关闭DAC通道x的触发。

0:关闭DAC通道x触发,写入DAC_DHRx寄存器的数据在1个APB1时钟周期后传入 DAC_DORx寄存器; 1:使能DAC通道x触发,写入DAC_DHRx寄存器的数据在3个APB1时钟周期后传入 DAC_DORx寄存器。 注意:如果选择软件触发,写入寄存器DAC_DHRx的数据只需要1个APB1时钟周期就可以传入 寄存器DAC_DORx。

3数模转换器

VDDA和VSSA为DAC模块模拟部分的供电。 Vref+则是DAC模块的参考电压。 DAC_OUTx就是DAC的输出通道了(对应PA4或者PA5引脚)

从左边的参考电压Vref+ —->数模转换器 —->模拟信号输出引脚

注意:DAC的引脚应该设置成模拟输入(AIN)模式

DAC输出电压:

数字输入经过DAC被线性地转换为模拟电压输出

其范围为 0~VREF+

DAC输出 = VREF x (DOR/4095)

特殊功能: 噪声波形生成,三角波形生成,外部触发转换,双DAC同时或者分别转换;每个通道都有DMA功能;

参考电压:2.4V~ 3.3V

DAC的主要特征

  • 2个DAC转换器:
  • 每个转换器对应1个输出通道;
  • 8位或者12位单调输出;
  • 12位模式下数据左对齐或者右对齐;
  • 同步更新功能;
  • 噪声波形生成;
  • 三角波形生成;
  • 双DAC通道同时或者分别转换;
  • 外部触发转换;
  • 输入参考电压VREF+。

DAC原理总括

数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+ 以获得更精确的转换结果。

CubeMx工程创建

1设置RCC时钟

设置高速外部时钟HSE 选择外部时钟源

2时钟源设置

  • 1选择外部时钟HSE 12MHz
  • 2PLL锁相环倍频72倍
  • 3系统时钟来源选择为PLL
  • 4设置APB1分频器为 /2

32的时钟树框图 如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

3DAC设置

这个其实没啥好讲的

1.OUT1 和 OUT2对应两个输出通道

2.External Trigger 外部中断EXTI9 触发

就是使用外部中断来触发ADC

3.Tigger 选择DAC的触发方式 上方都有讲解

Output Buffer 使能DAC输出缓存

DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个 DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭

这个使能即可

4项目文件设置

  • 1 设置项目名称
  • 2 设置存储路径
  • 3 选择所用IDE

5创建工程文件

然后点击GENERATE CODE 创建工程

配置下载工具 新建的工程所有配置都是默认的 我们需要自行选择下载模式,勾选上下载后复位运行

例程详解:

DAC库函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* IO operation functions *****************************************************/
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);     //开启DAC输出
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel);   //关闭DAC输出
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函数中不断开启 //开启DAC的DMA输出
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); //关闭DAC的DMA输出
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);  //设置DAC输出值
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel);  //获取DAC输出值

DAC输出电压:

在main()主函数中设置DAC输出的数据为12位右对齐,DAC输出为2048,并使能DAC1输出通道

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  /* USER CODE BEGIN 2 */
  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);

	HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
  /* USER CODE END 2 */

DAC输出 = VREF x (DOR/4095)

则实际输出的电压为 2048/4096×3.3V=1.65V,

万用表测量引脚电压即可

  • HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);

功能:设置DAC的输出值 参数一: DAC结构体名 参数二: 设置DAC通道 参数三: 设置DAC对齐方式 参数四: 设置输出电压值 12位最大位4095

  • HAL_DAC_Start(&hdac,DAC_CHANNEL_1);

功能:开启DAC输出 参数一: DAC结构体名 参数二: DAC通道

DAC输出波形

DAC输出三角波

打开STM32cubeMX的DAC工程文件重新配置,

使能DAC输出通道2。

DAC外部触发(Trigger) :定时器2触发,

波形生成模式(Wave generation mode)三角波发生器(Triangle wave generation).

可以选择三角波形,和噪声波形(noise wave generation)

最大三角波幅(Maximum Triangle Amplitude) :4095

设三角波幅值为3.3V,即4095

DAC12位数据存储,最大为4095

0-4095 对应 0V~3.3V

打开Timers,使能定时器2

配置如下,具体配置原理在前面 【STM32】HAL库 STM32CubeMX教程六—-定时器中断 有过讲解,这里就不再阐述了,按照图示配好即可

这里讲下三角波的频率

简单的说,首先设置一个DAC最大幅值, 之后设置定时器溢出时间,在每次定时器发生溢出等事件之后,定时器会发送触发信号TRGO到DAC,这是内部的三角波计数器就会累加1 然后于DAC_DHRx寄存器的值相加,写到DAC_DORx计数器中,如果该值小于设定的最大幅值,就会正常输出,当大于最大幅值时就会递减,减到0之后又开始累加,周而复始,就形成了三角波

三角波频率:

设三角波幅值为3.3V,即4095,所以一个周期计数器计数4096*2=8192次,则三角波频率为“定时器频率/8192

代码实现:

在main函数中添加以下两行代码,即可输出三角波

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /* USER CODE BEGIN 2 */
     HAL_TIM_Base_Start(&htim2);
     HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
     /* USER CODE END 2 */

分别为开启定时器TIM2 和开启DAC

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138848.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月3,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【二代示波器教程】第12章 示波器设计—DAC信号发生器的实现
本章节为大家讲解二代示波器中信号发生器的实现。这个功能还是比较实用的,方便为二代示波器提供测试信号。实现了正弦波,方波和三角波的频率,幅度以及占空比设置。
Simon223
2018/09/04
1.1K0
【二代示波器教程】第12章 示波器设计—DAC信号发生器的实现
【STM32】HAL库 STM32CubeMX教程十三—RTC时钟
本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用
全栈程序员站长
2022/08/11
3K0
【STM32】HAL库 STM32CubeMX教程十三—RTC时钟
【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用
全栈程序员站长
2022/06/29
4.2K0
【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)
【STM32H7教程】第60章 STM32H7的DAC应用之定时器触发实现DMA方式双通道波形
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第60章       STM32H7的DAC应用之定时器触发实现DMA
Simon223
2020/02/25
1.7K0
【STM32H7教程】第44章 STM32H7的ADC基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第44章       STM32H7的ADC基础知识和HAL库API
Simon223
2020/01/13
6.2K0
【STM32H7教程】第44章   STM32H7的ADC基础知识和HAL库API
【STM32H7教程】第74章 STM32H7的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第74章       STM32H7的SPI总线应用之驱动DAC856
Simon223
2020/04/10
2K0
【STM32H7教程】第74章  STM32H7的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
万字长文解读STM32-1
你懂精通ARM的含金量吗?你懂精通STM32的含金量吗?不管懂不懂都要懂,赶紧学。
云深无际
2023/05/24
1.5K0
万字长文解读STM32-1
【STM32H7教程】第32章 STM32H7的TIM定时器基础知识和HAL库API
本章节为大家讲解TIM1 – TIM17(STM32H7没有TIM9,TIM10和TIM11)共计14个定时器的基础知识和对应的HAL库API。
Simon223
2019/07/27
3.7K0
【STM32H7教程】第75章 STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第75章       STM32H7的SPI总线应用之驱动DAC850
Simon223
2020/05/09
1.7K0
【STM32H7教程】第75章    STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)
【STM32】HAL库 STM32CubeMX教程六—-定时器中断
今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用
全栈程序员站长
2022/08/11
4.3K0
【STM32】HAL库 STM32CubeMX教程六—-定时器中断
开源项目:使用STM32做一个简易的示波器
该项目是基于正点原子精英板制作的一个简易示波器,可以读取信号的频率和幅值,并可以通过按键改变采样频率和控制屏幕的更新暂停。
AI 电堂
2022/12/08
3.4K0
开源项目:使用STM32做一个简易的示波器
stm32开发教程_单片机STM32
有关stm32F1,stm32F4 固件驱动包的下载,请打开这篇文章: https://blog.csdn.net/xiaoeleis/article/details/105789061
全栈程序员站长
2022/10/04
9020
stm32开发教程_单片机STM32
【STM32F407开发板用户手册】第33章 STM32F407的SPI总线应用之驱动DAC8563
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第33章       STM32F407的SPI总线应用之驱动DAC856
Simon223
2020/08/02
1.2K0
【STM32F407开发板用户手册】第34章 STM32F407的SPI总线应用之驱动DAC8501
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第34章       STM32F407的SPI总线应用之驱动DAC850
Simon223
2020/08/02
8960
Cubemx与HAL库系列教程|ADC+DMA多通道采集详解
模拟电压信号在时间上和幅值上均是连续的信号叫做模拟信号。此类信号的特点是,在一定动态范围内幅值可取任意值。
用户8913398
2021/11/02
7K0
【STM32H7教程】第63章 STM32H7的高分辨率定时器HRTIM基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第63章       STM32H7的高分辨率定时器HRTIM基础知识
Simon223
2020/03/03
2.9K0
【STM32H7教程】第16章 STM32H7必备的HAL库API(重要)
本章教程为大家讲解制作一个STM32H7的例子所需的最基本API函数,对于一些常用的API函数,一定要熟练掌握这些函数都是实现了什么功能,不常用的函数有个了解即可,用到的时候再去学。
Simon223
2019/05/15
2.4K0
【STM32H7教程】第16章       STM32H7必备的HAL库API(重要)
基于STM32的DAC音频输出实验
新年新迹象,辞旧迎新,小飞哥先跟大家拜个年!经过了2020年的各种不顺,迎来了2021年,首先祝大家否极泰来,新的一年事事顺心,工作顺意,都能健健康康的!
用户8913398
2021/08/16
2.5K0
基于STM32的DAC音频输出实验
stm32cubemx使用教程pdf_库乐队完全新手教程
本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用
全栈程序员站长
2022/09/27
7750
stm32cubemx使用教程pdf_库乐队完全新手教程
【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解「建议收藏」
今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用
全栈程序员站长
2022/09/13
9.7K0
【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解「建议收藏」
推荐阅读
相关推荐
【二代示波器教程】第12章 示波器设计—DAC信号发生器的实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验