打印
[其他ST产品]

STM32F4 Timer+ADC+DMA+FFT的理解与应用

[复制链接]
楼主: 我爱台妹mmd
手机看帖
扫描二维码
随时随地手机跟帖
41
我爱台妹mmd|  楼主 | 2023-8-27 18:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
关于函数ADC_DMA_Trigger()的作用,这里本人才疏学浅也很迷惑,但没有这一句有关中断标志位清除,确实只会运作一次,即只会采一次256个点运算,然后就没有然后了(还望高手指点迷津[抱拳])。我通过debug模式观察寄存器,发现ADC并没有在采样,DMA也没有在搬运数据。但这反而更方便了,让每一次采集都变得可控。需要采集时,使用此函数触发即可。

使用特权

评论回复
42
我爱台妹mmd|  楼主 | 2023-8-27 18:03 | 只看该作者
实践
做了这么多工作现在来实操验证一下。此次实验输入的被采的信号均为正弦波。

使用特权

评论回复
43
我爱台妹mmd|  楼主 | 2023-8-27 18:03 | 只看该作者
输入1KHz 0V到3V(即幅度:3V,偏移:1.5V)

使用特权

评论回复
44
我爱台妹mmd|  楼主 | 2023-8-27 18:03 | 只看该作者
用示波器先浅浅观察一下:

使用特权

评论回复
45
我爱台妹mmd|  楼主 | 2023-8-27 18:04 | 只看该作者
将信号接入信号采集的引脚,这里是PF3脚 ADC3_IN9。运行程序观察串口打印的数据。这里我将AD值和幅值都打印了出来。我们先来看看AD值下的图形:

使用特权

评论回复
46
我爱台妹mmd|  楼主 | 2023-8-27 18:04 | 只看该作者
很明显,通过数Excel画出来的这个正弦波周期个数可知正好是8个,满足公式:

采到的被采信号周期数:NT = t/T = 0.008s/0.001s = 8

使用特权

评论回复
47
我爱台妹mmd|  楼主 | 2023-8-27 18:04 | 只看该作者
打印的AD值:

使用特权

评论回复
48
我爱台妹mmd|  楼主 | 2023-8-27 18:04 | 只看该作者
一个周期采到32个点,满足公式:

一个被采信号周期的被采到的点数:fs/f = 32 000Hz/1000Hz = 32

使用特权

评论回复
49
我爱台妹mmd|  楼主 | 2023-8-27 18:04 | 只看该作者
顺便再看一下峰值大概在3750左右,根据公式:

Voltage = AD_Value*3.3V/4096

使用特权

评论回复
50
我爱台妹mmd|  楼主 | 2023-8-27 18:04 | 只看该作者

使用特权

评论回复
51
我爱台妹mmd|  楼主 | 2023-8-27 18:04 | 只看该作者
和我们输入的峰值3V的信号差不太多。

使用特权

评论回复
52
我爱台妹mmd|  楼主 | 2023-8-27 18:05 | 只看该作者
接下来看一下幅度谱的情况:

使用特权

评论回复
53
我爱台妹mmd|  楼主 | 2023-8-27 18:05 | 只看该作者
前文已经提及过,幅度谱的负半轴是没有什么作用的,所以这里只有原点(直流分量)和正半轴的数据。现在我们来分析一下红框框住的数据:
0:处就是所说的直流分量。因为这里我们是拿AD值计算的FFT,所以输出的值也是类似于AD值,所以我们又可以用:Voltage = AD_Value*3.3V/4096 计算可得1.504,满足我们所设置的偏移量也就是直流分量。
8:处就是我们的1KHz的幅度信息了。为什么会是8呢?我们又根据前文的分析:

频谱图频率分辨率:f0 = fs/NPT = 32 000Hz/256 = 125Hz

使用特权

评论回复
54
我爱台妹mmd|  楼主 | 2023-8-27 18:05 | 只看该作者
在这里的意思就是横坐标一格代表125Hz,而我们是1000Hz的信号,自然在第8个点的位置了(1000Hz/125Hz=8)。

再来看幅值信息,通过公式Voltage = AD_Value*3.3V/4096发现差不多也是1.5V左右。但这只是一半,所以在1KHz处的幅度是1.5*2=3V。

使用特权

评论回复
55
我爱台妹mmd|  楼主 | 2023-8-27 18:05 | 只看该作者
它的幅度谱长这样:

使用特权

评论回复
56
我爱台妹mmd|  楼主 | 2023-8-27 18:05 | 只看该作者
输入2KHz 0V到3V(即幅度:3V,偏移:1.5V)
这一次我们换成2KHz的试试看。

使用特权

评论回复
57
我爱台妹mmd|  楼主 | 2023-8-27 18:06 | 只看该作者
对于2KHz的信号,采到信号的16个周期,也是满足此公式的:

采到的被采信号周期数:NT = t/T


使用特权

评论回复
58
我爱台妹mmd|  楼主 | 2023-8-27 18:06 | 只看该作者
对于2KHz的信号,一个周期采到16个点,也是满足此公式的:

一个被采信号周期的被采到的点数:fs/f = 32 000Hz/2000Hz = 16

使用特权

评论回复
59
我爱台妹mmd|  楼主 | 2023-8-27 18:06 | 只看该作者

使用特权

评论回复
60
我爱台妹mmd|  楼主 | 2023-8-27 18:06 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则