打印
[STM32F4]

DMA双缓冲模式

[复制链接]
4151|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2021-6-3 23:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我使用STM32F4的ADC DMA方式,DMA采用双缓冲模式,采样数据为6通道正弦波形,当DMA在切换双缓冲的地址时,会导致ADC数据不准确,我对采样数据做递推平均值算法,在地址转换的位置会存在尖峰,我是每25个周期转换一次。

使用特权

评论回复
沙发
zhenykun| | 2021-6-3 23:32 | 只看该作者

还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
wyjie|  楼主 | 2021-6-3 23:35 | 只看该作者
做平均值递推算法后的情况,所采样波形为50HZ,25个周期为500ms,地址切换的时刻在1600点,

使用特权

评论回复
地板
wyjie|  楼主 | 2021-6-3 23:37 | 只看该作者

使用特权

评论回复
5
wyjie|  楼主 | 2021-6-3 23:39 | 只看该作者

使用特权

评论回复
6
renyaq| | 2021-6-3 23:41 | 只看该作者
切换的时候不准也正常,最好将这段数据滤出掉;

使用特权

评论回复
7
heweibig| | 2021-6-3 23:43 | 只看该作者
6通道,采样的数据频率也不高,可以用DMA+中断啊;

使用特权

评论回复
8
wyjie|  楼主 | 2021-6-3 23:45 | 只看该作者
我需要把采样数据通过以太网发送道上位机软件,因为数据量比较大,所以采用了双缓冲的模式

使用特权

评论回复
9
xxrs| | 2021-6-3 23:48 | 只看该作者
哦,没用过这个模式;也有可能ST本身的BUG吧;

使用特权

评论回复
10
chuxh| | 2021-6-3 23:50 | 只看该作者
用一个缓冲就可以了,长度设为两倍,不需要切换地址,用 DMA 半传输中断和完全传输中断,半中断时取前半部分数据,完全中断时取后半部分数据

使用特权

评论回复
11
wyjie|  楼主 | 2021-6-3 23:53 | 只看该作者
用一个缓冲试了以下,也是有这个问题,缓冲区满切换到首地址是,也会发生,可以看一下图上,第3200点的数据,很明显有偏差了。

使用特权

评论回复
12
wyjie|  楼主 | 2021-6-3 23:55 | 只看该作者

使用特权

评论回复
13
jiajs| | 2021-6-3 23:58 | 只看该作者
你这个波形没看出来哪里有明显偏差了,ADC采样存在一定偏差是肯定的,要画出漂亮的波形,你还得再进行一下FIR或IIR滤波了

使用特权

评论回复
14
zhenykun| | 2021-6-7 20:55 | 只看该作者
你可以假定一下别的地方出错?

使用特权

评论回复
15
stly| | 2021-6-7 21:03 | 只看该作者
芯片的设计是很严谨的。只要能用都是专家级经过深思熟虑的。

使用特权

评论回复
16
xxmmi| | 2021-6-7 21:05 | 只看该作者
不要首选怀疑芯片。你应该首先验证代码。其次是分析硬件。

使用特权

评论回复
17
dengdc| | 2021-6-7 21:08 | 只看该作者
或者把双缓冲的长度变成2/3看误差是不是还对应的上

使用特权

评论回复
18
wyjie|  楼主 | 2021-6-7 21:11 | 只看该作者
用单缓冲试了试,长度改为原来的2倍,出现尖峰的地方也随着改变了,都是在DMA缓存满后,切换地址的地方有问题

使用特权

评论回复
19
wyjie|  楼主 | 2021-6-7 21:15 | 只看该作者
比如我从3200个点的地方缓存满了,从第3200个点之前取64个点做平均,或者从3200之后取64点做平均,值都很正常,就是从3200点之前取一部分采样数据,之后取一部分数据做平均,值就会有很明显的偏差

使用特权

评论回复
20
wyjie|  楼主 | 2021-6-7 21:18 | 只看该作者
我用的是递推平均值算法,每次错后一点,做64点(每周期)平均值,和用FFT做有效值得出的波形是一样的,为了查找问题方便,用的求平均值。

使用特权

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

本版积分规则

927

主题

12706

帖子

5

粉丝