‍☠️stm32Cubemx欠采样原理讲解与实现 采集高频信号

news/2024/10/3 17:53:35

🏴‍☠️STM32Cubemx ADC+TIM+DMA欠采样采集高频信号

本文主要讲解ADC借助欠采样采集高频信号,比如使用100k左右的采样率去采集1M的信号。

所需工具:

  • 开发板:STM32F103RCT6
  • STM32CubeMX
  • IDE: Keil-MDK

相关文章:

  • STM32HAL ADC+TIM+DMA采集交流信号
  • STM32cubeHAL ADC+TIM+DMA (二)
  • stm32cubemx ADC+TIM+DMA超频采样_
  • STM32ADC同步采样

文章目录

  • 🏴‍☠️STM32Cubemx ADC+TIM+DMA欠采样采集高频信号
    • 😄原理简介
    • ⚽例程1
      • 工程建立
      • 运行结果
    • 🏓例程2
      • 工程建立
      • 运行结果
    • 🥊难点
    • 🥑练习
    • 🍉后记

😄原理简介

看过本文最一开始的“相关文章”中提到的文章后,会对信号采集有一定的概念。文章中使用的都是过采样,意思是采样率为待测信号频率的两倍及以上。这么说有些空,举例来说。如果想采集一个1K的正弦信号,一个周期采集4个点,那么采样率为4K。过程如下图:

IMG_0044(20230605-162420)

题外话,没学过信号与系统的小朋友,可能会疑惑,这边采集4个点有啥用?根本看不出来是正弦,还原出来和三角波一样嘛!这就涉及到奈奎斯特采样定理的原理了,要好好学习《信号与系统》和《数字信号处理》,就能明白为什么这个正弦信号,一个周期采集2个点以上就可以复原出来。怎么复原呢?需要用到增采样的知识,我写过一篇matlab仿真增采样:Matlab增采样仿真

上图展示的采样率为4k,每隔0.25ms采集一个点。

增采样对采样率要求较高,如果要采集的信号是1M,一个周期4个点的话,那么我的采样率是不是就要4M了?有没有办法用低采样率,采集高频信号呢?

一个周期四个点嘛,我能否每个周期只采集一个点,然后拼在一起呢?每隔1.25ms采集一个点,这样采集的四个点拼接在一起,不也是一样的效果。

IMG_0045(20230605-172542)

如图中所示,每个周期采集一个点,把所有点拼接在一起,就实现了每个周期采集4个点的效果。
采样率 = 1 1.25 ∗ 1 0 − 3 = 800 h z 采样率=\frac{1}{1.25*10^{-3}}=800hz 采样率=1.251031=800hz
我们使用800hz的采样率去采集1K信号,达到了4K采样率的效果!这便是欠采样用时间换采样率

⚽例程1

工程建立

建立过程与STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx_stm32 adc dma 采集交流_四臂西瓜的博客-CSDN博客一样,唯一不同之处是,采样率为800hz。文末会放置本文的完整工程。
采样率 = 时钟: 72 ∗ 1 0 6 分频: 1000 ∗ 90 = 800 h z 采样率=\frac{时钟:72*10^{6}}{分频:1000*90}=800hz 采样率=分频:100090时钟:72106=800hz
image-20230605175948832

补充一个知识:我们平时说的预分频PSC是指上图中的Prescaler,此处为1000-1。ARR自动重装载值,是指图中的Counter Period(AutoReload Register),此处为90-1。

运行结果

信号发生器输出:1kHz,1V-2V幅值范围的正弦信号。

IMG_20230605_180623

VOFA上观察到如下结果:

image-20230605175919827

可以看到一个周期确实是4个点,此处形状和原理分析中、预想的三角形波形不一样,是因为相位没有从零度开始采集,如下图:

IMG_0046(20230605-182138)

采集的点,连成线,就如图中的蓝色线一样,形成“锯齿”状。

这里就可以通过理想插值(增采样),来实现复原,如何增采样呢?可以关注我的“TCQ的电赛小站”,有时间会更新基于CMSIS-DSP的理想插值实现。

🏓例程2

工程建立

