一、简介
DAC:数字/模拟转换器。
STM32的DAC模块是12位数字输入,电压输出型的DAC。
DAC可以配置为8位或12位模式,DAC工作在12位模式时,数据可以设置成左对齐或右对齐。
DAC可以与DMA控制器配合使用。
DAC模块有2个输出通道,每个通道都有单独的转换器。
在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。
DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。
特点:
① 2个DAC转换器:每个转换器对应1个输出通道
② 8位或者12位单调输出
③ 12位模式下数据左对齐或者右对齐
④ 同步更新功能
⑤ 噪声波形生成
⑥ 三角波形生成
⑦ 双DAC通道同时或者分别转换
⑧ 每个通道都有DMA功能
二、功能框图
(1)引脚
(2)转换
(3)数据格式
(4)触发选择
(5)输出电压
三、初始化结构体
typedef struct
{
uint32_t DAC_Trigger; //触发方式
DAC_Trigger_None
DAC_Trigger_T2_TRGO
DAC_Trigger_T4_TRGO
DAC_Trigger_T5_TRGO
DAC_Trigger_T6_TRGO
DAC_Trigger_T7_TRGO
DAC_Trigger_T8_TRGO
DAC_Trigger_Ext_IT9
DAC_Trigger_Software
uint32_t DAC_WaveGeneration; //是否自动输出噪声或三角波
DAC_WaveGeneration_None (不使用)
DAC_WaveGeneration_Noise (噪声)
DAC_WaveGeneration_Triangle(三角波)
uint32_t DAC_LFSRUnmask_TriangleAmplitude; //选择噪声生成器的低通滤波或三角波的幅值,非噪声或三角波输出模式下, 本配置无效。
DAC_LFSRUnmask_Bit0
DAC_LFSRUnmask_Bits1_0
DAC_LFSRUnmask_Bits2_0
DAC_LFSRUnmask_Bits3_0
DAC_LFSRUnmask_Bits4_0
DAC_LFSRUnmask_Bits5_0
DAC_LFSRUnmask_Bits6_0
DAC_LFSRUnmask_Bits7_0
DAC_LFSRUnmask_Bits8_0
DAC_LFSRUnmask_Bits9_0
DAC_LFSRUnmask_Bits10_0
DAC_LFSRUnmask_Bits11_0
DAC_TriangleAmplitude_1
DAC_TriangleAmplitude_3
DAC_TriangleAmplitude_7
DAC_TriangleAmplitude_15
DAC_TriangleAmplitude_31
DAC_TriangleAmplitude_63
DAC_TriangleAmplitude_127
DAC_TriangleAmplitude_255
DAC_TriangleAmplitude_511
DAC_TriangleAmplitude_1023
DAC_TriangleAmplitude_2047
DAC_TriangleAmplitude_4095
uint32_t DAC_OutputBuffer; //选择是否使能输出缓冲器。
DAC_OutputBuffer_Enable (使能)
DAC_OutputBuffer_Disable(禁止)
}DAC_InitTypeDef;
四、常用固件库函数
(1)初始化函数
void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);
参数:
DAC_Channel--->选择通道
DAC_Channel_1
DAC_Channel_2
DAC_InitStruct--->初始化结构体
(2)使能DAC函数
void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState);
参数:
DAC_Channel--->选择通道
DAC_Channel_1
DAC_Channel_2
NewState--->使能/失能
ENABLE
DISABLE
(3)设置DAC输出值
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data);//通道1
void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data);//通道2
参数:
DAC_Align--->对齐方式
DAC_Align_8b_R(8位右对齐)
DAC_Align_12b_L(12位左对齐)
DAC_Align_12b_R(12位右对齐)
Data--->设置的数据
(4)读取DAC输出值
uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel);
参数:
DAC_Channel--->选择通道
DAC_Channel_1
DAC_Channel_2
五、程序
#ifndef __DAC_H__
#define __DAC_H__
#include "stm32f4xx_conf.h"
void DAC_Config(void);
void DAC_Set_Vol(uint16_t vol);
#endif
#include "./DAC/dac.h"
/***********************
功能:配置DAC
参数:无
返回值:无
************************/
void DAC_Config(void)
{
GPIO_InitTypeDef initValue;
DAC_InitTypeDef dacInitValue;
/*1、打开时钟(GPIO和DAC)*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
/*2、配置GPIO的模拟输入功能*/
initValue.GPIO_Mode = GPIO_Mode_AIN;
initValue.GPIO_Pin = GPIO_Pin_4;
initValue.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA,&initValue);
/*3、初始化DAC通道1*/
dacInitValue.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
dacInitValue.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
dacInitValue.DAC_Trigger = DAC_Trigger_None;
dacInitValue.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_Init(DAC_Channel_1,&dacInitValue);
/*4、使能DAC通道1*/
DAC_Cmd(DAC_Channel_1,ENABLE);
/*5、设置DAC值*/
DAC_SetChannel1Data(DAC_Align_12b_R,0);
}
/****************************************
功能:设置通道1输出电压
参数:设置的数值(0~3300,代表0~3.3V)
返回值:无
*****************************************/
void DAC_Set_Vol(uint16_t vol)
{
double temp;
temp = vol/1000;
temp = (temp*4096)/3.3;
DAC_SetChannel1Data(DAC_Channel_1,temp);
}
#include "delay.h"
#include "stdio.h"
#include "./USART/usart.h"
#include "./DAC/dac.h"
int main(void)
{
uint16_t value;
//初始化延时函数
delay_init(168);
//初始化串口
USART_Config();
//初始化DAC
DAC_Config();
//设置DAC值
DAC_Set_Vol(2000);
//读取DAC值
value = DAC_GetDataOutputValue(DAC_Channel_1);
printf("value = %d \r\n",value);
while(1)
{
}
}