STM32系列DAC的基本使用

发布者:leader5最新更新时间:2024-07-18 来源: elecfans关键字:STM32系列  DAC  基本使用 手机看文章 扫描二维码
随时随地手机看文章

一、STM32 带 DAC 的系列

目前博主产品使用的芯片为 STM32L051C8 系列,本来还想着直接CubeMX 设置一下,直接测试,才发现这个片片根本没有 DAC = =! 好吧,尴尬,后来查了下 L 系列确实都没有 DAC。

STM32L0:


STM32L0 系列都没有 DAC。(ST产品线一直在完善,也可能是我自己不知道有,有错误请指出!)

那么想着就用 STM32F103 系列把,然后又查了下资料,48pin 的STM32F103C系列 也没有 DAC ,自己最常用的两款芯片都没有,网上也没有直接说哪些有哪些没有的,只能去找 ST 的资料看看,果然在某份文档中找到了。

STM32F103:

STM32F103 系列带有 DAC 的型号如下图列表所示(从 STM32F103RC 起往上都有DAC):

图片

那这么看到,如果使用STM32F系列,那么至少也得从64pin 的 STM32F103RC 开始使用了。

至于 STM32F1 系列的其他型号,比如 F100、F101、F102、F105/7 等系列,因为不常用,我也没有特意去查找。

考虑到想找一个与 STM32F103 Pin to Pin 的,我又去找了另外一个常用的系列,STM32L1系列 ,居然发现了 STM32L151C8 居然也有 DAC, 这倒是可以用用。

STM32L1:

STM32L1 系列都带有 DAC : STM32L151xxxx 、STM32L152xxxx 。

STM32F4:

更高端的 F4 系列芯片,想想都知道,全系列带有 DAC ,就是贵啊。

STM32F4 系列都带有 DAC 。

这里再多余的补充一下,为什么我找芯片都是从最低端的型号开始,而且找到合适的基本不会再往功能更强的去找了:

因为实际产品! 做产品不可能和学习一样,大家学习买的开发板,都是上百个脚,一步到位,基本都是系列旗舰芯片了,功能越强越好,性能越强越好。但是作为实际应用的产品来说,需要考虑成本的,没有一家公司会在满足性能的低成本芯片的情况下,去找一个所谓更好,更强的芯片!

二、DAC 基础简介

DAC把数字量转换为模拟量,在单片机上 ,给指定的寄存器一个数字量,模块就会转化成对应的模拟电压输出,理解和使用起来都是很简单的,如果想知道基本的理论,说明大家可以网上搜索一下一大堆,这里我们直接用起来没必要介绍那些 “没用” 理论。

对于 STM32 而言,我们使用起来也是非常简单,只需要记住下面几个点,基本上就没问题了:

2.1 DAC输出引脚

STM32 常用系列的 DAC 输出通道都是固定的:

DAC_OUT1 : PA4

DAC_OUT2 : PA5

2.2 引脚配置

在 IO 配置的时候为了避免额外的干扰, PA4 和 PA5 建议配置为模拟功能。

如果使用 CubeMX 软件,选择了 DAC 输出,系统自动会选择成 Analog mode,使能 DAC 通道之后,相应的 GPIO 引脚会自动与 DAC 的模拟输出相连。

2.3 DAC输出电压计算方法

12位模式下面:

DAC输出电压 = (DOR/2^12) * Vref+

上面 DOR 是寄存器,最终会拿到我们写入的数字量的寄存器

关于到底用 4096 还是 4095 ,其实平时用起来差不多,ST 的手册上面为 4095,那么建议4095 严谨一点吧,这里大家知道就行

一般来说,我们 Vref+ 可以连接至 VCC ,比如说3.3V , 那就是 DAC输出电压 = (写入的数字量 / 4095) * 3.3

那么同样的,8位模式下面的计算方法:

DAC输出电压 = (写入的数字量 / 255) * 3.3

三、CubeMX DAC配置

那么接下来我们来简单测试一下 DAC 的效果,这里我们使用 STM32CubeMX 软件进行配置。

DAC 的配置是相对很简单的,如下图:

图片

选择两个输出通道,其中 External Trigger 选项为是否选择 外部中断EXTI9 触发,如下图:

图片

我们测试的时候使用软件触发,不使用外部中断,所以这里不选择。

DAC 的基本设置,很简单,对于博主使用的 STM32L151 来说就只有2个选项:

图片

关于输出缓存:

DAC选择了输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。但是输出的电压没法低于20mv。

不使能输出缓存,DAC可以输出低于20mv的信号。

对于其他型号的 DAC ,可能还会有下面两个选项:

Wave generation mode :

波形生成模式:可选 三角波发生器 ( Triangle wave generation ) 和 噪声波形 ( noise wave generation )

Maximum Triangle Amplitude :

