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

news2024/11/17 23:33:11

系列文章目录

嵌入式|蓝桥杯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.1V
    HAL_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.1V
    HAL_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()的程序。

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

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

相关文章

【Codesys】-扫描添加失败,手动添加第三方模块,真·DC模式的高速计数模块

欧姆龙耦合器&#xff08;NX-ECC201&#xff09;和高速计数模块&#xff08;NX-EC0132&#xff09;单独使用。扫描设备添加到Codesys中&#xff0c;会报错&#xff0c;无法自动添加。需要手动添加。内容方法如下。如遇到其他第三方耦合器解决方式也同下面一样。记录一下&#x…

三位数组合-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第42讲。 三位数组合&#…

MySql实战--事务到底是隔离的还是不隔离的

第3篇文章和你讲事务隔离级别的时候提到过&#xff0c;如果是可重复读隔离级别&#xff0c;事务T启动的时候会创建一个视图read-view&#xff0c;之后事务T执行期间&#xff0c;即使有其他事务修改了数据&#xff0c;事务T看到的仍然跟在启动时看到的一样。也就是说&#xff0c…

【zip技巧】4种方法,删除ZIP压缩包密码

之前给大家介绍了zip压缩包加密方法&#xff0c;那么zip压缩包取消密码&#xff0c;大家了解多少呢&#xff1f;有密码的情况下&#xff0c;有哪些方法可以取消密码&#xff1f;无密码又该如何取消密码&#xff1f;今天总结四个方法分享给大家。 一、 最原始的方法&#xff0…

“Hands-free AG audio“和“Stereo“的区别

用蓝牙连接耳机后&#xff0c;发现有两个选项 一个音量大&#xff0c;一个音质好&#xff0c;好奇去查了查。 “Hands-free AG audio”&#xff08;自由通话音频&#xff09;是指一种技术或功能&#xff0c;可以使您在进行通话时无需使用手部操作或接触设备。这通常适用于汽车…

Spring:面试八股

文章目录 参考Spring模块CoreContainerAOP 参考 JavaGuide Spring模块 CoreContainer Spring框架的核心模块&#xff0c;主要提供IoC依赖注入功能的支持。内含四个子模块&#xff1a; Core&#xff1a;基本的核心工具类。Beans&#xff1a;提供对bean的创建、配置、管理功能…

智能文档处理技术综述

一、 智能文档处理介绍 智能文档处理&#xff08;Intelligent Document Processing, IDP&#xff09;是利用人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、计算机视觉&#xff08;CV&#xff09;、自然语言处理&#xff08;NLP&#xff09;等技术…

【WEEK4】 【DAY5】AJAX第二部分【中文版】

2024.3.22 Friday 接上文【WEEK4】 【DAY4】AJAX第一部分【中文版】 目录 8.4.Ajax异步加载数据8.4.1.新建User.java8.4.2.在pom.xml中添加lombok、jackson支持8.4.3.更改tomcat设置8.4.4.修改AjaxController.java8.4.5.新建test2.jsp8.4.5.1.注意&#xff1a;和WEB-INF平级&…

R语言学习——Rstudio软件

R语言免费但有点难上手&#xff0c;是数据挖掘的入门级别语言&#xff0c;拥有顶级的可视化功能。 优点&#xff1a; 1统计分析&#xff08;可以实现各种分析方法&#xff09;和计算&#xff08;有很多函数&#xff09; 2强大的绘图功能 3扩展包多&#xff0c;适合领域多 …

实现UI自动化测试,这5个常见问题你必须知道!

UI自动化测试一直都是如此的令人纠结&#xff0c;自动化测试初学者总是拿它入门&#xff0c;但有些经验丰富者对其又是毁誉参半&#xff0c;抑或抛出分层自动化测试那个经典的“金字塔”&#xff0c;来说明UI自动化测试还是少做为好。 我在从事7年产品研发之后&#xff0c;临危…

