stm32f103zet6_DAC_2_输出电压

news2024/11/23 0:51:39

实现效果

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 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1648801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5月6(信息差)

🌍一次预测多个token,Meta新模型推理加速3倍,编程任务提高17% https://hub.baai.ac.cn/view/36857 🎄 LeetCode 周赛超越 80% 人类选手,推理性能超 Llama3-70B。 ✨ 我国量子计算机实现“四算合一” 实现通算、…

CAPL如何实现TLS握手认证

CAPL有专门的章节介绍如何实现TLS握手认证的函数: CAPL调用哪些函数实现TLS握手认证,需要了解TLS在整个通信过程的哪个阶段。 首先TCP需要建立连接,这是TLS握手的前提。当TLS握手认证完成后,可以传输数据。 所以TLS握手开始前需要确保TCP建立连接,TCP传输数据前需要确保…

5.6代码

1.最大公约数 这个题最重要的是要找到一个区间是1&#xff0c;找到之后就可以直接加次数就可以了 #include <bits/stdc.h>using namespace std;main() {long long n,i,j,a0,b,ans99999;cin>>n;long long s[n],dp[n][n];for(i0;i<n;i){cin>>s[i];if(s[i]1…

五一 作业

#include <iostream>using namespace std; class Num { private:int a; public:Num() {}Num(int a):a(a){}//设置a的值void set(int a){this->aa;}//1-a的和void Sum(){if(a<1){cout<<"a<1"<<endl;return;}int sum0;for(int i1;i<a;i)…

荧光纳米纤维膜的优点

荧光纳米纤维膜是一种具有荧光特性的纳米纤维材料&#xff0c;它结合了纳米纤维的良好性能和荧光物质的发光特性&#xff0c;在多个领域具有潜在的应用价值。 荧光纳米纤维膜可以通过不同的制备方法得到&#xff0c;其中一种常见的方法是利用荧光物质对纳米纤维进行修饰或掺杂。…

如何从Windows 10电脑远程登录Ubuntu系统

要从Windows 10电脑远程登录Ubuntu系统&#xff0c;您可以使用以下步骤&#xff1a; 在Ubuntu上安装xRDP: 首先&#xff0c;在Ubuntu电脑上打开终端&#xff0c;然后输入以下命令来安装xRDP服务&#xff1a; sudo apt update sudo apt install xrdpxRDP是一个开源的远程桌面协议…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

QT开发(四) 制作一个JSON检查小工具

1、JSON概念 1.1 定义 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它易于人类阅读和编写&#xff0c;同时也易于机器解析和生成。JSON基于JavaScript语言的子集&#xff0c;但是独立于编程语言&#xff0c;因此可以被多种…

JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式

技术栈 1. 开发语言&#xff1a;JAVA 2. 数据库&#xff1a;MySQL 3. 后端框架&#xff1a;Spring boot 4. 前端框架&#xff1a;VUE2 5. 电子班牌&#xff1a; Android 7.1 6. 小程序&#xff1a;原生开发 7. 多学校Saas 模式 电子班牌是一款智慧校园管理工具&#xf…

Kubernetes核心概念基本操作

1.1 Namespace命名空间 1.1.1 Namespace核心概念 Kubernetes 的 Namespace&#xff08;命名空间&#xff09;是一种用于创建逻辑隔离分区的机制&#xff0c;它的主要作用是用来实现多套环境的资源隔&#xff0c;它允许用户在同一个物理集群中模拟出多个虚拟集群的效果。以下是…

cmake的使用方法: 将源文件组织到不同的目录

一. 简介 前面几篇文章学习了cmake工具针对单个 .c文件的编译方法。 cmake针对含有多个 .c文件的工程的使用编译。cmake工程编译是如何实现编译生成库文件。 本文学习一下另一种情况&#xff1a;当源文件组织到不同的目录下时&#xff0c;cmake工具该如何编译工程。 二. c…

C++继承 - 下

目录 1. 继承和友元 2. 继承与静态成员 3. 菱形继承以及菱形虚拟继承 3.1. 单继承 3.2. 多继承 3.3. 菱形继承 3.4. 菱形虚拟继承 3.5. 菱形继承的底层细节 3.6. 菱形虚拟继承的底层细节 3.7. 虚拟继承 4. 继承的总结 5. 相关继承练习题 5.1. 如何定义一个无法被继…

Android:弹出对话框方式梳理一览(一)

Android&#xff1a;弹出对话框方式梳理一览&#xff08;一&#xff09; Guide&#xff5c;导言 在Android开发中&#xff0c;对话框可能是我们与用户交互的非常常用的方式&#xff0c;包括弹出一个小界面&#xff0c;可能在实际场景中都非常实用。本篇文章主要就是对Android弹…

陪诊系统|陪诊小程序成品|陪诊系统功能

随着人们对健康的日益关注以及医疗技术的不断进步&#xff0c;陪诊小程序应运而生&#xff0c;通过提供陪同就医、医疗服务和健康管理等功能为患者和家庭成员提供了更多的便利和选择。本文将分析陪诊小程序的关键功能&#xff0c;以便更好地理解其在医疗领域的作用。 在陪诊小程…

分布式任务调度工具 XXL-JOB

默认的账号密码是&#xff1a;admin/123456 一&#xff0c;部署docker容器 docker run \ -e PARAMS"--spring.datasource.urljdbc:mysql://192.168.150.101:3306/xxl_job?Unicodetrue&characterEncodingUTF-8 \ --spring.datasource.usernameroot \ --spring.dataso…

GT资源-Clock资源

一、Transmitter 时钟分布 XCLK&#xff1a;在使用TX buffer的模式下&#xff0c;XCLK来源于TXOUTCLK。在使用TX bypassing的模式下XCLK来源于TXUSERCLK。TXUSRCLK是GTX/GTH中PCS的内部逻辑时钟。TXUSRCLK2是GT Transceiver 用户侧逻辑时钟。 TXUSRCLK与TXUSRCLK2的关系 FPGA …

阿赵UE引擎C++编程学习笔记——信息打印输出

大家好&#xff0c;我是阿赵。   在之前介绍HelloWorld的时候&#xff0c;使用了一个打印的命令&#xff0c;把HelloWorld输出到输出日志里面。   对于我们编写程序代码来说&#xff0c;有2个手段是对程序差错非常重要的&#xff0c;一个是断点&#xff0c;另外一个是输出日…

很快就可以试用Domino 15了

大家好&#xff0c;才是真的好。 前几天在比利时的安普卫特举办的Engage2024大会已经结束&#xff0c;流出的现场照片很多&#xff0c;主要是会议场地照片很多&#xff0c;说是令人震撼&#xff1b;可惜这次一手的PPT和会议内容不多.是的&#xff0c;本来我也是在等与会者写的…

安装Jupyter notebook NbExtensions遇到的问题

在安装 Jupyter notebook NbExtensions 时&#xff0c;使用下列代码&#xff1a; pip install jupyter_nbextensions_configurator jupyter_contrib_nbextensions jupyter contrib nbextension install --user jupyter nbextensions_configurator enable --user ——————…

获取京东商品详情,API返回值说明全攻略

京东商品详情API是开发者获取京东平台上商品详细信息的重要工具。通过调用API并解析返回的响应数据&#xff0c;您可以快速获取商品的各项属性&#xff0c;如商品ID、标题、价格、图片等。下面&#xff0c;我们将为您详细介绍京东商品详情API的返回值说明&#xff0c;帮助您更好…