一、DAC原理

1.DAC定义

  DAC是Digital-to- Analog Converter的缩写,数字/模拟转换模块的简称,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。

2.STM32DAC简介

  数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。
  主要功能特点如下:
  ● 2个DAC转换器:每个转换器对应1个输出通道
  ● 8位或者12位单调输出
  ● 12位模式下数据左对齐或者右对齐
  ● 同步更新功能
  ● 噪声波形生成
  ● 三角波形生成
  ● 双DAC通道同时或者分别转换
  ● 每个通道都有DMA功能
  ● 外部触发转换
  ● 输入参考电压VREF+
  STM32DAC结构框图如下:
在这里插入图片描述

3.STM32DAC工作原理

(1)电源、参考电压及输出通道
  VDDA和VSSA为DAC模块模拟部分的供电;VREF+则是DAC模块的参考电压。
在这里插入图片描述
  DAC_OUTx就是DAC的输出通道了。
在这里插入图片描述
(2)DAC转换及输出
  数字至模拟转换器x是DAC核心部件,它以VREF+作为参考电源,以DAC 的数据寄存器“DORx”的数字信号作为输入,经过它转换得的模拟信号由“DAC_OUTx”通道输出。但是,用户不能直接对寄存器DAC_DORx写入数据,任何输出到DAC通道x的数据都必须写入DHRx寄存器。
在这里插入图片描述
◆ DHR相关寄存器
  ➢ 用户写入的数据保持寄存器:
    单DAC通道模式:总共有6个DAC_DHRyyyx寄存器
      ● DAC通道x的12位右对齐数据保持寄存器 DAC_DHR12Rx (x=1、2)
      ● DAC通道x的12位左对齐数据保持寄存器 DAC_DHR12Lx (x=1、2)
      ● DAC通道x的8位右对齐数据保持寄存器 DAC_DHR8Rx (x=1、2)
    双DAC通道模式:总共有3个DAC_DHRyyyD寄存器
      ● 双DAC的12位右对齐数据保持寄存器 DAC_DHR12RD
      ● 双DAC的12位左对齐数据保持寄存器 DAC_DHR12LD
      ● 双DAC的8位右对齐数据保持寄存器 DAC_DHR8RD
➢ 内部的数据保存寄存器x
  ● 内部的数据保存寄存器1:DHR1
  ● 内部的数据保存寄存器2:DHR2
◆ DAC数据格式
  根据选择的配置模式,数据按照下文所述写入指定的寄存器:
  ● 单DAC通道x,有3种情况:
    ─ 8位数据右对齐:用户须将数据写入寄存器DAC_DHR8Rx[7:0]位(实际是存入寄存器DHRx[11:4]位)
    ─ 12位数据左对齐:用户须将数据写入寄存器DAC_DHR12Lx[15:4]位(实际是存入寄存器DHRx[11:0]位)
    ─ 12位数据右对齐:用户须将数据写入寄存器DAC_DHR12Rx[11:0]位(实际是存入寄存器DHRx[11:0]位)
  根据对DAC_DHRyyyx寄存器的操作,经过相应的移位后,写入的数据被转存到DHRx寄存器中(DHRx是内部的数据保存寄存器x)。随后,DHRx寄存器的内容或被自动地传送到DORx寄存器,或通过软件触发或外部事件触发被传送到DORx寄存器。
在这里插入图片描述◆ DAC通道x数据输出寄存器DAC_DORx寄存器
  DAC通道2数据输出寄存器(DAC_DOR1)
在这里插入图片描述
  DAC通道1数据输出寄存器(DAC_DOR2)
在这里插入图片描述
◆ 触发配置
 由DAC控制寄存器DAC_CR的第2位TEN1和第18位TEN2分别控制DAC的通道1和通道2是否使能触发。
在这里插入图片描述
 如果使能触发,即寄存器DAC_CR的TENx位置’1’,DAC转换可以配置为由某外部事件或软件触发。
 配置DAC_CR寄存器的控制位TSELx[2:0]可以选择8个触发事件之一触发DAC转换。
 如果配置为软件触发,则需要通过对DAC软件触发寄存器DAC_SWTRIGR相应的SWTRIGx位置’1’ 。
 触发发生后,3个APB1时钟周期后,最近存放在寄存器DAC_DHRx中的数据会被传送到寄存器DAC_DORx中,转换即开始。