【学习】软件测试行业有哪些从业方向

从事任何一个行业&#xff0c;不论想入行的新人还是已经在职的从业人员&#xff0c;一定要系统化的掌握自身的学习路线和发展方向&#xff0c;随时对自身的优劣点掌握清楚。尤其是对于软件测试这个岗位。测试职业所涉及的技能范围比较广&#xff0c;测试流程、测试计划、缺陷管…

Linux如何将桌面版转为mini版-解决中文字体变为英文字体

中文字体转为英文字体 我们进入Rocky-Linux后&#xff0c;ls或者打开文件夹发现有中文 我们执行命令 sudo localedef -i en_US -f UTF-8 en_US.UTF-8将其转为英文&#xff0c;并且重启机器 此时中文转化为英文 桌面版linux转为MINN版 1. 我们可以卸载桌面版 sudo dnf gr…

每日一题——LeetCode1748.唯一元素的和

方法一 两次遍历 var sumOfUnique function(nums) {let map new Map()for(let num of nums){map.set(num,map.has(num)?map.get(num)1:1)}let res0for(let num of nums){if(map.get(num)1) resnum}return res }; 消耗时间和内存情况&#xff1a; 方法二 一次遍历 var su…

VMware下建立CentOS 7

1.点击新建虚拟机 2.下一步 3.选择号安装程序光盘映像文件位置&#xff0c;下一步 4.选择版本和操作系统然后下一步 5.编辑虚拟机名称并选择安装位置&#xff0c;然后下一步 6.设置最大磁盘大小&#xff0c;下一步 7.点击完成 8.点击编辑虚拟机设置 9.将此虚拟机内存设置为2G&a…

如何搭建selenium自动化测试框架?selenium自动化测试环境搭建(webdriver+Python框架)

一、安装Python 选择Python版本后&#xff0c;进入Python官方网站下载适配机型版本&#xff1a;http://www.python.org/ 二、安装setuptools和pip setuptools下载地址&#xff1a;https://pypi.python.org/pypi/setuptools pip下载地址&#xff1a;https://pypi.python.org/py…

推荐多样性 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略: 各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表…

【前端面试3+1】02插槽、箭头函数与普通函数、重绘重排、【回文数】

一、对插槽的理解 1.定义及作用&#xff1a; 插槽是一种用于在组件中插入内容的特殊语法。它的作用是让父组件可以向子组件传递内容&#xff0c;从而实现组件的灵活性和复用性。 2.分类&#xff1a; 插槽可以分为具名插槽和作用域插槽。 2.1具名插槽&#xff1a; 具名插槽允许父…

图书推荐|Django+Vue.js商城项目实战

一线资深架构师 凝聚近十年大型系统开发经验 倾力打造 双色印刷 适合&#xff1a;项目演练求职应聘技术提升 全新&#xff1a;Django 4.x与Vue.js 3.x全栈技术 易学&#xff1a;娓娓道来图示指引原理剖析步骤解说代码详注 真实企业级项目技术细节完整揭秘&#xff0c;照着做就…

SEO 的未来:GPT 和 AI 如何改变关键词研究

谷歌Gemini与百度文心一言&#xff1a;AI训练数据的较量 介绍 想象一下&#xff0c;有一个工具不仅可以理解错综复杂的关键字网络&#xff0c;还可以预测搜索引擎查询的变化趋势。 这就是生成式预训练 Transformer (GPT) 和其他人工智能技术发挥作用的地方&#xff0c;以我们从…

Android studio汉化(2023最新版)

1.打开Android studio,找上面一栏中的Help,然后点击最下方的about 点击About 2.查看自己的版本 3. 点击进入网站&#xff0c;选择自己的版本并下载Versions: Chinese (Simplified) Language Pack / 中文语言包 - IntelliJ IDEs Plugin | Marketplace (jetbrains.com) 点击Get 4…