OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6513|回复: 14

请教一下高速AD+DMA数据采集及数据传输的问题

[复制链接]

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
发表于 2021-7-15 21:37:57 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 车嘉炜 于 2021-7-15 21:56 编辑

程序解释:使用stm32f103芯片,使用外部触发AD+DMA中断进行数据的采集和存储:目前定义了一个容量为256的数组作为DMA的内存数组,AD采集的数据通过DMA存进内存数组中,DMA缓存大小为256,在DMA中断中定义了一个变量flag,若DMA进入中断,说明内存数组存满256个数据了,flag为1。主函数中while(1)循环判断flag是否为1,若为1则打印这个数组中的所有元素并将flag=0,等待下次进入DMA时flag又为1,主函数中再次将该数组中的元素打印出来。

目前我遇到了一个问题由于AD是外部触发信号来进行触发采集的,外部这个信号频率很快,我在主函数中将一组数组元素通过串口发送给上位机的这期间,DMA已经进入中断很多次了,是不是也就意味着在我主函数向上位机发送一组256个数据的整个过程中这个数组中的元素被刷新了很多次?那么我传给上位机的一组256个元素就不是采集的连续的一组数据,而是很多组数据的拼接,请问有没有好的办法解决这个问题?(已经尝试过提高数据向上位机的传输速度了,但还是快不过DMA中断的刷新时间),是否需要更换AD值由数组存储的这个方式?有没有别的方式推荐?我想上位机得到的每一组256个数据都是一组连续采集的数据。
这是DMA部分的配置
DMA配置.png
这是DMA中断的配置:
DMA中断.png
这是主函数中的循环:
WHILE1.png


最佳答案

查看完整内容[请看2#楼]

你如果是想要得到全部数据,那是不可能的. 如果你只是想要让数据保持完整,一帧256个数据是连续的,那方法有很多. 最简单的,你定义一个BUFF [串口时间/DMA时间+1] [256]的二维数组,每次DMA中断,就把当前写的数组移动个位置,至少,你得到的信息是没有被改写的.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-7-15 21:37:58 | 显示全部楼层
你如果是想要得到全部数据,那是不可能的.
如果你只是想要让数据保持完整,一帧256个数据是连续的,那方法有很多.
最简单的,你定义一个BUFF  [串口时间/DMA时间+1]    [256]的二维数组,每次DMA中断,就把当前写的数组移动个位置,至少,你得到的信息是没有被改写的.
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1430
金钱
1430
注册时间
2020-5-12
在线时间
393 小时
发表于 2021-7-16 13:28:29 | 显示全部楼层
队列存储
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-7-16 14:06:35 | 显示全部楼层
其实问题你自己也很清楚, 大水管接小水管, 要不就把小水管加大, 比如用高速USB模块, 用WIFI。。。。。
如果说你的应用只是在一段时间(比如是20ms)连续采样, 可以考虑把buffer size加大
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-7-16 14:42:22 | 显示全部楼层
edmund1234 发表于 2021-7-16 14:06
其实问题你自己也很清楚, 大水管接小水管, 要不就把小水管加大, 比如用高速USB模块, 用WIFI。。。。。
...

您好,是因为我这个项目就是需要固定每次都采集256个数据作为一组数据,因为上位机需要对这每一组256个数据进行一定的计算分析,这样的采集过程是一直连续下去的,所以我加大buffer size的话也就没办法实时的将采集的每组256个数据传给上位机了。高速usb我也正在了解,我是想请教一下对于每一组的256个数据有没有更好的存储方式,便于我实时的提取准确的完整的每一组数据
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-7-16 14:46:24 | 显示全部楼层
车嘉炜 发表于 2021-7-16 14:42
您好,是因为我这个项目就是需要固定每次都采集256个数据作为一组数据,因为上位机需要对这每一组256个数 ...

去了解一下动态内存分配
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-7-16 14:46:55 | 显示全部楼层
edmund1234 发表于 2021-7-16 14:46
去了解一下动态内存分配

好的感谢
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-7-16 14:49:40 | 显示全部楼层

您好,麻烦您指教一下队列存储的具体思路是怎么样的,我觉得队列和数组差不了多少,一个是先进先出一个是被新的数据刷新
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-7-16 17:01:36 | 显示全部楼层
话说回来,115200的波特率的话,一秒能传递12800个数据,每个字节79us,你79us采集了256个数据,平均才0.3个us一个数据,这么快的ADC精度不咋滴吧
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-7-16 17:58:14 | 显示全部楼层
聚东风 发表于 2021-7-16 17:01
话说回来,115200的波特率的话,一秒能传递12800个数据,每个字节79us,你79us采集了256个数据,平均才0.3个us一 ...

感谢您的回复古,是的,精度比较差,所以后续要加上外置ADC,stm32的内置AD可能不太能达到要求。
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-7-16 18:09:53 | 显示全部楼层
聚东风 发表于 2021-7-16 16:57
你如果是想要得到全部数据,那是不可能的.
如果你只是想要让数据保持完整,一帧256个数据是连续的,那方法有 ...

您好,如果我定义一个二维数组的话,DMA缓存设为256,每次进DMA中断的时候这256个数据是会按照一行一行的存储,还是说每一次新的一组256个数据还是会覆盖掉这个二维数组的第一行的数据,如果是第二种情况的话那我如何做到您说的那样把当前写的数组移动个位置?
回复

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2021-7-17 07:57:37 | 显示全部楼层
参考这个  实现一个fifo  改变fifo大小 匹配存取速度  http://www.armbbs.cn/forum.php?m ... &extra=page%3D2
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-7-18 16:04:31 | 显示全部楼层
loudianxin 发表于 2021-7-17 07:57
参考这个  实现一个fifo  改变fifo大小 匹配存取速度  http://www.armbbs.cn/forum.php?mod=viewthread&tid ...

感谢指点,我去学习一下
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-7-18 20:57:20 | 显示全部楼层
如果你总体上的ADC采集的平均速率大与串口发送的速率,那只能想办法找更快的通讯方式。。楼上说的队列什么的都基于一个前提,就是串口的平平均速率要大于数据采集速率。
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-7-19 09:47:15 | 显示全部楼层
pdwdzz 发表于 2021-7-18 20:57
如果你总体上的ADC采集的平均速率大与串口发送的速率,那只能想办法找更快的通讯方式。。楼上说的队列什么 ...

是的,因为就算环形队列可以一边读取一边写入那也需要读取和写入的频率保持一致才不会出错,我正在学习高速usb看看能不能加快数据的传输速度,感谢您的回复
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 06:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表