Conice 发表于 2023-5-24 17:47:37

ADC单通道采集是否开启DMA的疑问!求解答

本帖最后由 Conice 于 2023-5-24 18:03 编辑

应用场景:按照传统的FFT算法,对于某一时刻,用FFT计算出其所有频谱,如果要计算下一时刻的频谱,则再进行一次FFT运算,这两次FFT运算是孤立进行的,它们之间没有任何关系。而实际上,对于连续的两个时刻,我们会发现,其窗口中的样本有着很大的相似性,后一个时刻的样本只是将前一个时刻的样本的第一个输入舍弃,而在最后添加一个新的样本。


实现上述的实时SDFT,需要ADC每次采集一个点计算一次频谱,采用定时器触发,在HAL_ADC_ConvCpltCallback中进行SDFT计算。那么我想问是否需要开启DMA?我进行了多种配置方案,定时器频率设为240kHz,以采集24kHz正弦波为例进行验证,采集的波形放入sdft_inputbuf中。


1.如果开启DMA,并采用normal模式,转换一次需要再开启一次DMA,设置一个转换完成标志位,sdft_inputbuf中的波形是正弦波,而且每个周期就是包括10个采样点。这种配置应该不适合上述SDFT的配置方案,因为采集的波形不连续,如下图所示。这种配置感觉适合传统的FFT,比如一次性采集1024个点,计算一次FFT,再采集1024个点再计算。


2.如果开启DMA,并采用circular模式,可以连续转换,开启一次HAL_ADC_Start_DMA就可以,这种配置能连续采样,但是每个周期内采集的点数不是10个是包含11个点或12个点之类。这种配置方式下如果改成sdft_inputbuf,能实现上述的SDFT的方案吗?这个很有疑问。


3.如果不开启DMA,配置为:单通道+定时器触发,开启ADC1全局中断,在HAL_ADC_ConvCpltCallback实现SDFT可以吗?


实现每采集一个点计算一次频谱,实现实时的SDFT功能。上述三种ADC的配置方式,采用哪一种一直拿不准?DMA是不是不适合这种每次只采集一个点的应用场景,只适合大量数据采集的情况?请大佬指点。

eric2013 发表于 2023-5-25 07:30:06

这有个关键的点,你是否需要每采集一个点就需要立即实时输出,或者比如采集10个点计算一次,我们缓冲60个点后,一次性结算50次,满足需求不。

Conice 发表于 2023-5-25 07:43:31

eric2013 发表于 2023-5-25 07:30
这有个关键的点,你是否需要每采集一个点就需要立即实时输出,或者比如采集10个点计算一次,我们缓冲60个点 ...

主要应用于通信的解调,需要每采集一个点就需要立即计算频谱,比如定时器触发频率为240kHz,相当于4.2us,要在4.2us内把这个频谱计算出来,在中断回调函数中完成计算。
像您说的采集10个点计算一次,可能对于我这个场景存在较大的延时,不满足要求。所以请教一下这种场景,需要开启DMA吗?

eric2013 发表于 2023-5-26 10:17:28

Conice 发表于 2023-5-25 07:43
主要应用于通信的解调,需要每采集一个点就需要立即计算频谱,比如定时器触发频率为240kHz,相当于4.2us ...
这种的话,开DMA意义不大了,发挥不了DMA的优势

这个可以滞后一半的DMA缓冲实时输出不,这样的话也行。就像我们打电话一样,收听的人肯定是滞后于打电话说话的人。

Conice 发表于 2023-5-26 18:59:31

eric2013 发表于 2023-5-26 10:17
这种的话,开DMA意义不大了,发挥不了DMA的优势

这个可以滞后一半的DMA缓冲实时输出不,这样的话也行 ...

滞后没关系,只要能解调出信号就好。就像您说的,通信肯定有延时。滞后一半的DMA缓冲实时输出是什么意思呢?

eric2013 发表于 2023-5-27 09:12:43

Conice 发表于 2023-5-26 18:59
滞后没关系,只要能解调出信号就好。就像您说的,通信肯定有延时。滞后一半的DMA缓冲实时输出是什么意思 ...

做个DMA双缓冲,比如你做200个点的DMA缓,100个点为1个缓冲。其中一个缓冲连续采集的时候,另一个缓冲计数。

Conice 发表于 2023-5-27 11:27:22

eric2013 发表于 2023-5-27 09:12
做个DMA双缓冲,比如你做200个点的DMA缓,100个点为1个缓冲。其中一个缓冲连续采集的时候,另一个缓冲计 ...

好的,我试一试:handshake
页: [1]
查看完整版本: ADC单通道采集是否开启DMA的疑问!求解答