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超简单的方法

  • 27
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
STM32F103是一款具有多通道ADC、TIM、DMAFFT功能的微控制器。 首先,多通道ADC允许我们同时采集多个不同通道的模拟信号。这对于需要同时监测多个传感器或信号源的应用非常有用。通过配置ADC的多个通道,并设置相应的采样速率和分辨率,可以轻松实现高效的数据采集。 其次,TIM(定时器)模块允许我们生成精确的时间基准。在实时系统和定时器应用中,我们可以配置TIM来实现各种定时和计时功能。通过设置预分频器、计数器和比较器,我们可以准确地生成周期性的、定时的或脉冲宽度可变的信号。这对于控制和调度其他外设非常有用。 接下来,DMA(直接内存访问)控制器允许我们实现高速数据传输,而不需要CPU的干预。通过配置DMA通道并定义源和目标的地址、传输长度和传输方向,我们可以实现高效的数据传输操作。这对于处理大量数据、高速数据流或实时响应的应用非常有用。 最后,FFT(快速傅里叶变换)是一种用于信号处理和频谱分析的重要算法。通过使用STM32F103的FFT库,我们可以对采集到的模拟信号进行频谱分析,以提取信号的频率和幅度特征。这对于音频处理、通信系统、传感器数据分析等应用非常有用。 总之,STM32F103的多通道ADC、TIM、DMAFFT功能为我们提供了丰富的数据采集、定时、数据传输和信号处理能力,使得我们可以设计出高度灵活、高效的嵌入式系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值