STM32网上资料多,对自己来说基本的使用也是很简单的,
我的STM32专栏并没有什么系统的基础教学,基本上是某个项目用到了,或者产品使用过程出过问题
才会来记录一下,正好用到了 DAC ,一般产品还用得不多,正好来一篇文章记录一下

前言

最近是因为有一个项目需要输出 0~10V 的信号量,而且

想着应该可以直接使用 STM32 的 DAC 来做,虽然不一定实际使用,但是也就来试试看吧。

说句实话,博主自己做的产品,不常用 DAC,所以 本文我们就来好好复习下 STM32 的 DAC ,从应用角度讲讲如何快速使用起来。

我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!

目录

  • 前言
  • 一、STM32 带 DAC 的系列
  • 二、DAC 基础简介
    • 2.1 DAC输出引脚
    • 2.2 引脚配置
    • 2.3 DAC输出电压计算方法
  • 三、CubeMX DAC配置
    • 3.1 触发源 software trigger 与 None 的区别
  • 四、 测试
    • 4.1 基础测试
    • 4.2 波形输出
  • 结语

一、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的介绍与使用相关推荐

  1. 【STM32系列】硬件介绍及固件安装

    [STM32系列]硬件介绍及固件安装 硬件介绍 应用领域 固件安装 进入DFU模式 安装固件 退出DFU,进入U盘模式 演讲稿 欢迎收看由咸鱼菌工作室出品的STM32系列教程.本篇内容主要是设备介绍及 ...

  2. STM32系列ARM单片机介绍

    STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Cortex-M3内核.按性能分成两个不同的系列:STM32F103"增强型"系列和STM32F101 ...

  3. STM32系列微控制器入门介绍

    文章目录 目的 基础需求 电路基础 编程语言 入门介绍 官方网站 型号选择 开发方式 开发工具 程序调试 固件烧录 资料说明 总结 目的 STM32是意法半导体(ST)推出的主要基于ARM Corte ...

  4. ChibiOS系列:二、在STM32上开发:介绍ChibiStudio

    本文翻译自:http://www.playembedded.org/blog/developing-stm32-chibistudio/ 在STM32上开发:介绍ChibiStudio 发表于 201 ...

  5. 【STM32】DAC详解

    00. 目录 文章目录 00. 目录 01. DAC简介 02. DAC主要特性 03. DAC功能说明 04. DAC 双通道转换 05. DAC寄存器 5.1 DAC 控制寄存器 (DAC_CR) ...

  6. 基于STM32系列芯片的 IAP实现的探索

    基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...

  7. 【STM32】STM32系列教程汇总(暂时暂停更新...)

    00. 目录 文章目录 00. 目录 01. STM32平台简介 02. STM32开发环境 03. STM32初级教程 04. STM32中级教程 05. STM32高级教程 06. FreeRTO ...

  8. 【STM32】DAC程序示例

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

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

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

最新文章

  1. [LeetCode] NO.383 Ransom Note
  2. Android面试题目之四: 归并排序
  3. android studio sdk升级失败解决
  4. 二十万字C/C++、嵌入式软开面试题全集宝典二
  5. Android官方命令深入分析之Hierarchy Viewer
  6. apache OFBiz的安装
  7. wgs84坐标系转换工具_ArcGIS中不同坐标系之间的转换
  8. php get获取腾讯视频vid,获取腾讯视频源地址链接的方法
  9. matlab 索力迭代,索梁组合体系桥梁施工索力确定的割线迭代法
  10. Java 多线程执行
  11. ppt抽奖vba代码
  12. c语言的if语句案例,c语言if语句(c语言if语句例子)
  13. DZone每日必读-news: 指导软件团队取得成功的 4 种方法
  14. 蝙蝠侠最新截图----光影的典型例证
  15. 吐血推荐30个高质量但免费的自学网站,错过了就是亏大了!!!
  16. 101shell脚本
  17. java摇号_以JAVA为平台实现摇号抽奖
  18. NOIP 提高组复赛 day1 国王游戏
  19. Flutter | bloc 之 state 使用优化
  20. R16 Type II量化反馈码本的产生

热门文章

  1. java常用的单词,快点收藏点赞吃灰
  2. map_server简介
  3. 申报书写作之如何区分研究内容和研究方法
  4. nginx中500,501,502,503,504,505状态码的详解及出现的原因/区别(转)
  5. 写作方法_论文写作方法
  6. brain dead_Brain Dead,又一个把印花做「绝」了的品牌
  7. 给企业划分子网(子网划分)
  8. 签名不对,请检查是否与开放平台一致
  9. CentOS虚拟机通过主机WIFI上网
  10. WebLogic CVE-2019-2647~2650 XXE漏洞分析