最大三角波幅: 0-4095 对应 0V~3.3V

3.1 触发源 software trigger 与 None 的区别

这里要额外说明一下,最后一个选项 software trigger (软件触发) 与 选择 None (没有触发源)的区别。

这两种触发源很多小伙伴在使用的时候会搞糊涂,实际上这两者是完全不同的,先用文字简单解释一下(简单使用 HAL 库,不了解寄存器没关系,这里只是为了说明区别,):

选择 None (没有触发源):

只在向 DAC 数据寄存器 DHR 写入数据之后,DAC 转化模块自动转换一次。

选择 software trigger (软件触发):

向软件触发寄存器 SWTRIGR 中写入命令时触发转换,将 DOR 寄存器中的数据进行转换。 但是在这个之间需要向 DAC 数据寄存器 DHR 写入数据, 再进行软件触发操作。

可以说,software trigger (软件触发)就比 None (没有触发源) 多一个步骤,首先都要写 DHR 寄存器写入数据,写完后 None 自动转换,但是 software trigger 需要多一步软件触发操作。

在标准库中,使用步骤区别:

如果模式为 DAC_Trigger_None :

直接使用 DAC_SetChannelxData() 设置输出电压,就可以设定输出电压的大小

如果模式为软件触发:

每次在使用 DAC_SetChannelxData() 设置或者修改输出电压后, 还需要调用 DAC_SoftwareTriggerCmd(),使能软件触发。

在 HAL 库中,没有单独的软件触发的代码,因为 HAL_DAC_Start() 函数中包含了软触发转换的代码。

所以在 HAL 库中,建议的使用方法步骤为:

初始化完成后,先使用 HAL_DAC_SetValue(); ,然后再使用 HAL_DAC_Start();,这样的先后顺序不管是使用上面的那种方式,都能够正常输出电压值。

明白了 软件触发 以后,在平时使用中需要谨慎使用,因为每一次修改输出电压后,都必须产生一次触发信号来使得 DAC 触发 。

四、 测试

接下来简单测试一下 STM32 的DAC。

4.1 基础测试

基础测试就是非常简单,使用 STM32CubMX 生成代码后,直接加上两句话就可以使得 DAC 有输出了,比如下图示例:

图片

上面设置 value 为 2048 ,根据上面的 0-4095 对应 0V~3.3V,可知,我们的电压值为 1.6V 左右。

然后直接测量 通道2(PA5) 的电压,如下:

图片

4.2 波形输出

上文我们说过,对于我目前使用的 STM32L151 不支持波形输出,其他型号的可能可以直接设置,那么我们自己来简单实现一个波形输出,也是比较简单的:

while (1)

  {    for (mydac_value = 4095; mydac_value > 0; mydac_value--)

    {      HAL_DAC_SetValue(&hdac,DAC_CHANNEL_2,DAC_ALIGN_12B_R,mydac_value);      HAL_Delay(1);

    }    for (mydac_value = 0; mydac_value < 4095; mydac_value++)

    {      HAL_DAC_SetValue(&hdac,DAC_CHANNEL_2,DAC_ALIGN_12B_R,mydac_value);      HAL_Delay(1);

    }    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }


直接上一下波形图:

图片

上面的图形,有个小小的疑问,按理来说,从 0 ~ 3.3V 需要的时间 4095 ms ,4s 多,但是实际上花的时间比这多得多(5s 一个格子快2个格子了),难道这里是单片机处理 DAC 的值所需要的花费的时间 ? 这个问题如果发现问题的小伙伴还望告知!谢谢!

简单的测试就这样吧,一切还是比较正常的,具体的后期 DAC 会在设计 0 - 10V 输出电路的时候再次测试。是否好用可查看文章:单片机 0~10V 输出电路的实现

结语

本文从应用的角度介绍了 STM32 系列 DAC 的基本使用,小小的总结了一下一些常用的带 DAC 的系列型号。

没有过多的那些枯燥的寄存器什么的理论,虽然 DAC 的使用确实比较简单,但是还是有些细节问题文章也给到了说明,只希望大家能够简单快速的把 DAC 使用起来。


关键字:STM32系列  DAC  基本使用 引用地址:STM32系列DAC的基本使用

上一篇:STM32 CubeMx的安装教程
下一篇:STM32的CRC外设如何设置

推荐阅读最新更新时间:2026-03-25 11:49

