当前位置: 首页 > news >正文

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换


系列文章目录

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记01:赛事介绍与硬件平台

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记02:开发环境安装

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记03:G4时钟结构

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记04:从零开始创建工程模板并开始点灯

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记05:Systick滴答定时器

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记06:按键输入

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记07:ADC模数转换

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记08:LCD液晶屏

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记09:EEPROM

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记10:USART串口通讯

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记11:数字电位器MCP4017

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记13:RTC实时时钟

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记14:PWM捕获

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记16:第十四届省赛真题


目录

系列文章目录

前言

一、基础知识

二、程序设计

总结


前言

DAC是将数字量转化成模拟量的器件,我们可以通过编程来实现输出某个特定的电压值,也就是模拟量。STM32G4内部集成了一个DAC模块,我们通过对STM32的编程就可以实现在它的特定的管脚上输出一个特定的电压,当然这个电压是可以通过我们的程序进行变化的,比如我们可以让他输出一个三角波或者正弦波都是可以的,只要在0-3.3V的范围之内就可以。当然,DAC输出也会受限于内部DAC器件的位数和精度。

一、基础知识

首先我们要了解一下STM32的哪个管脚可以作为DAC输出来使用,我们可以打开数据手册,在第四章管脚描述的部分找到管脚定义,搜索DAC就可以找到。

PA4可以作为DAC1的输出1通道,PA5可以作为DAC1的输出2通道,所以PA4、PA5就是我们这个芯片的DAC输出管脚。

对应的开发板上有一个J3的排针,也就是我们的拓展接口。我们通过对PA4、PA5的排针进行电压测量就可以知道我们编程的正不正确(通过万用表或者示波器)。

我们再看一下参考手册中关于DAC的基本描述,可以看到它是一个12位的DAC,也就是可以输出的数字量的范围是0-4095,即0-FFF。它也可以配置成8位。在12位模式下,数据可以配置成左对齐或者右对齐,也就是要用两个字节来对它进行输出控制(因为8<12<16),如果是左对齐的话就是FFF0,如果是右对齐就是0FFF,我们一般是用右对齐,这样它的范围就是0-0FFF,也就是0到4095。(如果是左对齐,就是0000,0010-FFF0,就不是很方便,所以我们推荐用右对齐)。然后,DAC有两个输出通道,每个通道有自己独立的转换器,在双DAC通道模式下,转换可以独立发生也可以同时发生,这个看我们的编程,可以让他同时输出也可以单独输出。

然后我们主要看一下DAC的特性:

  • 有四个DAC接口,每个最多两个输出通道(我们这个芯片版本是阉割版本,因为管脚太少)
  • 可以设置左对齐或者右对齐的12位模式(只选右对齐就可以了)
  • 可以同步更新(我们也不需要用到)
  • 内置噪声波形和三角波形的发生
  • 内置锯齿波的发生
  • 双通道可以同时输出也可以独立输出
  • 可以用到DMA(用不到)
  • 可以由外部触发输出,也可以由软件控制输出
  • DAC输出模式由buffered模式和unbuffered模式(缓存机制:来一连串指令可以逐个输出,unbuffered模式则只输出最后一个,我们一般工作在buffered模式)
  • ……

这部分最关键的就是要知道我们的DAC的接口PA4、PA5,以及它是12位的右对齐。

二、程序设计

这部分主要就是讲如何在STM32上编程控制DAC的两个管脚输出电压,并且这个电压我们的程序是可以控制的。

首先我们看一下程序设计步骤:

1.将“模板”用CubeMX生成代码

2.配置DAC输出的IO口:PA4->DAC1_OUT1,PA5->DAC1_OUT2

3.DAC输出模式:输出到外部引脚(connected to external pin)

4.将dac.c和dac.h移植到“编程工程”

  • main.c包含dac.h
  • 添加DAC相关的HAL库驱动文件
  • 在conf.h文件中启动DAC模块
  • DAC1初始化(MX_DAC1_Init)
  • 调用HAL_DAC_SetValue和HAL_DAC_Start函数编写程序

如图配置引脚:

设置外部引脚输出(不用勾选外部触发,用软件输出就可以了):

其他的不需要配置,保持默认就可以了。然后我们生成代码。有的人可能会问DAC要不要配置时钟,我们这里是不需要的,用系统时钟就可以了,因为DAC的触发主要是通过外部触发或者内部软件触发,所以时钟是不需要进行配置的。

生成代码后我们就可以把DAC进行移植,这个步骤我们之前已经进行过很多次了,程序设计步骤中写的也很详细,就不细说了。

然后我们就可以用HAL_DAC_SetValue()和HAL_DAC_Start()来编写程序生成电压。HAL_DAC_SetValue()有四个参数,第一个是DAC的处理结构体,直接写&hadc1就行了。第二个参数是它的通道,DAC_CHANNEL_1或者DAC_CHANNEL_2。第三个参数是对齐方式,我们前面说到是用12位右对齐,所以是DAC_ALIGN_12B_R。第四个是输入的数据(0-4095)。4095对应的就是3.3V,如1365对应的就是1.1V 。

这些参数的定义都是可以在函数定义里面找到的,如果考场上记不住就直接到定义里找。

例如:

HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,1365)

就是在PA4上输出1365的模拟电压1.1V(因为4095/3=1365)

设置完DAC的值后要启动一下HAL_DAC_Start(&hdac1,DAC_CHANNEL_1),这个参数只需要写一个是哪个结构体和哪个通道就可以了。

void DAC_Process(void)
{HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_L,1365);HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);//PA4输出1.1VHAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2,DAC_ALIGN_12B_L,2730);HAL_DAC_Start(&hdac1,DAC_CHANNEL_2);//PA5输出2.2V
}while (1)
{DAC_Process();
}

需要注意的是我们DAC是先设值再启动,不同于ADC是先启动再设值。

当然,上面这个程序我们也可以这样写:

u8 dac_val1,dac_val2;
void DAC_Process(float dac_volt1,dac_volt2)
{dac_val1=dac_volt1/3.3f*4095;dac_val2=dac_volt2/3.3f*4095;HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_L,dac_val1);HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);//PA4输出1.1VHAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2,DAC_ALIGN_12B_L,dac_val2);HAL_DAC_Start(&hdac1,DAC_CHANNEL_2);//PA5输出2.2V
}while (1)
{DAC_Process(1.1f,2.2f);
}

这样调用的时候直接输入需要的电压就行了。

总结

这一节的重点在于要知道DAC的接口PA4、PA5,以及它是12位的右对齐,知道要配置外部引脚输出,还要会写HAL_DAC_SetValue()和HAL_DAC_Start()的程序。

相关文章:

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…...

迅饶科技 X2Modbus 网关 GetUser 信息泄露漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…...

修改亚马逊云科技账户的密码和MFA

要使用AWS CLI删除当前账户的多因素认证(MFA)设备并修改密码&#xff0c;你需要先确保已安装并配置了AWS CLI&#xff0c;并且你的账户有足够的权限执行这些操作。下面是如何分步进行的指导&#xff1a; 1. 删除MFA设备 首先&#xff0c;你需要找出MFA设备的序列号或ARN。可以…...

提升性能与精准追踪:SkyWalking自定义跟踪忽略插件

前言 当使用分布式追踪系统时&#xff0c;有时需要排除某些端点或路径&#xff0c;以减轻追踪系统的负载或减少不必要的数据收集。为了满足这种需求&#xff0c;SkyWalking 提供了一个可选的插件&#xff0c;即 apm-trace-ignore-plugin&#xff0c;它允许自定义需要跳过的路径…...

第十三届蓝桥杯大赛软件赛省赛CC++大学B组

第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组 文章目录 第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组1、九进制转十进制2、顺子日期3、刷题统计4、修建灌木5、x进制减法6、统计子矩阵7、积木画8、扫雷9、李白打酒加强版10、砍竹子 1、九进制转十进制 计算器计算即可。2999292。 2、…...

zookeeper监听集群节点的实现zkclient组件实现方案(Java版)

ZooKeeper Watcher 机制 client 向zookeeper 注册监听client注册的同时会存储一个WatchManager对象向zookeeper发生改变则notification client 并发送一个WatchManager对象,然后client再更新该对象 package com.jacky.zk.demo;import org.I0Itec.zkclient.IZkChildListener;…...

【ArduinoQuartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能

【Arduino&Quartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能 一、将Reindeer软核下载到STEP CYC10&#xff08;一&#xff09;下载PulseRain Reindeer软核&#xff08;二&#xff09;配置Reindeer软核到开发板1.将sof文件转换为jic文件2.将jic文…...

【电路笔记】-逻辑与门

