STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

1.总体逻辑

按下STM32F4的KEY0按键,通过外部中断的方式对按键进行检测,然后开启一次带DMA的固定点数的ADC采集,采集完成后在DMA的中断发送采集到的数据,然后清空数据区准备下一次的按键中断。电脑接受到串口数据后对数据进行简单处理和傅里叶变化,然后实时显示在电脑上。
开发板:正点原子探索者STM32F407ZG

2.STM32

源工程文件
可以拿着正点原子的官方例程进行修改,这里只展示部分重要代码

1.外部中断处理函数

在这里插入图片描述

DMA传输完成中断函数

在这里插入图片描述

DMA缓存区大小设置

在ADC.h中设置
在这里插入图片描述

主函数

在这里插入图片描述

采样率的计算

目前是21M的时钟,一个时钟周期是0.047us,采集3个周期,转化12.5个周期就是15.5个周期
采样时间:0.047x15.5=0.7285us
采样率为:1/0.714=1.37268M
理论最高采集0.6863M信号,即686.3K信号

3.Python实时显示

这里的傅里叶变化只会显示最后的 POINT 个点的傅里叶变化情况

import serial
import matplotlib.pyplot as plt
import numpy as np
import time
LINE = 1 # 是否用线的方式连接
OFFSET = 1 # 是否减去偏置值
POINT = 140 # 这里设置的大小和STM32中DMA缓存区的大小要一致

count = 0
# 设置画布大小
fig, (ax1, ax2) = plt.subplots(1, 2)
line1, = ax1.plot([], [])
line2, = ax2.plot([], [])
ax1.set_xlim(0, 100)
ax2.set_xlim(0,POINT*10000)
ax1.set_ylim(0, 5)
ax2.set_ylim(0, 100)
ax1.set_title('Time Domain')
ax2.set_title('Frequency Domain')

# 初始化数据
x = []
y = []
yfft = []
xfft = np.linspace(0,POINT*10000,POINT)

# 创建曲线对象
if LINE:
    line1, = ax1.plot([], [])
    line2, = ax2.plot([], [])
else:
    line1, = ax1.plot([], [],'.')
    line2, = ax2.plot([], [],'.')   

# 开始绘图
start_time = time.time()
ser = serial.Serial('COM3', 115200) # 根据自己的情况进行更改

# 循环读取串口数据并绘图
while True:
    count+=1
    # 读取串口数据
    if(ser.inWaiting()):
        line = ser.readline()
        ser.flush()
        if len(line) : 
            real_vol = int(line) * (3.3 / 4096)
            print(real_vol)
    else:
        real_vol = 0

    # 实时更新x轴
    t = time.time() - start_time

    # 更新数据
    x.append(t)
    y.append(real_vol)
    if count>POINT:
        #FFT
        temp = []
        xfft = np.linspace(0,POINT*10000,POINT)
        if OFFSET:
            yfft = np.fft.fft(y[-POINT:]-np.mean(y[-POINT:]))
        else:
            yfft = np.fft.fft(y[-POINT:])
        line2.set_data(xfft, abs(yfft))
    
    # 更新曲线数据
    line1.set_data(x, y)
    ax1.set_xlim(max(0, t - 5), t)

    # 重新绘制图形
    fig.canvas.draw()
    fig.canvas.flush_events()
    plt.pause(0.01)  # 控制循环速率

4.结果展示

输入信号:400KHz正弦波,幅度1V,偏置1V
显示的结果为,去平均值后(无直流信号)
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】SpringBoot的日志

目录 日志作用 SpringBoot日志框架 日志打印 日志级别 类型 作用 修改级别 日志永久化 配置日志文件目录 配置日志文件名 简化日志打印和永久化——lombok 日志作用 问题定位:可以帮助开发人员快速找到问题出现的位置系统监控:可以把系统的运…

跳跃游戏类题目 总结篇

一.跳跃游戏类题目简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到达某…

结构型模式-组合模式

组合模式 概述 ​ 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。…

计算机组成原理4.2.2汉明码

编码的最小距离 奇校验和偶校验 看1的个数是奇数 还是偶数 汉明码 汉明码的配置 根据不等式,确定增添几位,根据指数放置增添位 汉明码的检错 分不同检测小组 分组规则:哪位为’1‘就是哪组元素。 1号位为‘1’的都是第一组元素&#…

基于COM组件实现C#调用C++类对象过程中的注意事项

目录 一、基于COM的调用原理二、注意事项如何在C ATL中有效添加方法与属性如何让C#调用C中的属性(.idl中声明属性)如何对变量类型进行转换C#如何获取C类中的参数变量 一、基于COM的调用原理 调用原理:首先基于C ATL模板类,实现需…

【网络进阶】服务器模型Reactor与Proactor

