前言

本文主要讲解定时器触发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。

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输出。它的参数含义如下:

HAL_TIM_Base_Start(&htim2);//开启定时器2
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)Sine12bit,100,DAC_ALIGN_12B_R);//开启输出

硬件连接

运行结果

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

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

后记

本文章收录于:

唐承乾的电赛小站

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

配套程序:

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