OpenEdv-开源电子网

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

6通道ADC+SD卡,2Khz存储不过来

[复制链接]

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
发表于 2017-1-16 11:03:15 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 624467649 于 2017-1-16 11:04 编辑

理想状态是6通道ADC+DMA(6个字节),采样频率2khz,保存到SD卡txt里,格式数据为10:40:39  4095 2315 1235 1236 1236 2365我的程序是主循环是3个按键(创建新txt,开始存储,暂停存储)。定时器500us中断:sprintf-DMA数据,然后存储到txt里,1秒改变LED(实际7,8秒才变一次)。
ADC是6通道循环规则采样,采样周期最大239.5周期,所以完全够2khz采样,所以就不定时开启采样,直接定时器中断来用DMA数据就好。(假2khz采样)
可是实际保存的数据算起来1s大概170组数据。按键完全失效。感觉问题就是还没存好txt数据,下一次中断又来了。
有什么解决办法吗。如果要DMA存多点,然后一起存的话,还是要多次sprintf,然后多次f_write(不知道怎么一次f_write),速度应该差不多。还有个小问题,我没有get_RTC数据,时间会自动变?
f1战舰版: FATFS实验 6ADC_1 RTC 定时器_存储不过来.zip (9.65 MB, 下载次数: 259)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
 楼主| 发表于 2017-1-16 11:46:19 | 显示全部楼层
顶下~SDHC持续传输速度4MB/s
回复

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
 楼主| 发表于 2017-1-17 09:48:28 | 显示全部楼层
yklstudent 发表于 2017-1-17 08:51
想要快就别用sprintf了

那用什么?我现在用f_printf。后缀很长很长。不知道还有什么其他办法。求指教
回复

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
 楼主| 发表于 2017-1-17 11:09:48 | 显示全部楼层
有什么好办法吗?
QQ截图20170117110900.png
回复

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
 楼主| 发表于 2017-1-17 11:13:13 | 显示全部楼层
SDIO是用查询模式(不知道怎么改DMA模式,改失败了)。现在是6通道ADC,DMA144个数据,然后72个传一次,可是写的速度跟不上ADC采样更新的速度。这是用定时器控制ADC采样+DMA的模式 定时器 DMA 6ADC_893hz.zip (9.65 MB, 下载次数: 235)
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2017-1-17 11:22:15 | 显示全部楼层
你先把SD卡读写驱动用DMA改写一下,不要一直等待传输完成。还有就是把FATFS的缓冲区改大一点,比如4096B
回复

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
 楼主| 发表于 2017-1-17 12:24:09 | 显示全部楼层
yyx112358 发表于 2017-1-17 11:22
你先把SD卡读写驱动用DMA改写一下,不要一直等待传输完成。还有就是把FATFS的缓冲区改大一点,比如4096B

QQ截图20170117122246.png SD卡改DMA改失败了。原子哥的例程,我只改这一句话,就死了。
回复

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
 楼主| 发表于 2017-1-17 14:23:54 | 显示全部楼层
yklstudent 发表于 2017-1-17 13:23
你测试下你这么做需要耗时多少?

耗时肯定跟不上DMA数据,所以肯定小于12kB/s。。。。主要问题是如果不用printf格式化成字符串,我该怎么存。原始数据用txt打开就乱码的呀
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2017-1-17 16:44:33 | 显示全部楼层
624467649 发表于 2017-1-17 12:24
SD卡改DMA改失败了。原子哥的例程,我只改这一句话,就死了。

你说“死了”是什么?没有反应?HARDFAULT?你不可能只改一句的,至少初始化和读写的地方都要改
还有,fprintf写出来的是文本文件,你写成二进制的话可以用fwrite、fread配合联合体来读。电脑上读取当然不能用记事本,可以自己写个小程序或者用winhex,也可以用单片机读然后串口发回来
回复

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
 楼主| 发表于 2017-1-18 17:02:08 | 显示全部楼层
yyx112358 发表于 2017-1-17 16:44
你说“死了”是什么?没有反应?HARDFAULT?你不可能只改一句的,至少初始化和读写的地方都要改
还有,f ...

我觉得主要问题是printf转换太慢了。有什么好的方法不转换成ASCII写到SD卡,又能像TXT文件一样“打包”起来,方便查看。
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2017-1-18 17:33:51 | 显示全部楼层
624467649 发表于 2017-1-18 17:02
我觉得主要问题是printf转换太慢了。有什么好的方法不转换成ASCII写到SD卡,又能像TXT文件一样“打包”起 ...

我发现你还有一个很大的问题,你在中断里面打开、关闭文件…………这样子无疑会大大降低效率
建议你在main函数里面f_open,然后就不必f_close了,fatfs在写满缓冲区之后会自动保存,如果非要手动保存那就用f_sync函数
回复

使用道具 举报

14

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-5-16
在线时间
67 小时
 楼主| 发表于 2017-1-18 17:42:45 | 显示全部楼层
yyx112358 发表于 2017-1-18 17:33
我发现你还有一个很大的问题,你在中断里面打开、关闭文件…………这样子无疑会大大降低效率
建议你在ma ...

太感谢了~受教。我现在在想自己把数据转换ASCII后写SD卡看看会不会好点。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-8-19
在线时间
10 小时
发表于 2019-11-4 11:30:40 | 显示全部楼层
我最近也在做相似的项目,如果仅仅是要提取数据,不考虑数据的格式,可以去掉sprintf函数,直接将数据写入sd卡,这时候SD卡里面会有很长一段数据,但是中间一段是采集到的有用数据,这样能够保证采样率
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-28 05:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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