现在我们来思考一个问题,我们现在每个周期只采集4个点,如果想每个周期采集10个点,那么采样时间间隔就要从1.25ms变成1.1ms

IMG_0049(20230605-184150)

换算成采样率为:
采样率 = 1 1.1 ∗ 1 0 − 3 = 909.0909... h z 采样率=\frac{1}{1.1*10^{-3}}=909.0909...hz 采样率=1.11031=909.0909...hz
会发现采样率并不是一个整数,这就麻烦了。如果我们现在想用定时器来出发ADC进行采样,那么分频如何设置?
分频 = 72 ∗ 1 0 6 909.0909 = 79200.00000792 分频=\frac{72*10^{6}}{909.0909}=79200.00000792 分频=909.090972106=79200.00000792
我们现在设置:
P S C = 100 A R R = 792 PSC=100\\ ARR=792 PSC=100ARR=792

运行结果

与例程1一样,信号发生器输出:1kHz,1V-2V幅值范围的正弦信号。

image-20230605183535446

如果读者愿意,可以数一数,会发现一个周期正是10个点!
我们用 909.09 h z 的采样率,去采集了一个 1 k 的信号,等效采样率 10 k !! 我们用909.09hz的采样率,去采集了一个1k的信号,等效采样率10k!! 我们用909.09hz的采样率,去采集了一个1k的信号,等效采样率10k!!

🥊难点

是的,欠采样也不是万能的,家家有本难念的经,采样家族里,欠采样也有它的烦恼>_<😕。

在例程2中,我们试图每1.1ms采集一个点,换算成频率后,发现是不是一个整数,非常幸运的是,转换成分频后,可以找到合适的PSC和ARR使得采样率和预期值基本一致。

这个计算过程可以通过公式化简一下:
采样率 = 1 秒 采样时间间隔 采样率=\frac{1秒}{采样时间间隔} 采样率=采样时间间隔1

定时器分频 = P S C ∗ A R R = 定时器时钟 采样率 = 定时器时钟 1 秒 采样时间间隔 = 定时器时钟 ∗ 采样时间间隔 \begin{align} 定时器分频&=PSC*ARR=\frac{定时器时钟}{采样率}\\ &=\frac{定时器时钟}{\frac{1秒}{采样时间间隔}}\\ &=定时器时钟*采样时间间隔 \end{align} 定时器分频=PSCARR=采样率定时器时钟=采样时间间隔1定时器时钟=定时器时钟采样时间间隔

现在有了这个公式,我们来重新计算下例程1、2的分频:
例程 1 : P S C ∗ A R R = ( 72 ∗ 1 0 6 ) ∗ ( 1.25 ∗ 1 0 − 3 ) = 90000 例程1:PSC*ARR=(72*10^{6})*(1.25*10^{-3})=90000 例程1PSCARR=(72106)(1.25103)=90000

例程 2 : P S C ∗ A R R = ( 72 ∗ 1 0 6 ) ∗ ( 1.1 ∗ 1 0 − 3 ) = 79200 例程2:PSC*ARR=(72*10^{6})*(1.1*10^{-3})=79200 例程2PSCARR=(72106)(1.1103)=79200

挺好的呀,PSC*ARR都是比较好处理的整数。可是当频率高起来后,就不是特别好凑出来了,甚至于根本没法凑出来。比如以1.1us的时间间隔去采集1M信号,等效采样率为10M。
P S C ∗ A R R = ( 72 ∗ 1 0 6 ) ∗ ( 1.1 ∗ 1 0 − 6 ) = 7.92 PSC*ARR=(72*10^{6})*(1.1*10^{-6})=7.92 PSCARR=(72106)(1.1106)=7.92
看吧,PSC * ARR是小数,但是PSC和ARR必须是整数,没法凑出来🤔。

🥑练习

  1. 下载例程并且上电调试,观察结果。

  2. 尝试测量更高频率的信号,比如测量几兆的信号。

  3. 假如,PSC*ARR可以设置成小数,欠采样可以采集任意频率的信号吗?

    提示,学习下ADC的“采样保持”。

🍉后记

本文章收录于:

唐承乾的电赛小站

本文为系列文章中的冰山一角,欢迎进入小站查看。

配套程序:

