【stm32】DAC实验(stm32f4hal库)

发布于:2025-02-23 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、DAC简介

1、DAC

        数字到模拟转换器(DAC)是一种电子设备,用于将数字信号转换为模拟信号。它通常用于将数字数据转换为模拟信号,以便在模拟电路中进行处理。DAC在许多领域都有广泛的应用,如音频设备、通信系统、仪器仪表等。通过DAC,数字系统可以与模拟电路交互,实现数字信号到模拟信号的转换。

2、DAC的特性参数

        分辨率(Resolution):指的是DAC能够产生的不同输出电压或电流的级数,通常以比特(Bit)表示。更高的分辨率意味着更精细的输出。

        量程(Full Scale Range):指的是DAC能够输出的最大和最小电压或电流范围。

        精度(Accuracy):指的是DAC输出值与理想值之间的误差。通常用百分比误差或最小刻度值来表示。

        电压和电流输出:DAC可以输出电压或电流信号,具体取决于应用需求。

        更新速度(Update Rate):指的是DAC在单位时间内可以更新输出值的次数。

        温度稳定性(Temperature Stability):DAC在不同温度下输出稳定性的能力。

        线性度(Linearity):指DAC输出值与输入值之间的直线关系程度。较高的线性度表示输出值与输入值更接近直线关系。

        功耗(Power Consumption):DAC的工作时所消耗的电能。

3、DAC 通道框图

二、stm32f4——DAC寄存器介绍

1、控制寄存器 (DAC_CR)

偏移地址: 0x00
复位值: 0x0000 0000

2、软件触发寄存器 (DAC_SWTRIGR)

偏移地址: 0x04
复位值: 0x0000 0000

3、1 通道 12 位右对齐数据保持寄存器 (DAC_DHR12R1)

偏移地址: 0x08
复位值: 0x0000 0000

4、1 通道 12 位左对齐数据保持寄存器 (DAC_DHR12L1)

偏移地址:0x0C
复位值: 0x0000 0000

5、1 通道 8 位右对齐数据保持寄存器 (DAC_DHR8R1)

偏移地址: 0x10
复位值: 0x0000 0000

6、2 通道 12 位右对齐数据保持寄存器 (DAC_DHR12R2)

偏移地址: 0x14
复位值: 0x0000 0000

7、2 通道 12 位左对齐数据保持寄存器 (DAC_DHR12L2)

偏移地址: 0x18
复位值: 0x0000 0000

8、2 通道 8 位右对齐数据保持寄存器 (DAC_DHR8R2)

偏移地址: 0x1C
复位值: 0x0000 0000

9、 DAC 12 位右对齐数据保持寄存器 (DAC_DHR12RD)

偏移地址: 0x20
复位值: 0x0000 0000

10、 DAC 12 位左对齐数据保持寄存器 (DAC_DHR12LD)

偏移地址: 0x24
复位值: 0x0000 0000

11、 DAC 8 位右对齐数据保持寄存器 (DAC_DHR8RD)

偏移地址: 0x28
复位值: 0x0000 0000

12、1 通道数据输出寄存器 (DAC_DOR1)

偏移地址: 0x2C
复位值: 0x0000 0000

13、2 通道数据输出寄存器 (DAC_DOR2)

偏移地址: 0x30
复位值: 0x0000 0000

14、状态寄存器 (DAC_SR)

偏移地址: 0x34
复位值: 0x0000 0000

三、HAL库相关API

1、HAL_DAC_Init()

功能:配置DAC工作状态

2、HAL_DAC_MspInit()

功能:配置NVIC、GPIO初始化代码

3、HAL_DAC_ConfigChannel()

功能:配置DAC相应通道的相关参数

4、HAL_DAC_Start

功能:启动DAC

5、HAL_DAC_SetValue()

功能:设置输出模拟量

6、HAL_DAC_GetValue()

功能:读取通道输出数字量

四、示例代码

1、DAC输出指定电压

#include "DAC.h"

DAC_HandleTypeDef DAC1_Initstructure;

void DAC_Init(void)
{
	DAC1_Initstructure.Instance = DAC;
	
	HAL_DAC_Init(&DAC1_Initstructure);
	
	DAC_ChannelConfTypeDef DAC_Channel;
	DAC_Channel.DAC_OutputBuffer = DAC_TRIGGER_NONE;//DAC触发源
	DAC_Channel.DAC_Trigger = DAC_OUTPUTBUFFER_DISABLE;//DAC通道输出缓冲区
	HAL_DAC_ConfigChannel(&DAC1_Initstructure,&DAC_Channel,DAC_CHANNEL_1);//配置DAC通道
	
	HAL_DAC_Start(&DAC1_Initstructure,DAC_CHANNEL_1);//开启DAC
}

void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{
	if(hdac->Instance == DAC)
	{
		__HAL_RCC_DAC_CLK_ENABLE();//开启DAC的时钟
		__HAL_RCC_GPIOA_CLK_ENABLE();//开启GPIOA的时钟
		
		GPIO_InitTypeDef GPIO_InitStructure;
		GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;//GPIO模式为模拟
		GPIO_InitStructure.Pin = GPIO_PIN_4;
		
		HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
	}
}

/* Vol 取值范围 : 0 - 3300*/
void Set_Voltage(uint16_t Vol)
{
	double temp = Vol;
	temp /= 1000;
	temp = temp * 4096 / 3.3;
	if(temp >= 4096) temp = 4095;
	HAL_DAC_SetValue(&DAC1_Initstructure,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp);
}