STM32配置ADC2(DMA)进行采集 DAC 输出-2

news2024/11/25 13:00:08

0.一定要先看上一节:STM32配置ADC2(DMA)进行采集 DAC 输出-2

1.实验目标

在上一节的基础上,我们把 DAC(三角波)给集成进来,实现按下按键输出三角波,通过串口发送数据给电脑,分析然后画出电压的波形并且展示出来
开发板:正点原子探索者STM32F407ZG

2.STM32部分

1.DAC部分

这里我们采用实验22-2 DAC输出三角波实验的例程,查看主函数找中和 DAC 相关的代码,发现下图红框中的函数只出现在了 DAC.c 中,于是我们将 DAC.c 添加到上一节的项目中,此时还不够,因为我们采用的是 HAL 库编程,还需要引入官方提供的和 DAC 相关的库函数才可以使用。
在这里插入图片描述
全部添加完成后,文件结构如下图所示
在这里插入图片描述
此时我们分析一下代码,发现在需要输出三角波的时候,只需要调用dac_triangular_wave即可,于是我们可以把这个函数放在按键的中断处理中去。

2.按键外部中断

和上面类似的方式打开实验4 外部中断实验,然后添加相关的文件到项目中,如下图所示
在这里插入图片描述
然后在按键中断函数部分,我们需要先开启 ADC 的采集,然后发送三角波,这样可以最大程度的保证采样的完整,下面是完整代码
在这里插入图片描述

3.串口发送

串口集成的过程不再赘述,这里主要是在 ADC 使用 DMA 采集到指定的点数后,会产生一次DMA中断,我们可以在 DMA 中断函数中将采集到的数据发送给电脑,下面是完整代码
在这里插入图片描述
到这里STM32部分就已经完成了,再放上一个主函数的图,主要就是各种初始化部分
在这里插入图片描述

3.Python处理程序

#%%
import numpy as np
import matplotlib.pyplot as plt
#%%

yt = np.array([])
file_obj = open("ADCdata.txt", encoding="utf-8")
lines = file_obj.readlines()
#%%
for line in lines:
    line = line.replace("\n", "")
    if len(line) :
    # print(line.replace("\n", "").split(' ')[1])
    # print(line.replace("\n", "").split(' ')[0])
        try:
            # original_vol = int(line.replace("\n", "").split(' ')[1])*256+int(line.replace("\n", "").split(' ')[0])
            # real_vol = original_vol * (3.3 / 4096); 
            real_vol = int(line) * (3.3 / 4096); 
            yt = np.append(yt,real_vol)
            # print(real_vol)
        except Exception as e:
            print(e)
print(yt)
file_obj.close()
# %%
xt = np.arange(0,yt.shape[0],1)
fig1 = plt.figure(figsize=(8, 6))
plt.plot(xt,yt,'.')
plt.plot(xt,yt)
plt.show()
# %%

yt = yt-np.mean(yt)
fig2 = plt.figure()
plt.plot(xt,yt,'.')
plt.plot(xt,yt)
yfft = np.fft.fft(yt)
# plt.plot(abs(np.fft.fftshift(yfft)))
fig3 = plt.figure(figsize=(8, 6))
xf = np.linspace(0,yfft.shape[0]*10000,140)
plt.plot(xf,20*np.log10(abs((yfft))))
# plt.plot((yfft))
plt.show()
# %%

4.具体操作流程

将 STM32 的 PA4(DAC) 和 PA5(ADC2) 用杜邦线连接起来,然后按下 key0 根据我的程序是会发出两个三角波,按下 key1 是会发出 10 个三角波。我们先打开 STM32 然后打开串口助手连接到 STM32 ,按下 key0 后串口会收到如下的数据在这里插入图片描述
我们把这里的数据全部给拷贝到ADCdata.txt中,然后运行上面的 Python 程序可以得到如下的结果(因为我设置的采样点很多,所以后面的都是噪声,但是确实是有两个三角波的波形,于是实验是成功的)
在这里插入图片描述
如法炮制,我们可以得到按下 key1 的波形,如下图所示,我们可以清楚的看到有10个三角波,实验成功
在这里插入图片描述

5.完整的工程代码和实验数据可以在这里进行下载

STM32配置ADC2(DMA)进行采集 DAC 输出

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

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

相关文章

Apache Zeppelin系列教程第二篇——整体架构

Zeppelin 架构: 首先我们来了解下 Zeppelin的架构, Zeppelin 主要分3层。 Web前端 Zeppelin Server Interpreter Zeppelin前端负责前端页面的交互,通过Rest API 和WebSocket的方式与Zeppelin Server进行交互。 Zeppelin Server是一个Web server&…

【python 基础语法一】注释,变量与运算符

一、注释 注释: 就是对代码的解释,方便阅读,被注释的代码不执行 分类 单行注释 # 1.单行注释 以#号开头 ,右边的所有东西都被当做说明文字 ,程序不进行编译运行。 print(hello world)多行注释 # 2.多行注释 三个单引号 或…

Sentinel源码分析学习

