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

2019-10-15 06:32发布

本帖最后由 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, 下载次数: 230) 2017-1-16 11:02 上传 点击文件名下载附件


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
624467649
1楼-- · 2019-10-15 21:30
yklstudent 发表于 2017-1-17 13:23
你测试下你这么做需要耗时多少?

耗时肯定跟不上DMA数据,所以肯定小于12kB/s。。。。主要问题是如果不用printf格式化成字符串,我该怎么存。原始数据用txt打开就乱码的呀
yyx112358
2楼-- · 2019-10-15 22:54
624467649 发表于 2017-1-17 12:24
SD卡改DMA改失败了。原子哥的例程,我只改这一句话,就死了。

你说“死了”是什么?没有反应?HARDFAULT?你不可能只改一句的,至少初始化和读写的地方都要改
还有,fprintf写出来的是文本文件,你写成二进制的话可以用fwrite、fread配合联合体来读。电脑上读取当然不能用记事本,可以自己写个小程序或者用winhex,也可以用单片机读然后串口发回来
624467649
3楼-- · 2019-10-16 03:00
 精彩回答 2  元偷偷看……
yyx112358
4楼-- · 2019-10-16 07:08
624467649 发表于 2017-1-18 17:02
我觉得主要问题是printf转换太慢了。有什么好的方法不转换成ASCII写到SD卡,又能像TXT文件一样“打包”起 ...

我发现你还有一个很大的问题,你在中断里面打开、关闭文件…………这样子无疑会大大降低效率
建议你在main函数里面f_open,然后就不必f_close了,fatfs在写满缓冲区之后会自动保存,如果非要手动保存那就用f_sync函数
624467649
5楼-- · 2019-10-16 10:00
yyx112358 发表于 2017-1-18 17:33
我发现你还有一个很大的问题,你在中断里面打开、关闭文件…………这样子无疑会大大降低效率
建议你在ma ...

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

一周热门 更多>