使用DAC 产生模拟电压,在使用ADC读取模拟电压,在串口显示。 注意:需要拿排线把DAC 的串口和ADC采集的串口连接起来。
1、简介
STM32的 DAC模块 (数字 /模拟转换模块 )是 12位数字输入,电压输出 型的 DAC。 DAC可以配置为 8位或 12位模式,也可以与 DMA控制器配合使用。 DAC工作在 12位 模式时,数据可以设置成左对齐或右对齐。 DAC模块有 2个输出通道,每个通道都有单独的转换器。在双 DAC模式下, ,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2个通道的输出。
STM32的 DAC模块主要特点有:
2个 DAC转换器:每个转换器对应 1个输出通道
8位或者 12位单调输出
12位模式下数据左对齐或者右对齐
同步更新功能
噪声波形生成
三角波形生成
双 DAC通道同时或者分别转换
每个通道都有 DMA功能
2、创建工程
开启调试:
选这时钟:
开启串口1:
开启DAC:
开启ADC采集:
3、编写代码
重定向printf 函数,可以直接放在main.c里面:
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
uint8_t u_buf[256];//串口数据发送变量
#define printf(...) HAL_UART_Transmit((UART_HandleTypeDef *)&huart1, (uint8_t *)u_buf,\
sprintf((char*)u_buf,__VA_ARGS__), 0xFFFF);
定义DAC ADC变量保存。
/* USER CODE BEGIN 1 */
int16_t DAC_Value;
int16_t ADC2_Value;
/* USER CODE END 1 */
开启DAC ADC:
/* USER CODE BEGIN 2 */
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
HAL_ADC_Start(&hadc2);
/* USER CODE END 2 */
main函数循环部分:
int main(void)
{
/* USER CODE BEGIN 1 */
int16_t DAC_Value;
int16_t ADC2_Value;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_DAC_Init();
MX_ADC2_Init();
/* USER CODE BEGIN 2 */
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
HAL_ADC_Start(&hadc2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (DAC_Value >= 3967)
{
DAC_Value = 0;
}
DAC_Value += 128;
printf("DAC Value : %d \r\n",DAC_Value);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_Value);//改变DAC值
HAL_Delay(500);
HAL_ADC_Start(&hadc2);
HAL_ADC_PollForConversion(&hadc2, 50);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC))
{
ADC2_Value = HAL_ADC_GetValue(&hadc2);
printf("ADC2 Reading : %d \r\n",ADC2_Value);
printf("PA6 Voltage : %.3f \r\n",ADC2_Value*3.3f/4096);
printf("\r\n");
}
HAL_Delay(2000);
}
/* USER CODE END 3 */
}
在串口就可以看到,转换的DAC 被ADC采集显示,但是2个数结果有点误差,有可能是排线引起的。