STM32 CubeIDE DAC使用

STM32 CubeIDE DAC使用


使用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个数结果有点误差,有可能是排线引起的。

猜你喜欢

转载自blog.csdn.net/weixin_45488643/article/details/108243262