STM32 CubeMX配置ADC+DMA进行FFT(1)

STM32 CubeMX配置ADC+DMA,计算采样率和ADC电压

原创:睿智嵌入式
最近,因为项目需要处理音频信号,对AD采集的音频信号进行FFT运算,记录一下学习过程。

主要内容:

1.ADC和DMA各配置有什么实际意义

2.配置好的ADC如何计算采样率和电压值

cubeMX配置ADC+DMA

这里我用的是STM32F407处理器,与其他的处理器思路大体一致

ADC配置

ADC配置

Mode是ADC工作模式 我们设置为independent mode(独立模式)因为只需要单独ADC使用,如果是多个ADC联合使用才需要更改。

Clock Prescaler是ADC工作频率,这里PCLK2在F407上为84MHZ,再4分频为21MHZ,所以ADC工作频率为21MHZ,一秒有21M个ADC周期,一个ADC周期为1/(21M)=47.619ns。

Resolution 是选择ADC分辨率以及得到一个ADC值的时间=采样时间+转换时间,转换时间一般是固定的例如:F407为12个ADC周期、F103为12.5个ADC周期,采样时间在Rank->Sampling Time里配置,这里我采样时间选择3个ADC周期。

Data Alignment是数据对齐方式,一般配置为右对齐,如果是12位分辨率会存储在uint16_t的[11:0]位,其他位为干扰。

Scan Conversion Mode是多通道模式,顾名思义,这里不需要,为Disabled。

Continuous Conversion Mode是连续捕获模式,一般为Enabled,实际上开不开都可以正常使用,但是开了数据更新速度明显加快。

Discontinuous Conversion Mode是不连续捕获,Disabled。

DMA Continuous Requests是DMA连续请求模式,这个十分主要,例如HAL_ADC_START_DMA(&hadc1,(uint32_t *)buf,200) 这个语句,使用ADC1和DMA,数据放入buf数组内,放200个数据。如果DMA连续请求去能的话,这个语句传完200个数据后自动关闭ADC1和DMA。反之,使能后,语句执行完后会又会连续从头开始传输数据,实际为buf数组中的值一直在更新。

Number Of Conversion是规则组通道数量这里我只要一个通道,如果是多个通道前面的多通道模式要使能。

External Trigger Conversion Source规则组通道采样的触发源,这里我们软件触发,也可以配置为定时器触发。

External Trigger Conversion Edge规则组通道采样的触发源的触发方式,一般有上升沿触发,或下降沿触发,这里我们不需要。

Rank配置规则组通道的采样顺序和各通道的采样时间,这里我们只有一个通道,所以只需要配置采样时间3ADC周期

之后是注入组,实际为我们特定时候需要采样用的,感觉像在中断里面的ADC。到此ADC基本配置完毕。

DMA配置

DMA配置

Add->Select->ADC1配置ADC与DMA建立联系。

Priority->High优先级高。

Mode->Circular DMA工作模式,一般为循环模式,没想到什么情况只需要传一个数据还要DMA的。

increment Address为地址自增,一般外设地址是固定的,但是我们数据存储是在数组内,所以需要存储完后自动移到下一个位子再存

数据。

Use Fifo使用FIFO一个缓冲空间,一般用于匹配速度的。

Data Width数据长度Word为字有4字节32位长度、Half Word为半字有2字节16位、Byte字节8位。注意ADC分辨率我们是12位。

到此ADC和DMA配置完毕。

计算ADC采样率

由于有DMA所以单片机在ADC采样的时候不需要去代码获取,可以尽量保证ADC采样点之间间隔的ADC周期数一样。同时我们代码也要

尽量避免ADC采样时不要有其他工作,数据处理放在采完一轮之后处理。

按上面的配置ADC工作频率21MHZ,一个ADC周期47.619ns

一个AD值时间=采样时间+转换时间=3+12=15ADC周期=0.71us=1.4MHZ

所以一秒钟可以采1.4M个AD值,ADC的采样率为1.4M,对应FFT中的Fs

计算ADC电压值

由于我用的开发板,内部供电3.3V,按上面配置的ADC分辨率为12位,2^12=4096

所以ADC采集的电压值=(ADC的采集值*3.3)/(2^12) V

例如:ADC采集值为2000,则对应电压值为1.611328V

结尾

附上一张按上述配置的ADC采样的图,用excel表拟合的,信号为1Vpp正弦波1V偏置电压
ADC采样电压值

PS:如果有所帮助可以点个赞✧( ु•⌄• )◞
下篇记录FFT运算,如果使用cubeMX推荐大家去看看cubeMX自带的库,一般在
C:\Users\Administrator\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.2\Drivers\CMSIS\docs
然后去看对应需要的库,搜索index.html索引文件,用chrome打开非常流畅。

如果时.chm文件可以转html文件打开,参考chm转换为html超简单的方法

版权声明:本文为CSDN博主「赣医电工人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ANNOLRA/article/details/119206287

生成海报
点赞 0

赣医电工人

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

为什么重写printf函数没有用?

以前在网上找了无数方法去重写printf函数,但发现都没效果,今天偶然发现重写printf函数可以了,原因是以前没有勾选微库(Use MicroLlB)! 这里