STM32 HAL库学习系列第11篇---定时器TIM---看门狗基本配置及使用
基本配置 使用cube配置溢出时间 记住准时喂狗 独立看门狗: /* IWDG 1s 超时溢出 */ MX_IWDG_Init(IWDG_PRESCALER_64,625); /* 启动独立看门狗 */ HAL_IWDG_Start(&hiwdg); LED1_ON; /* while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控 * 如果我们知道这部 分代码的执行时间,比如是50ms,那么我们可以设置独立看门狗的 * 溢出时间是60ms,比50ms多一点, 如果要被监控的程序没有跑飞正常执行的话,那么 * 执行完毕之后就会执行喂狗的程序,如果程序跑飞
[单片机]
STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置
ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放在循环中不断开启 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);//等待转换结束,只适用于轮询 HAL_StatusTypeDef HAL_ADC_PollForEve
[单片机]
<font color='red'>STM32</font> HAL库学习<font color='red'>系列</font>第1篇 ADC配置 及 <font color='red'>DAC</font>配置
Flume的基本架构以及使用案例
在大数据时代背景下,如何采集出有用的信息已经是大数据发展的关键因素之一,数据采集可以说是大数据产业的基石。Flume作为开源的数据采集系统,受到了业界的认可与广泛应用。本文将带你了解Flume的基本架构以及使用案例等。 01 Flume简介 1.1 Flume是什么? Flume是Apache Software Foundation的顶级项目。它是一个分布式,可靠且可用的系统,主要用于高效地收集,聚合大量日志数据并将其从不同的源移动到集中式数据存储中。 Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,因此Flume可用于传输大量事件数据,包括但不限于网络流量数据,社交媒体数据,电子邮件消息以及几乎所有可能的数据源。 1
[嵌入式]
Flume的<font color='red'>基本</font>架构以及<font color='red'>使用</font>案例
stm32基本定时器timer6的原理与使用
/********************基本定时器 TIM 参数定义,只限 TIM6、7************/ /* 一、定时器分类 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时
[单片机]
电机保护器和变频器是否可以一起使用 变频器对电机的基本保护有哪些
电机保护器和变频器是否可以一起使用 变频器对电机的基本保护有哪些 电机保护器和变频器可以一起使用,并且变频器本身就能提供电机的基本保护。下面我将详细介绍变频器对电机的基本保护措施。 1. 过流保护:变频器能够监测电机的电流波形,并设定一个合理的电流上限。一旦电流超过设定值,变频器会自动切断输出电流,从而保护电机免受过流损害。这是电机保护的最基本功能之一。 2. 过载保护:变频器能根据电机的负载情况自动调整输出频率和电压。当负载过大时,变频器会通过降低频率和电压的方式来减少电机的负载,防止电机过载。此外,变频器还能监测电机的运行状态,一旦发现异常,如堵塞或负载异常,会自动切断输出电流。 3. 缺相保护:变频器还能检测电机是否存在缺相
[嵌入式]
PLC控制柜使用条件及基本结构
PLC控制柜组成部分一般有:  1:空开:一个总的空气开关,这个是整个柜体的电源控制。相信每个柜子都必须要有的一个东西。   2:PLC:这个要根据工程需要选择。打个比方如果工程小可以直接就是一个一体化的PLC但如果工程比较大可能就需要模块、卡件式的,同时还可能需要冗余(也就是两套交替使用)。   3:24VDC的电源:一个24VDC的开关电源,大多数的PLC都是自带24VDC的电源,根据是否确实需要来定是否要这个开关电源。   4:继电器:一般PLC是可以直接将指令发到控制回路里,但也可能先由继电器中转。打个比方,如果你PLC的输出口带电是24VDC的,但是你的控制回路里画的图需要PLC供的节点却是220VAC的,那么你就必须在
[嵌入式]
STM32G0开发笔记:定时器timer的基本使用方法
使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为定时器timer的基本使用方法。 1 新建项目 在PIO主页新建项目timer,框架选择libopencm3,开发板选择 MonkeyPi_STM32_G070RB; 新建完成后在src目录新建主程序文件main.c; 然后更改项目文件platformio.ini的烧写和调试方式: 1upload_protocol = cmsis-dap 2debug_tool = cmsis-dap 2 使用基本定时器 定时器设置 以下为设置定时器3的过程: 1static void timer_setup(void) 2{ 3 /* Enabl
[单片机]
STM32G0开发笔记:定时器timer的<font color='red'>基本</font><font color='red'>使用</font>方法
STM32F407 基本定时器使用
介绍STM32F407基本定时器的配置方法,分别介绍轮询方式、中断方式使用定时器完成定时。 【1】定时器介绍 定时器相关的章节在STM32F4xx参考手册第14、15、16、17章节。 【2】基本定时器配置示例 增加一个Timer.c文件,代码如下 #include timer.h /* 函数功能:基本定时器7初始化配置 函数形参: psc :预分频系数 arr :重载值 说明:定时器的视频频率为84MHZ ,是APB1时钟频率的2倍 */ void Time7_InitConfig(u16 psc,u16 arr) { /*1. 开时钟*/ RCC- APB1ENR|=1 5;
[单片机]
STM32F407 <font color='red'>基本</font>定时器<font color='red'>使用</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved