STM32-DAC


前言

前言写个参考吧
STM32 DAC+串口


一、理论介绍

DAC是数字模拟转换器(Digital to Analog Converter)的缩写,它是一种将数字信号转换为模拟信号的设备。在这里插入图片描述
在这里插入图片描述
RC有2个通道。
DAC的初始化

#include "DAC.h"

void DAC_init()
{
	//开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//配置PA4、PA5为模拟输入
	//PA4 ==> DAC_Channel_1
	//PA5 ==> DAC_Channel_2
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN ;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5 ; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//DAC初始化
	DAC_InitTypeDef DAC_InitStructure; 
	DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits11_0;
	DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;		//不使能缓存器[也就是电压跟随器],外部电路需要加功放
																		//如果使能,可能会导致误差
//	DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
	DAC_InitStructure.DAC_Trigger=DAC_Trigger_Software; //软件触发
	DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;		//不选择的波形发生器
	DAC_Init(DAC_Channel_1,&DAC_InitStructure);
	
	//使能DAC
	DAC_Cmd(DAC_Channel_1,ENABLE);
	
	DAC_SetChannel1Data(DAC_Align_12b_R, 2048);			//分辨率为12位 右对齐 电压范围  0-4095
												//每个位表示一个电压级别,总共可以表示2^12=4096个不同的电压级别
	DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);		//软件使能转换

}

void Set_DAC1(float value)  
{
	float  value1;
	value1 = value*4095/3.3;	//DAC输出 = VREF x (DOR/4095)	
	
	printf("输入的数值:%.2f V\r\n", value);	//串口查看数据的真实数据,调试一大思路
	printf("运算后的:%.2f V\r\n", value1);
//	value= (float)temp * 4096 / 3.3;
//	value=temp*4095/3.3;		
	DAC_SetChannel1Data(DAC_Align_12b_R,value1);
}

主要需要解释的一个是DAC的初始化
在这里插入图片描述

  • 1、DAC_Trigger
    指定所选DAC通道的外部触发
    此参数的值可以是 @ref DAC_trigger_selection

    • 1.1 参数介绍
      在这里插入图片描述
      • 1.1.1 DAC_Trigger_None
        加载DAC1_DHRxxxx寄存器后,转换是自动的,而不是通过外部触发

      • 1.1.2 DAC_Trigger_T6_TRGO
        TIM6 TRGO 被选为 DAC 通道的外部转换触发器

      • 1.1.3 DAC_Trigger_T8_TRGO
        TIM8 TRGO 被选为 DAC 通道的外部转换触发器
        仅在高精度设备中

      • 1.1.4 DAC_Trigger_T3_TRGO
        TIM8 TRGO 被选为 DAC 通道的外部转换触发器,仅适用于连接线、中密度和低密度超值线设备.
        [不知道是不是芯片解释手册写的有问题这里T3的解释变成了T8的。。。。]

      • 1.1.5 DAC_Trigger_T7_TRGO
        TIM7 TRGO被选为DAC通道的外部转换触发器

      • 1.1.6 DAC_Trigger_T5_TRGO
        TIM5 TRGO被选为DAC通道的外部转换触发器

      • 1.1.6 DAC_Trigger_T15_TRGO
        TIM15 TRGO 被选为 DAC 通道的外部转换触发器
        仅适用于中密度和低密度超值生产线设备

      • 1.1.7 DAC_Trigger_T2_TRGO
        TIM2 TRGO 被选为 DAC 通道的外部转换触发器

      • 1.1.8 DAC_Trigger_T4_TRGO
        TIM4 TRGO 被选为 DAC 通道的外部转换触发器

      • 1.1.9 DAC_Trigger_Ext_IT9
        EXTI Line9 事件被选为 DAC 通道的外部转换触发器

      • 1.1.10 DAC_Trigger_Software
        通过DAC通道的软件触发器启动转换

  • 2、DAC_WaveGeneration
    指定DAC通道噪声波还是三角波
    是否生成,或者是否未生成波。
    此参数的值可以是 @ref DAC_wave_generation

  • 3、DAC_LFSRUnmask_TriangleAmplitude
    指定用于生成噪声波的 LFSR 模板或
    DAC通道的最大振幅三角形生成。
    此参数的值可以是 @ref DAC_lfsrunmask_triangleamplitude
    在这里插入图片描述
    这个参数,在不使用波形发生的时候一般不用,就是直接选DAC_LFSRUnmask_Bit0。

  • 4、 DAC_OutputBuffer
    指定是启用还是禁用DAC通道输出缓冲器,
    此参数的值可以是 @ref DAC_output_buffer

    • 4.1 参数介绍
      在这里插入图片描述
      STM32的这个输出缓存使能虽然使输出能力强,但却会导致输出实际电压无法到0V.所以,一般情况下大家都不让它使能的,但是如果使能会提高驱动能力。
      -内部电压电压跟随器,选择驱动能力会增强【参考前言的参考博文和以下的】
      STM32的DAC输出驱动电压

二、DAC代码

#include "DAC.h" 

void DAC_init()
{
	//开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//配置PA4、PA5为模拟输入
	//PA4 ==> DAC_Channel_1
	//PA5 ==> DAC_Channel_2
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN ;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5 ; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//DAC初始化
	DAC_InitTypeDef DAC_InitStructure; 
	DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
	DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;		//不使能缓存器[也就是电压跟随器],外部电路需要加功放
																		//如果使能,可能会导致误差  DAC_OutputBuffer_Enable
	DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
	DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;		//不选择的波形发生器
	DAC_Init(DAC_Channel_1,&DAC_InitStructure);
	DAC_Init(DAC_Channel_2,&DAC_InitStructure);

	//使能DAC
	DAC_Cmd(DAC_Channel_1,ENABLE);
	DAC_Cmd(DAC_Channel_2,ENABLE);
	
	DAC_SetChannel1Data(DAC_Align_12b_R, 0);			//分辨率为12位 右对齐 电压范围  0-4095
												//每个位表示一个电压级别,总共可以表示2^12=4096个不同的电压级别
	DAC_SetChannel2Data(DAC_Align_12b_R, 0);
}



void Set_DAC1(float value)  
{
	float  value1;
	value1 = value*4095/3.3;	//DAC输出 = VREF x (DOR/4095)		
	DAC_SetChannel1Data(DAC_Align_12b_R,value1);
}

void Set_DAC2(float value)  
{
	float  value1;
	value1 = value*4095/3.3;	//DAC输出 = VREF x (DOR/4095)		
	DAC_SetChannel2Data(DAC_Align_12b_R,value1);
}

关于完整的DAC的代码,使能通道打开,提高了驱动能力。但是我还是觉得,这个输出算的很奇怪。因为在万用表的输出来说,这个是正确的,但是在串口打印变量出来数值很奇怪。 ------------------------------------2024/5/11

三、实验结果


总结

这篇文章依旧没有总结

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值