二、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 输出电路的时候再次测试。
结语本文从应用的角度介绍了 STM32 系列 DAC 的基本使用,小小的总结了一下一些常用的带 DAC 的系列型号。 没有过多的那些枯燥的寄存器什么的理论,虽然 DAC 的使用确实比较简单,但是还是有些细节问题文章也给到了说明,只**大家能够简单快速的把 DAC 使用起来。
如有侵权请联系删除
|