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_1 | DAC的通道,我们这里开启的是通道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输出的波形,注意观察频率,幅度,深入理解这其中的关系。
后记
本文章收录于:
本文为系列文章中的冰山一角,欢迎进入小站查看。
配套程序:
以上是关于STM32cubemx教程 DAC+TIM+DMA的主要内容,如果未能解决你的问题,请参考以下文章
STM32CubeMX(07)定时器+ DAC+DMA输出阶梯波实验。
STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx