目录
概述
1 STM32Cube配置项目
1.1 软件版本信息
1.2 配置DAC模块参数
1.3 GENERATE Project
2 DAC库函数介绍
2.1 初始化函数:HAL_DAC_Init
2.2 启动DAC数据转换:HAL_DAC_Start
2.3 停止DAC数据转换:HAL_DAC_Stop
2.4 设置通道数据函数:HAL_DAC_SetValue
3 功能代码实现
3.1 数据配置函数
3.2 初始化函数
4 测试
4.1 测试代码实现
4.2 运行结果
概述
本文主要讲述STM32F103芯片DAC模块模块的使用方法,包括使用STM32Cube工程生成工程项目。还介绍了FW_F1_V1.8.5中和DAC模块相关的库函数的使用方法。最后,编写一个案例,使用DAC模块输出模拟电压,使用ADC模块检测该电压的值。比较其是否一致。
1 STM32Cube配置项目
1.1 软件版本信息
软件名称 | 版本信息 |
---|---|
STM32Cube | STM32CubeMX 6.11 |
STM32 HAL | STM32Cube_FW_F1_V1.8.5 |
KEIL(编译软件) | Version: 5.38.0.0 |
1.2 配置DAC模块参数
1)使能DAC模块,笔者选择OUT2作为输出端口
2)使能输出Buff
3)IO口选择,选择PA5端口作为输出接口
1.3 GENERATE Project
完成参数配置后,就可以生成项目,点击GENERATE生成项目如下:
2 DAC库函数介绍
2.1 初始化函数:HAL_DAC_Init
函数原型:
HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac);
功能介绍:
根据指定的参数初始化DAC外设在DAC_InitStruct中初始化相关句柄。
参数介绍:
hdac: 指向DAC_HandleTypeDef结构体的指针,该结构体包含指定DAC的配置信息。
2.2 启动DAC数据转换:HAL_DAC_Start
函数原型:
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
功能介绍:
根据指定的参数初始化DAC外设在DAC_InitStruct中初始化相关句柄,启动对应通道DAC转换数据功能。
参数介绍:
hdac: 指向DAC_HandleTypeDef结构体的指针,该结构体包含指定DAC的配置信息。
Channel: 通道号
2.3 停止DAC数据转换:HAL_DAC_Stop
函数原型:
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel);
功能介绍:
根据指定的参数初始化DAC外设在DAC_InitStruct中初始化相关句柄,停止对应通道DAC转换数据功能。
参数介绍:
hdac: 指向DAC_HandleTypeDef结构体的指针,该结构体包含指定DAC的配置信息。
Channel: 通道号
2.4 设置通道数据函数:HAL_DAC_SetValue
函数原型:
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
功能介绍:
根据指定的参数初始化DAC外设在DAC_InitStruct中初始化相关句柄,停止对应通道DAC转换数据功能。
参数介绍:
hdac: 指向DAC_HandleTypeDef结构体的指针,该结构体包含指定DAC的配置信息。
Channel: 通道号
Alignment: 字节对其方式和bit位个数
Data: DAC通道要传递的值
3 功能代码实现
3.1 数据配置函数
函数91行: 调用HAL_DAC_SetValue函数配置DAC数值
Alignment配置为DAC_ALIGN_12B_R
3.2 初始化函数
代码37~58行:为STM32Cube自动生成的代码,完成DAC功能初始化
代码60行:配置通道的数据
代码61行:启动DAC数值转换功能
源代码如下:
/* DAC init function */
void MX_DAC_Init(void)
{/* USER CODE BEGIN DAC_Init 0 *//* USER CODE END DAC_Init 0 */DAC_ChannelConfTypeDef sConfig = {0};/* USER CODE BEGIN DAC_Init 1 *//* USER CODE END DAC_Init 1 *//** DAC Initialization*/hdac.Instance = DAC;if (HAL_DAC_Init(&hdac) != HAL_OK){Error_Handler();}/** DAC channel OUT2 config*/sConfig.DAC_Trigger = DAC_TRIGGER_NONE;sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_2) != HAL_OK){Error_Handler();}/* USER CODE BEGIN DAC_Init 2 */HAL_DAC_SetValue( &hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 100 );HAL_DAC_Start( &hdac, DAC_CHANNEL_2);/* USER CODE END DAC_Init 2 */}
4 测试
4.1 测试代码实现
由于笔者没有示波器用于测试模拟信号,于是使用一路ADC来转换DAC输出的模拟量。关于ADC功能的代码实现,可参考笔者其他文章在,合理只介绍DAC部分的实现方法。
测试代码如下:
ADC数据采集代码:
4.2 运行结果
ADC采集的数字量和DAC输出的模拟量的对应关系