文章目录 前言Sentinel源码分析1.Sentinel的基本概念1.1.ProcessorSlotChain1.2.Node1.3.Entry1.3.1.自定义资源1.3.2.基于注解标记资源 1.4.Context1.4.1.什么是Context1.4.2.Context的初始化1.4.2.1.自动装配1.4.2.2.AbstractSentinelInterceptor1.4.2.3.ContextUtil 2.Proce…

django显示echart图表:柱状图、折线图、饼图、地图、词云

django显示echart图表 效果: 示例demo 点我查看 1、urls.py 其中关键代码: urlpatterns = [path("book_chart/", views.book_chart, name="book_cha

LINUX压缩和解压和磁盘管理与维护命令

文章目录 一、压缩和解压命令二、磁盘管理与维护命令总结 一、压缩和解压命令 Linux zip命令:压缩文件或目录 Linux unzip命令:解压文件或目录 Linux tar命令:归档工具 二、磁盘管理与维护命令 Linux df命令:显示磁盘空间使用情况 Linux mount命令:挂载文件系统 Linux quota命…

APK文件结构

文件结构 assets文件用来存放需要打包到Android 应用程序的静态资源文件,例如图片资源文件,JSON配置文件,渠道配置文件,二进制数据文件,HTML5离线资源文件等 与res/raw目录不同的数,assets目录支持任意深度…

数位dp。

一,思想: 在处理1e9甚至1e18,1e100的问题时,因为在统计情况下有很多重复的计算,数位dp实现了相同状态只计算一次,从而大幅减少运算时间,思想就是对每一位进行dp,计算时记忆化每一位可以有的状态…

HashMap机制

反思 HashMap之前只是面试时会看下面试题,但实际从没有撸过源码,对于工作多年的菜鸟来说,对技术不尊重,整理了篇文档,记忆加深一下 原理 假如让我们来设计HashMap实现,我们如何设计一个key->value键值…

4.7排序(C语言)

1.八大排序 加一个计数排序(时间复杂度为O(n), 空间复杂度为O(max(n, range),非比较排序)。 2.希尔排序 3.三个O(n^2)的排序的比较 4.归并排序和快速排序 非递归: 5.排序比较 注意: 下面4种高效排序中&…

【Git】篇一

文章目录 一、Git概述1、版本控制器的方式2、Git的工作流程图 二、Git的安装与常用命令1、Git环境安装2、Git环境基本配置3、获取本地仓库4、基础操作指令 三、分支 一、Git概述 开发中,代码备份、代码还原回滚、追溯、协同开发等场景必不可少,由此&…

特征可视化技术(CAM)

https://zhuanlan.zhihu.com/p/269702192 CAM技术可以帮助我们理解CNN在图像中寻找目标对象的过程,并且可以用于可视化CNN的中间层特征,以及对图像分类结果的解释和可视化。CAM技术的实现比较简单,可以使用常用的深度学习框架如PyTorch和Te…

【C++】模板进阶——非类型模板参数、模板特化、模板分离编译

目录 1.非类型模板参数array 2.模板的特化2.1概念2.2函数模板特化2.3类模板特化1.全特化2.偏特化3.类模板特化应用示例 3.模拟分离编译3.1什么是分离编译3.2模板的分离编译1.问题:2.原因3.解决方法 4.模板总结 1.非类型模板参数 模板参数分为类型形参 与 非类型形参…

重新思考无边界世界中的网络安全

©网络研究院 在一个越来越不是物理边界而是数字边界的世界里,全球网络安全事件的数量持续上升,公共部门机构面临的挑战也随之增加。 保护组成数据的利害关系比以往任何时候都更加重要。为了抵御这些数字威胁,政府机构正在采用零信任方…

sqlite基础

一.sqlite基础 1.下载与环境配置 从下载地址,点击我 这里下载适合你版本的压缩包 您需要下载 sqlite-tools-win32-*.zip 和 sqlite-dll-win32-*.zip 压缩文件。创建文件夹 C:\sqlite,并在此文件夹下解压上面两个压缩文件,将得到 sqlite3.d…

【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只…

ToLua框架

ToLua 是一个用于在 Unity 中为 Lua 提供 C# 语言绑定的框架。通过 ToLua,你可以方便地将 C# 代码暴露给 Lua 脚本,并在 Lua 脚本中调用 C# 类、方法和属性。 更新流程 原理:使用AssetBundle进行资源的更新,而由于lua运行时才编…

架构设计-分布式ID

一、 分布式ID基础 1.背景 1.为什么要引用分布式主键ID? 比如单机 MySQL 数据库,前期因为业务量不大,只是使用单个数据库存数据,后期发现业务量一下子就增长,单机 MySQL 已经不能满足于现在的数据量,单机…

【实战项目开发技术分享】常用的ROS工具与命令

常用的ROS工具介绍 作为机器人领域最为流行的开源框架之一,ROS(Robot Operating System)提供了丰富的工具来支持机器人的开发和部署。下面是一些常用的ROS工具及其功能的介绍: roscore:roscore是ROS的主要进程,它启动ROS Master节点并协调ROS系统中的所有进程。所有ROS节…

NEFU数据库基本操作实验总结

前言 SQL语言集数据定义、数据操纵、数据查询、数据控制功能于一体。 数据定义:create,drop,alter 数据操纵:增(insert into … ),删(delete from …),改(update … set …) 数据查询:select 数…