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

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:#FFTtemp = []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
显示的结果为,去平均值后(无直流信号)
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/63201.html

相关文章:

  • ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~
  • 桐乡学会计实操—小规模纳税人征收率的汇总帖来啦!
  • 权威学者、企业CFO荟聚上海国家会计学院,共探「智能会计 价值财务」
  • 根据cadence设计图学习硬件知识day06 了解一些电源转化芯片和 稳压器 和 开关芯片
  • 简单理解内存分页机制
  • 如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量
  • 智现未来面试(部分)
  • 最值得学的编程语言是哪个?
  • 研读Rust圣经解析——Rust learn-16(高级trait,宏)
  • html,Javascript,css前端面试题汇总免费
  • HFSS—RCS测量
  • QUARTZ 石英框架
  • 基于centos7:Harbor-2.7.2部署和安装教程
  • Windows上使用CLion配置OpenCV环境,亲测可用的方法(一)
  • 代码随想录算法训练营第四十三天
  • 如何在 Mac 和 Windows 上恢复未保存或删除的 PDF
  • windows开机不自动挂载磁盘的方法
  • 5 款 AI 老照片修复工具的横向比较
  • 2023企业服务的关键词:做强平台底座
  • 【Linux基本指令和权限(1)】
  • 虹科新品 | 用于医疗应用的压力和气体流量传感器
  • 原生小程序如何使用pdf.js实现查看pdf,以及关键词检索高亮
  • 「数据架构」MDM实现失败的主要原因
  • 【Java基础 1】Java 环境搭建
  • 2023-4-26-C++11新特性之正则表达式
  • python接口自动化测试 requests库的基础使用
  • Photon AI Translator 和做产品的一些思考
  • IPTV系统架构的分析与研究
  • workerman开发者必须知道的几个问题
  • golang Gin实现websocket