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 的值所需要的花费的时间 ? 这个问题如果发现问题的小伙伴还望告知!谢谢!
本文从应用的角度介绍了 stm32 系列 dac 的基本使用,小小的总结了一下一些常用的带 dac 的系列型号。
没有过多的那些枯燥的寄存器什么的理论,虽然 dac 的使用确实比较简单,但是还是有些细节问题文章也给到了说明,只希望大家能够简单快速的把 dac 使用起来。
好了,本文就到这里,谢谢大家!

四相科技用高精度定位技术,助力矿业产业新发展
英国电动汽车的销量在2024 年即将超过传统内燃机
浅析用CAN总线在电动汽车充电机中的通信应用
出口短路对变压器的影响
基于S3C44B0x处理器和SJA1000芯片实现通信模块的设计
STM32系列 DAC 的基本使用
天帆一号太阳帆关键技术试验开展顺利
宝马联手四维图新 共同达成自动驾驶地图许可协议
使用NVIDIA Morpheus解决网络安全问题
瞬态电压抑制器TVS的特性及应用
小米手环3评测 堪称同价位手腕上的最佳搭档
光敏半导体材料的光电转换特性
指纹考勤机
如何延长手机电池寿命(锂电池保养)
东芝推出五款新型MOSFET栅极驱动IC,助力移动电子设备小型化
基于一种高亮度的白光LED串联电路设计
LCD挖孔屏手机均搭载后置指纹识别
设计和验证技术如何确保汽车SoC的功能安全
芯启源受邀参加IP SoC活动 展示高端EDA工具产品特性
AT89S51单片机计数器的设计