STM32cubemx教程 DAC+TIM+DMA

Posted 四臂西瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32cubemx教程 DAC+TIM+DMA相关的知识,希望对你有一定的参考价值。

DAC+TIM+DMA

前言

本文主要讲解定时器触发DAC去输出任意信号,DMA负责数据数据搬移。

所需工具:

  • 开发板:STM32F103RCT6
  • STM32CubeMX
  • IDE: Keil-MDK

相关文章:

文章目录

什么是DAC

【讲座】ADC和DAC(模数和数模转换器)(ADC and DAC (Analog to Digital And Digital to Analog )_哔哩哔哩_bilibili

可以参考下面这篇前辈的文章【STM32】HAL库 STM32CubeMX教程十—DAC_Z小旋-CSDN博客_hal库dac

我后面有时间再用一种面向初学者的语言讲一讲。目前先参考上面的文章吧。

模式简介

​ DAC+TIM+DMA输出交流信号是电赛中输出任意波形的技术。一般用于输出几十k的低频信号。高频信号需要使用FPGA。

​ F1的DAC支持许多触发信号,这里选择TIM3的TRGO事件作为触发信号,其中TRGO选择更新时间来引起。

工程建立

时钟配置

DAC配置

​ 下面介绍下界面选项:

  • MODE

    • OUT1 Configuration:使能DAC通道1输出
    • OUT2 Configuration:使能DAC通道2输出
  • DAC Out1 Settings

    • Output Buffer:输出缓存

      Enable:使能输出缓存,DAC的输出阻抗会降低,无需外部运放即可直接驱动外部负载。但是输出的电压没法低于20mv。如果不需要输出小于20mv的信号,一般开启输出缓存。

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

    • Trigger:触发源选择。支持的触发源如下

    • Wave generation mode:

      Disabled:关闭波形发生器。一般关闭。

      Triangle wave generation:使能三角波发生器。

      Noise wave generation:使能噪声波形发生器。

      如果想玩一玩这个模式,可以参考下面这篇前辈的文章【STM32】HAL库 STM32CubeMX教程十—DAC_Z小旋-CSDN博客_hal库dac

      这里选择使能DAC通道1的输出,选择TIM2的TRGO触发。因为要演示低于20mv的信号,不打开输出缓存。

开启DAC的DMA,选择工作在Circular循环模式。循环和normal的区别如下:

  • Circular:循环模式,当DMA搬运完成一组数据后,会回到这组数据的起始位置,再次开启搬运,不断循环。DAC要输出连续的波形,就需要不断搬移。
  • Normal:正常模式,DMA搬运完一组数据后,就不再搬运了。如果让DAC的DMA工作在这个模式它的波形就只有一个周期。

假如说我数据是一组正弦波。那么两个模式下,DAC输出的波形如图。

定时器配置

刚刚DAC的触发源选择的TIM2,这里使能TIM2,触发信号为更新信号。触发频率设置成1M。 72 M 72 = 1 M \\frac72M72=1M 7272M=1M

1M是DAC的最大更新速度,DAC从一个电压变成另外一个电压最大速度为1M,也就是1us。

实际可以可以超频的。最大频率待补充

代码编写

​ 用一百个点,组成正弦。stm32的DAC是12位DAC,也就是可以输入的数字量为0~4095。分别对应0-3.3V。

const uint16_t Sine12bit[100]=	0x0800,0x0881,0x0901,0x0980,0x09FD,0x0A79,0x0AF2,0x0B68,0x0BDA,0x0C49,
0x0CB3,0x0D19,0x0D79,0x0DD4,0x0E29,0x0E78,0x0EC0,0x0F02,0x0F3C,0x0F6F,	0x0F9B,0x0FBF,0x0FDB,0x0FEF,0x0FFB,0x0FFF,0x0FFB,0x0FEF,0x0FDB,0x0FBF,
0x0F9B,0x0F6F,0x0F3C,0x0F02,0x0EC0,0x0E78,0x0E29,0x0DD4,0x0D79,0x0D19,
0x0CB3,0x0C49,0x0BDA,0x0B68,0x0AF2,0x0A79,0x09FD,0x0980,0x0901,0x0881,
0x0800,0x077F,0x06FF,0x0680,0x0603,0x0587,0x050E,0x0498,0x0426,0x03B7,	0x034D,0x02E7,0x0287,0x022C,0x01D7,0x0188,0x0140,0x00FE,0x00C4,0x0091,
0x0065,0x0041,0x0025,0x0011,0x0005,0x0001,0x0005,0x0011,0x0025,0x0041,
0x0065,0x0091,0x00C4,0x00FE,0x0140,0x0188,0x01D7,0x022C,0x0287,0x02E7,
0x034D,0x03B7,0x0426,0x0498,0x050E,0x0587,0x0603,0x0680,0x06FF,0x077F,
;

​ 接下来开启输出即可。HAL_TIM_Base_Start是开启定时器2,定时器2开起来后,才会产生TRGO触发信号去触发DAC更新数据。放在DAC开启前后都行,如果放在DAC后面,DAC开启后,由于没用定时器的触发不会输出,只有等到定时器开启了才输出。

​ HAL_DAC_Start_DMA用于开启DAC输出。它的参数含义如下:

参数含义
&hdac固定的,DAC对象。因为只有一个DAC,所以不分DAC1,2。
DAC_CHANNEL_1DAC的通道,我们这里开启的是通道1
(uint32_t*)Sine12bit数据的源地址
100数据的个数
DAC_ALIGN_12B_R数据右对齐,基本上固定
HAL_TIM_Base_Start(&htim2);//开启定时器2
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)Sine12bit,100,DAC_ALIGN_12B_R);//开启输出

硬件连接

引脚连接对象释义
PA4示波器示波器的正极输入

运行结果

​ TIM2的触发频率为1M,我们在设置DAC数据Sine12bit时,用100个点描述一个正弦周期。计算后的频率为 1 M 100 = 10 k \\frac1M100=10k 1001M=10k

​ 读者可以尝试更改Sine12bit的内容来改变DAC输出的波形,注意观察频率,幅度,深入理解这其中的关系。

后记

本文章收录于:

唐承乾的电赛小站

本文为系列文章中的冰山一角,欢迎进入小站查看。

配套程序:

DAC+TIM+DMA例程 0积分下载

以上是关于STM32cubemx教程 DAC+TIM+DMA的主要内容,如果未能解决你的问题,请参考以下文章

重学STM32---DAC+DMA+TIM

STM32CubeMX(07)定时器+ DAC+DMA输出阶梯波实验。

STM32 TIM DAC 和 DMA

STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx

STM32CubeMX(08)定时器+ DAC+DMA输出正弦波实验。

stm32cubemx ADC+TIM+DMA超频采样