◆ DAC转换及输出总结:
 针对单DAC模式,无触发
 ● 不能直接对寄存器DAC_DORx写入数据,任何输出到DAC通道x的数据都必须写入DAC_DHRyyyx数据保持寄存器。
 ● 写入DAC_DHRyyyx寄存器的数据经过相应的移位后,被转存到内部的数据保存寄存器x(DHRx寄存器)中。
 ● 如果没有使能触发(寄存器DAC_CR的TENx位置’0’),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx。
 ● 一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间tSETTLING之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。
在这里插入图片描述
(3)DAC输出电压
  数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。
  任一DAC通道引脚上的输出电压满足下面的关系:
    DAC输出 = VREF x (DOR / 4095)
(4)使能DAC通道
  将DAC_CR寄存器的ENx位置’1’即可打开对DAC通道x的供电。经过一段启动时间tWAKEUP,DAC通道x即被使能。
  注意: ENx位只会使能DAC通道x的模拟部分,即便该位被置’0’,DAC通道x的数字部分仍然工作。
(5)DAC输出缓存
  DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭。

二、STM32DAC库函数配置

  以设置DAC模块的通道1来输出模拟电压为例
1.开启PA口和DAC时钟,设置PA4为模拟输入

RCC_APB1PeriphClockCmd()
RCC_APB2PeriphClockCmd()
GPIO_Init()

GPIO_InitTypeDef GPIO_InitStructure;
//开启PA口和DAC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );//使能PA口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );//使能DAC通道时钟
//设置PA4为模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

2.初始化DAC,设置DAC的工作模式

void DAC_Init(uint32_t DAC_Channel,
DAC_InitTypeDef* DAC_InitStruct)

  参数设置结构体类型DAC_InitTypeDef的定义:

typedef struct
{
uint32_t DAC_Trigger; //用来设置是否使用触发功能
uint32_t DAC_WaveGeneration; //用来设置是否使用波形发生
uint32_t DAC_LFSRUnmask_TriangleAmplitude;//用来设置屏蔽/幅值选择器,这个变量只在
使用波形发生器的时候才有用
uint32_t DAC_OutputBuffer; //用来设置输出缓存控制位
}DAC_InitTypeDef

  第一个参数 DAC_Trigger 用来设置是否使用触发功能,前面已经讲解过这个的含义,这里我们不是用触发功能,所以值为 DAC_Trigger_None。
  第二个参数 DAC_WaveGeneratio 用来设置是否使用波形发生,这里我们前面同样讲解过不使用。所以值为 DAC_WaveGeneration_None。
  第三个参数 DAC_LFSRUnmask_TriangleAmplitude 用来设置屏蔽/幅值选择器,这个变量只在使用波形发生器的时候才有用,这里我们设置为 0 即可,值为DAC_LFSRUnmask_Bit0。
  第四个参数 DAC_OutputBuffer 是用来设置输出缓存控制位。
  代码:

DAC_InitTypeDef DAC_InitType;
DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1 输出缓存关闭
DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化 DAC 通道 1

3.使能DAC转换通道

void DAC_Cmd(uint32_t DAC_Channel
FunctionalState NewState)

DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC通道1

4.设置DAC的输出值

void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)

  第一个参数设置对齐方式。可以为:
    12位右对齐DAC_Align_12b_R,
    12位左对齐DAC_Align_12b_L,
    8位右对齐DAC_Align_8b_R方式。
  第二个参数就是DAC的输入值了。

DAC_SetChannel1Data(DAC_Align_12b_R, 400); //12位右对齐数据格式设置DAC值

  读出DAC的数值,函数是:

uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel)

DAC_GetDataOutputValue(DAC_Channel_1);

参考资料

1.STM32 DAC工作原理
2.【STM32】DAC基本原理、寄存器、库函数(DAC一般步骤)

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