一、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 使用起来。
好了,本文就到这里,谢谢大家!
手机市场集中,摄像头出货量偏向头部企业
智能手环IP68气密性检测设备参数如何设置?
加工0.12mm针 到底是车床厉害还是师傅技术更好呢
嵌入式工程师浅谈带徒弟的经验
触摸一体机不能触摸了怎么办
STM32 系列DAC的基本使用
联发科天玑9200跑分126万+ 基于台积电最新4nm工艺
氧气分析仪用于电弧增材制造3D打印机
DT5M1026系列MCU带AES、SHA算法、12位ADC、超低功耗
蓝牙成为IIoT的关键网络技术
还在期待三星S8?关于三星S8的这四点,你一定要知道
感应无线位置检测系统设计与实现[图]
METRAHIT IM XTRA 它是万用表,但绝不仅仅是万用表!
交通运输部印发《关于推动交通运输领域新型基础设施建设的指导意见》
Acer新蜂鸟3正式上市,十代酷睿配3:2生产力屏
三星显示器控告华硕 ProArt 专业级显示器使用的 OLED侵权
压电陶瓷驱动控制器的特点以及应用的说明
未来虚拟医疗保健市场规模将超过50亿美元
移动、宽带业务创历史新高,打造智能应用生态圈已初显成效
魅族HD60头戴式蓝牙耳机将于明日发布 头梁外裹橙色加厚布制材料颇为吸睛