一:STM32 DAC知识分享:
STM32F103 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC.DAC 可以配置为 8位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有2个输出通道,每个通道都有单独的转换器。在双 DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压 Vref+(同 ADC共用)以获得更精确的转换结果。
二:STM32 DAC的特点:
STM32 的 DAC 模块主要特点有:
12个 DAC 转换器:每个转换器对应1个输出通道8 位或者12位单调输出
12 位模式下数据左对齐或者右对齐
同步更新功能
噪声\三角波形生成
双 DAC 双通道同时或者分别转换
每个通道都有 DMA 功能
三:STM32 cube MX 软件配置如下:
四:软件配置如下:
4.1 DAC的初始化:
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 OUT1 config */ sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN DAC_Init 2 */ /* USER CODE END DAC_Init 2 */ }
4.2 设置DAC的引脚的输出电压:
void dac_set_voltage(uint8_t outx, uint16_t vol) { double temp = vol; temp /= 1000; temp = temp * 4096 / 3.3; if (temp >= 4096)temp = 4095; /* 如果值大于等于4096, 则取4095 */ if (outx == 1) /* 通道1 */ { HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */ } else /* 通道2 */ { HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */ } }
4.3 设置输出DAC的 引脚输出三角波:
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n) { uint16_t i, j; float incval; /* 递增量 */ float Curval; /* 当前值 */ if((maxval + 1) <= samples)return ; /* 数据不合法 */ incval = (maxval + 1) / (samples / 2); /* 计算递增量 */ for(j = 0; j < n; j++) { Curval = 0; HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval); /* 先输出0 */ for(i = 0; i < (samples / 2); i++) /* 输出上升沿 */ { Curval += incval; /* 新的输出值 */ HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval); delay_us(dt); } for(i = 0; i < (samples / 2); i++) /* 输出下降沿 */ { Curval -= incval; /* 新的输出值 */ HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval); delay_us(dt); } } }
五:实物验证如下: