DAC实验
此文章仅限于记录个人知识盲区,没有指导作用,如果有任何疑问,欢迎在评论区提问讨论~
DAC
STM32L475 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数 据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输 出。DAC 可以通过引脚输入参考电压 Vref+(通 ADC 共用)以获得更精确的转换结果。
STM32L475 的 DAC 模块主要特点有:
-
1 个 DAC 转换器,最多两个输出通道
-
12 位模式下数据左对齐或者右对齐
-
同步更新功能
-
噪声波形生成
-
三角波形生成
-
双 DAC 通道同时或者分别转换
每个通道都有 DMA 功能 单个 DAC 通道的框图如图所示:
配置过程
本实验将使用 DAC1 的通道 1 来输出模拟电压。这里我们用到的库函数以及相关定义分布在文件 stm32l4xx_hal_dac.c 以及头文件 stm32l4xx_hal_dac.h 中。
实现上面功能的详细设置步骤如下:
1)开启 DAC 和 PA 口时钟,设置 PA4 为模拟输入。
2)初始化 DAC,设置 DAC 的工作模式。
3)使能 DAC 转换通道
4)设置 DAC 的输出值。
HAL库配置函数
1)开启 DAC 和 PA 口时钟,设置 PA4 为模拟输入。
一般在HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)函数内:
__HAL_RCC_DAC_CLK_ENABLE(); //使能 DAC 时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启 GPIOA 时钟
GPIO_Initure.Pin=GPIO_PIN_4; //PA4
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟
GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
2)初始化 DAC,设置 DAC 的工作模式。
成员变量DAC_Trigger用来设置DAC触发类型,DAC_OutputBuffer用来设置输出缓冲
DAC_HandleTypeDef DAC1_Handler; DAC_ChannelConfTypeDef DACCH1_Config;
DAC1_Handler.Instance=DAC; HAL_DAC_Init(&DAC1_Handler); //初始化 DAC
DACCH1_Config.DAC_Trigger=DAC_TRIGGER_NONE; //不使用触发功能
DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE; HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH1_Config,DAC_CHANNEL_1); //该函数用来配置DAC通道的出发类型以及输出缓冲。
3)使能 DAC 转换通道
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);
4)设置 DAC 的输出值。
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac,
uint32_t Channel, uint32_t Alignment,
uint32_t Data);
Alignment:
DAC_ALIGN_12B_R 12位右对齐
DAC_ALIGN_12B_L 12位左对齐
DAC_ALIGN_8B_R
Data:
要设置的DAC的值(0~ 4096)(000000000000~111111111111)
PS:在实验中可以配置ADC连接ADC和DAC, 用ADC测量DAC输出值。ADC的具体配置在上篇文章中涉及。
由0~ 4096到0~3.3v的公式:
temp = (float)adcx * (3.2 / 4096);