stm32f103zet6_DAC_2_输出电压

实现效果

DAC输出的电压

同过电压表测量电压

1.DAC配置的步骤

  1. 初始化DAC时钟。
  2. 配置DAC的GPIO端口。
  3. 设置DAC的工作模式(例如,是否使用触发功能,是否启用DAC中断等)。
  4. 启动DAC。

2常用的函数

函数

  1. HAL_DAC_Start() - 开启指定的DAC通道。
  2. HAL_DAC_Stop() - 停止指定的DAC通道。
  3. HAL_DAC_Start_DMA() - 开启DAC并启动DMA(直接存储器访问)模式。
  4. HAL_DAC_Stop_DMA() - 停止DAC DMA模式。
  5. HAL_DAC_SetValue() - 设置指定DAC通道的输出值
  6. HAL_DAC_GetValue() - 获取指定DAC通道的输出值(如果支持)。
  7. HAL_DACEx_TriangleWaveGenerate() - 启用三角波生成模式。
  8. HAL_DACEx_NoiseWaveGenerate() - 启用噪声波生成模式。
  9. HAL_DACEx_DualSetValue() - 如果微控制器支持双DAC,此函数用于同时设置两个通道的值。
  10. HAL_DACEx_DualStart() - 同时启动两个DAC通道。
  11. HAL_DACEx_DualStop() - 同时停止两个DAC通道。

函数讲解

  1. HAL_DAC_Start()
    • 原型:HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel)
    • 说明:启动指定的DAC通道,使其开始转换数字信号到模拟信号。hdac是DAC句柄,Channel指定要启动的通道(DAC_CHANNEL_1或DAC_CHANNEL_2)。
  2. HAL_DAC_Stop()
    • 原型:HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel)
    • 说明:停止指定的DAC通道,停止模拟信号的输出。hdac是DAC句柄,Channel指定要停止的通道。
  3. HAL_DAC_Start_DMA()
    • 原型:HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment)
    • 说明:启动DAC通道,并开始使用DMA进行数据传输。pData是指向要传输的数据的指针,Length是数据的长度,Alignment指定数据对齐方式。
  4. HAL_DAC_Stop_DMA()
    • 原型:HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel)
    • 说明:停止DAC的DMA传输。hdac是DAC句柄,Channel指定要停止DMA的通道。
  5. HAL_DAC_SetValue()
    • 原型:HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)
    • 说明:设置指定DAC通道的输出值。Channel ,通道选择。Data是要设置的值,Alignment指定数据对齐方式。
  6. HAL_DAC_GetValue()
    • 原型:uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel)
    • 说明:获取指定DAC通道的输出值。注意,DAC通常不支持读取输出值,因此这个函数可能不可用。
  7. HAL_DACEx_TriangleWaveGenerate()
    • 原型:HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t TriangleAmplitude)
    • 说明:启用DAC的三角波生成模式。TriangleAmplitude指定三角波的幅度。
  8. HAL_DACEx_NoiseWaveGenerate()
    • 原型:HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude)
    • 说明:启用DAC的噪声波生成模式。Amplitude指定噪声波的幅度。
  9. HAL_DACEx_DualSetValue()
    • 原型:HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef* hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2)
    • 说明:如果微控制器支持双DAC,这个函数用于同时设置两个通道的值。
  10. HAL_DACEx_DualStart()
    • 原型:HAL_StatusTypeDef HAL_DACEx_DualStart(DAC_HandleTypeDef* hdac)
    • 说明:同时启动两个DAC通道。
  11. HAL_DACEx_DualStop()
    • 原型:HAL_StatusTypeDef HAL_DACEx_DualStop(DAC_HandleTypeDef* hdac)
    • 说明:同时停止两个DAC通道。

这些函数返回HAL_StatusTypeDef类型,表示操作的状态(如HAL_OK表示操作成功,HAL_ERROR表示操作失败)。在使用这些函数时,需要确保已经正确初始化了DAC句柄和相关硬件配置。

3  STM32cude设置

1设置时钟

2打开DAC

下图为DAC的通道第三个选项为是否打开外部触发源

下图为DAC的参数设置

为是否打开缓冲

选择外部触发源的选择

4代码设置

DAC值 = (期望电压 / 参考电压) * 最大值

如    uint32_t dacValue = (3.0f / 3.3f) * 4095; // 计算出输出3.0V对应的DAC值

main文件源码

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dac.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* 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_DAC_Init();
  /* USER CODE BEGIN 2 */
	HAL_DAC_Start(&hdac,DAC1_CHANNEL_1);//开启dac使用通道1输出
	
	// DAC值 = (期望电压 / 参考电压) * 最大值
  uint32_t dacValue = (2.50f / 3.3f) * 4095; // 计算出输出3.0V对应的DAC值
	HAL_DAC_SetValue(&hdac,DAC1_CHANNEL_1,DAC_ALIGN_12B_R,dacValue);//输出值
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

STM32F103ZET6是一款由意法半导体(STMicroelectronics)生产的单片机芯片,它属于STM32F1系列的一员。这个芯片集成了一套数字模拟转换器(DAC),因此被称为STM32F103ZET6DACDAC是一种将数字信号转换为模拟信号的电子设备。在微控制器中,DAC通常用于将数字信号输出到外部设备或模拟电路中。例如,它可以用于控制音频播放器的音量,或者将数字信号转换为模拟电压来驱动电机。 STM32F103ZET6是一款64引脚的单片机芯片,它采用ARM Cortex-M3内核,拥有72MHz的工作频率和512KB的闪存存储器。它还内置了12位的DAC模块,具有2个独立的输出通道。 使用STM32F103ZET6DAC,我们可以通过软件编程来配置和控制DAC模块。我们可以设置DAC通道的工作模式,选择参考电压源,并将要输出的数字值写入DAC数据寄存器。然后,DAC模块将自动将数字值转换为相应的模拟电压输出。 对于开发人员来说,通过使用STM32F103ZET6DAC,我们可以实现一些有趣的应用,例如音频处理、波形发生器、电压控制等。此外,STM32F1系列芯片还提供了丰富的开发工具和软件库,使得开发者能够更轻松地进行软件开发和代码移植。 总而言之,STM32F103ZET6DAC是一款功能强大的单片机芯片,它集成了DAC模块,可以实现数字信号到模拟信号的转换。它是开发数字与模拟转换应用的理想选择,并为开发者提供了丰富的开发工具和软件库的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值