STM32 - HAL笔记(六):DAC

本文介绍了STM32的DAC(数模转换器)工作原理,包括触发方式、控制逻辑和API使用。通过示例展示了如何设置软件触发输出固定电压,以及利用定时器生成三角波。此外,还探讨了结合DMA实现连续波形输出的方法,为实际项目中的信号生成提供参考。

基础知识

工作框图

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

    img

  • 一旦数据从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
  1. 使用 STM32Cube 设置相关管脚为 DAC 输出管脚,触发源选择 Software trigger

    在这里插入图片描述

    OU1 & OUT2:两个输出通道

    External Trigger:外部中断触发

    Trigger:触发方式选择

    Output Buffer:使能 DAC 输出缓存。DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。 每个 DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭。

  2. 在主函数中设置 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);
    
三角波生成
  1. 打开 STM32Cube 配置相关通道,触发源选择 Timer

    在这里插入图片描述

    • Wave generation mode:波形生成模式

      1. Trigger wave generation:三角波

      2. noise wave generation:噪声波形

    • Maximum Triangle Amplitude:最大三角波幅度(0 ~ 4095 ==> 0 ~ 3.3V)

  2. 打开 Timers,使能上一步选择的 Timer

    在这里插入图片描述

    三角波频率 = 定时器频率 / (2 * Maximum Triangle Amplitude)

  3. 在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
  1. 通过 STM32Cube 设置 DAC

在这里插入图片描述

  1. 点击 DMA Settings,设置 DMA

在这里插入图片描述

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

在这里插入图片描述

  1. 在 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);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值