逻辑与门 文章目录 逻辑与门1、概述2、2 输入晶体管与门3、数字与门类型4、7408 四路 2 输入与门逻辑与门是一种数字逻辑电路,仅当其所有输入均为高电平时,其输出才会变为高电平至逻辑电平 1。 1、概述 数字逻辑与门的输出状态仅在其任何输入处于逻辑电平“0”时再次返回“低…...

蓝桥杯练习——拼出一个未来

选中 index.html 右键启动 Web Server 服务&#xff08;Open with Live Server&#xff09;&#xff0c;让项目运行起来。接着&#xff0c;打开环境右侧的【Web 服务】&#xff0c;就可以在浏览器中看到如下效果&#xff1a; 目标 完善 js/index.js 的 TODO 部分&#xff0c;实…...

stm32f103c8t6学习笔记(学习B站up江科大自化协)-SPI

SPI通信 SPI&#xff0c;&#xff08;serial peripheral interface&#xff09;&#xff0c;字面翻译是串行外设接口&#xff0c;是一种通用的数据总线&#xff0c;适用于主控和外挂芯片之间的通信&#xff0c;与IIC应用领域非常相似。 IIC无论是在硬件电路还是在软件时序设计…...

云计算的安全需求

目录 一、概述 二、云安全服务基本能力要求 三、信息安全服务&#xff08;云计算安全类&#xff09;资质要求 3.1 概述 3.2 资质要求内容 3.2.1 组织与管理要求 3.2.2 技术能力要求 四、云安全主要合规要求 4.1 安全管理机构部门的建立 4.2 安全管理规范计划的编制 4…...

【C++】编程规范之表达式原则

表达式中变量的位置 在编写表达式时&#xff0c;将变量放置在右边&#xff0c;可以提高代码的可读性和可理解性。这种做法符合自然语言的阅读习惯&#xff0c;使得代码更易于理解。 // Good if (5 x) {// do something }// Avoid if (x 5) {// do something }不变量和资源申…...

Python人工智能基础知识:理解神经网络与机器学习的基本概念

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是当今科技领域的热门话题之一&#xff0c;而神经网络和机器学习作为AI的两个重要分支&#xff0c;在解决各种问题中发挥着重要作用。本文将详细介绍神经网络和机器学习的基本概念&#xff0c;帮助读者更…...

10_MVC

文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例&#xff08;开发与Json相关接口&#xff09; 三层架构三层架构介绍 JSON JSON&#xff08;JavaScript Object Notation&#xff09; 是一种轻量级的数据交换格式&#xff0c;是存…...

【Java多线程(4)】案例:设计模式

目录 一、什么是设计模式&#xff1f; 二、单例模式 1. 饿汉模式 2. 懒汉模式 懒汉模式-第一次改进 懒汉模式-第二次改进 懒汉模式-第三次改进 一、什么是设计模式&#xff1f; 设计模式是针对软件设计中常见问题的通用解决方案。它们提供了一种被广泛接受的方法来解决…...

时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测

时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-BiLST…...

java面试题(4)|Spring和Spring Boot之间有什么关联和区别

文章目录 Spring和Spring Boot的有什么关联&#xff1f;Spring和Spring Boot有什么区别&#xff1f;如何快速区分某个项目采用的是 Spring 还是 Spring Boot&#xff1f; Spring和Spring Boot的有什么关联&#xff1f; Spring Boot是建立在Spring框架之上的&#xff0c;因此它…...

Spring Boot中前端通过请求接口下载后端存放的Excel模板

导出工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger;…...

构建企业级微服务平台:实现可扩展性、弹性和高效性

在软件开发的快速发展领域中&#xff0c;企业不断努力构建健壮、可扩展和高效的系统。随着微服务架构的出现&#xff0c;再加上云原生技术的应用&#xff0c;创建敏捷且具有弹性的平台的可能性是无限的。在本指南中&#xff0c;我们将深入探讨使用强大的工具和技术组合&#xf…...

存内计算技术在边缘计算、物联网设备中的应用及前景

存内计算技术简介 存内计算技术是一种新兴的计算范式&#xff0c;其核心理念是将存储和计算功能集成在同一硬件单元中。这种技术的优势在于能够在存储单元内部直接进行计算操作&#xff0c;从而减少数据在存储器和处理器之间的传输&#xff0c;提高计算效率。 以下是存内计算技…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...