实验17:DAC数模转换实验

一、简介

    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功能

二、功能框图

实验17:DAC数模转换实验_第1张图片

    (1)引脚

实验17:DAC数模转换实验_第2张图片

    (2)转换

实验17:DAC数模转换实验_第3张图片

    (3)数据格式

实验17:DAC数模转换实验_第4张图片

    (4)触发选择

实验17:DAC数模转换实验_第5张图片

    (5)输出电压

实验17:DAC数模转换实验_第6张图片

三、初始化结构体

    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

五、程序

dac.h

#ifndef __DAC_H__
#define __DAC_H__


#include "stm32f4xx_conf.h"

void DAC_Config(void);
void DAC_Set_Vol(uint16_t vol);

#endif
 

dac.c

#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);
}
 

main.c

#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)
    {
        
    }
}

你可能感兴趣的:(STM32)