配套工程 - Gitee.com


https://dhexx.cn/news/show-4633732.html

相关文章

TCP协议是如何实现可靠传输的

一、TCP最主要的特点 1.TCP 是面向连接的运输层协议&#xff0c;在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此&#xff0c;在 IP 的数据报服务基础之上&#xff0c;增加了保证可靠性的一系列措施。 2.TCP最主要的特点 &#xff08;1&#xff09;TCP 是…

SpringCloud Alibaba Nacos学习

SpringCloud Alibaba Nacos 文章目录 SpringCloud Alibaba Nacos1 Nacos 是什么&#xff1f;2 服务提供者 service-provider-nacos 配置3 服务消费者&#xff1a;server-consumer-nacos 配置 1 Nacos 是什么&#xff1f; 一句话: Nacos 就是注册中心[替代 Eureka]配置中心[替代…

如何升级iOS17beta?两种iOS17测试版本升级办法分享!

6 月 6 日凌晨 1 点 WWDC 2023 开发者大会开幕&#xff0c;iOS17、头显设备、MacBook等将陆续登场。 而通常发布会后会推送iOS17beta1&#xff0c;第一个开发者测试版本&#xff0c;相信很多小伙伴都迫不及待想要体现最新iOS版本了。 小编就给升级体验iOS17测试版两种方法&…

【计算机网络之HTTP篇】Cookie与Session的区别

目录 Cookie 原理 缺点 Session 原理 区别 Cookie cookie是浏览器在本地存储数据的一种机制。 原理 当浏览器向服务器第一次发送请求时&#xff0c;服务器会向浏览器返回一个Cookie&#xff0c;此时 cookie记录着浏览器访问服务器的用户登录状态。 后续浏览器再次访问服…

Linux--ServerProgramming--(4)详解 I/O复用

1. I/O 复用功能 I/O 复用能同时监听多个文件描述符。 I/O 复用本身是阻塞的。 当有多个文件描述符同时就绪时&#xff1a;若不采取额外措施&#xff0c;程序就只能按顺序一次处理其中的每一个文件描述符&#xff0c;这使得服务器程序看起来是串行工作的。若要实现并发&#…

Python数据攻略-DataFrame的创建与基础特性

大家好&#xff0c;我是Mr数据杨&#xff0c;今天我带来的是一本既实用又有趣的Python教程笔记&#xff0c;主角是Pandas DataFrame。它就像《三国演义》中的诸葛亮&#xff0c;机智、实用&#xff0c;可以帮助我们轻松处理各种数据问题。 我们来看如何创建诸葛亮——这个Data…

relation-graph关系图谱组件2.0版本遇到的问题

前提&#xff1a;之前已经写过一篇1.1版本的问题&#xff0c;这里就不过多讲了&#xff08;如果想要解决火狐低版本兼容&#xff0c;看那个就行&#xff09; 这次主要讲的是和1.X版本的区别和一些其它问题 区别 参数名不同&#xff1a;以前的links>lines (虽然现在links也…

java debug调试工具

文章目录 java debug调试工具debugdebug运行断点如何运行 具体使用step intostep into Force step intoresume programstopview breakpointsmute breakpointsstep ourt Shift消除debug java debug调试工具 debug 就是调试工具&#xff0c;用来查看代码在运行工程数据的变化。 …

《Java并发编程实战》课程笔记(十一)

StampedLock&#xff1a;有没有比读写锁更快的锁&#xff1f; StampedLock 支持的三种锁模式 ReadWriteLock ⽀持两种模式&#xff1a;一种是读锁&#xff0c;一种是写锁。而 StampedLock 支持三种模式&#xff0c;分别是&#xff1a;写锁、悲观读锁和乐观读。 其中&#xff…

Java 面试题:Spring,Spring MVC,Spring Boot 之间什么关系?

来&#xff0c;先和我看张图&#xff1a; Spring全家桶了为了解决不同场景的问题&#xff0c;逐渐演化出多套生态环框&#xff0c;如&#xff1a;Spring、SpringMVC、SpringBoot、SpringCloud。 Spring MVC和Spring Boot都属于Spring&#xff0c;Spring MVC是基于Spring的一个…