基础知识
工作框图
DAC 主要由三部分组成:触发方式、控制逻辑、数模转换器

触发方式
-
概念:指DAC转换可以由某外部事件触发(定时器计数器、外部中断线)
-
触发方式选择

-
如果选择中断源触发,每次触发源触发后,存放在
寄存器DAC_DHRx中的数据会被传送到寄存器DAC_DORx中。在3个APB1时钟周期后,寄存器DAC_DORx更新为新值;如果选择软件触发,一旦SWTRIG位置 1,转换即开始。在数据从
DAC_DHRx寄存器传送到DAC_DORx寄存器后,SWTRIG位由硬件自动清0
控制逻辑
-
概念:此部分决定了DAC的波形控制,输出方式,DMA传输……
-
DHRx ==> DORx
- 如果没有选择硬件触发(TENx=0),在一个APB1周期后传入DORx
- 如果选择硬件触发(TENx=1),则在3个APB1周期后传入DORx

-
一旦数据从
DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间Tsetting(大约3us) 后输出有效,这段时间的长短依电源电压和负载的不同有所变化
API
//开启DAC输出
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);
//关闭DAC输出
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel);
//开启DAC的DMA输出,需要函数中断开启
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment);
//关闭DAC的DMA输出
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel);
//设置DAC输出值
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
//获取DAC输出值
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel);
Demo
通用 DAC
-
使用 STM32Cube 设置相关管脚为 DAC 输出管脚,触发源选择 Software trigger

OU1 & OUT2:两个输出通道External Trigger:外部中断触发Trigger:触发方式选择Output Buffer:使能 DAC 输出缓存。DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。 每个 DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭。 -
在主函数中设置 DAC 输出,并打开 DAC
//使能DAC的1通道,输出数据为12位右对齐,DAC输出为2048 //DAC_voltage = VREF * value / (2^12 - 1) HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048); //开启DAC HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
三角波生成
-
打开 STM32Cube 配置相关通道,触发源选择 Timer

-
Wave generation mode:波形生成模式-
Trigger wave generation:三角波 -
noise wave generation:噪声波形
-
-
Maximum Triangle Amplitude:最大三角波幅度(0 ~ 4095 ==> 0 ~ 3.3V)
-
-
打开 Timers,使能上一步选择的 Timer

三角波频率 = 定时器频率 / (2 * Maximum Triangle Amplitude)
-
在main函数中添加以下两行代码,即可输出三角波
//打开定时器 HAL_TIM_Base_Start(&htimx); //DAC会以0x100作为基电压生成三角波 HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100); //打开DAC HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
Timer + DMA + DAC
- 通过 STM32Cube 设置 DAC

- 点击 DMA Settings,设置 DMA

- 将要生成的波形的电压值存放在数组中

-
在 main 函数中写入如下代码
//打开定时器 HAL_TIM_Base_Start(&htimx); //以DMA方式设置DAC HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sin_8bit, 256, DAC_ALIGN_8B_R);
本文介绍了STM32的DAC(数模转换器)工作原理,包括触发方式、控制逻辑和API使用。通过示例展示了如何设置软件触发输出固定电压,以及利用定时器生成三角波。此外,还探讨了结合DMA实现连续波形输出的方法,为实际项目中的信号生成提供参考。
:DAC&spm=1001.2101.3001.5002&articleId=120339256&d=1&t=3&u=09701b4ac4bb4f0186e019be98369419)
52

被折叠的 条评论
为什么被折叠?