文章目录 1. Reactor模型2. Proactor模型3. 同步IO模拟Proactor模型 在高并发编程和网络连接的消息处理中,通常可分为两个阶段:等待消息就绪和消息处理。当使用默认的阻塞套接字时(例如每个线程专门处理一个连接),这两…

【redis】redis分布式锁(二)可重入锁+设计模式

【redis】redis分布式锁(二)可重入锁 文章目录 【redis】redis分布式锁(二)可重入锁前言一、可重入锁(又名递归锁)1、说明:2、分开解释:3、可重入锁的种类隐式锁(即synch…

【软件测试】测试用例的设计

文章目录 一. 针对没有需求的案例来设计测试用例二. 针对有需求的案例来设计测试用例1. 穷举法2. 等价类3. 边界值4. 判定表法5. 场景设计法5.1 简介5.2 基本设计步骤5.3 基本流和备选流5.4 使用场景5.5 优缺点5.6 实例 6. 错误猜测法 一. 针对没有需求的案例来设计测试用例 针…

深度强化学习——蒙特卡洛算法(6)

注:本章的内容作为补充插曲,大家可以选看,不过还是建议把最后一个使用蒙特卡洛近似求期望稍微看一下 蒙特卡洛是一大堆随机算法,通过随机样本来估算真实值 使用随机样本来近似Π 1、在[a,b]做随机均匀抽样,抽出n个样…

YOLO物体检测系列1.经典方法概述及评价指标体现

1. 深度学习经典检测方法: two-stage(两阶段): Faster-rcnn Mask-RCNN系列 one-stage(单阶段):Yolo系列 两阶段:一阶段实现RPN候选区域预选 二阶段基于候选区域再进行检测回归分类任务 单阶段:一个CNN卷积网络实现检测…

C++线程的简单学习及了解

此篇文章只是线程的简单了解。 文章目录 前言一、线程的优缺点二、C线程库 1.thread类的简单介绍2.线程函数参数总结 前言 什么是线程? 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控…

day3 TCP/IP协议与五层体系结构

TCP / IP 四层体系结构 TCP / IP工作流程: 现在互联网使用的 TCP/IP 体系结构已经发生了演变,即某些应用程序可以直接使用 IP 层,或甚至直接使用最下面的网络接口层。 沙漏型展示: 五层体系结构 各层的主要功能 应用层&#xff1…

搭建外网minecraft服务器方案

很多minecraft服务器主都想自己搭建一个外网可以访问的minecraft服务器,在没有外网IP的情况下,一般都是使用Logmein Hamachi方案。这种方案有它的弊端,需要客户机安装Hamachi,十分不方便。另外,免费版只支持5人&#x…

mysql如何加行锁

一、概述 InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁,所以后面的内容都是基于 InnoDB 引擎的。当我们使用delete、update进行数据库删除、更新的时候,数据库会自动加上行锁。但是,行锁有时也会失效。 数据库版本&a…

笔记:计算机网络体系结构(OSI七层模型、TCP/IP五层协议)

计算机网络体系结构 计算机网络是一个复杂的、具有综合性技术的系统,它由计算机系统、通信处理机、通信线路和通信设备、操作系统以及网络协议等组成。为了更好地描述计算机网络结构,使计算机网络系统有条不紊地处理工作,需要定义一种较好的…

CH9121网络串口透传应用

概述 随着物联网技术的普及,越来越多的传统设备出现联网功能需求。串口作为使用较为广泛的一种通信接口,串口转以太网,进行远程数据传输需求逐渐显现出来。CH9121内部集成TCP/IP协议栈,无需编程,即可轻松实现网络数据…

【SWAT水文模型】SWAT水文模型建立及应用第二期:土地利用数据的准备

SWAT水文模型建立及应用:土地利用数据的准备 1 简介2 土地利用数据的下载2.1 数据下载方式2.1.1 中科院1km土地利用数据2.1.2 清华大学高精度土地利用数据 2.2 数据下载 3 土地利用数据的准备3.1 矢量转栅格3.2 土地利用类型的重分类3.3 土地利用分布图投影调整3.4 …

【LeetCode】213. 打家劫舍 II

213. 打家劫舍 II(中等) 思路 这道题是 198.打家劫舍 的拓展版,区别在于:本题的房间是环形排列,而198.题中的房间是单排排列。 将房间环形排列,意味着第一间房间和最后一间房间不能同时盗窃,因…

EPIT定时器实验(一)

EPIT定时器简介 EPIT:Enhanced Periodic Interrupt Timer,直译就是增强的周期中断定时器,它主要完成周期性中断定时的。 STM32里面的定时器有很多其它功能,比如输入捕获、PWM输出等,但是I.MX6U的的EPIT定时器只是完成…

【五一创作】数据可视化之美 ( 三 ) - 动图展示 ( Python Matlab )

1 Introduction 在我们科研学习、工作生产中,将数据完美展现出来尤为重要。 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。 …