OpenEdv-开源电子网

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

ADC实时采样数据存储在SD卡

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-7
在线时间
6 小时
发表于 2016-9-14 16:17:56 | 显示全部楼层 |阅读模式
5金钱
小菜鸟一只~正在做一个小项目,需要将ADC采样的数据存储在SD卡。我现在已经会把缓存区内的数据写入SD卡中的.TXT文档中,但是还是不能把实时的AD采样值存储进去,希望大神求教!感谢!

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

使用道具 举报

2

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
410
金钱
410
注册时间
2016-5-6
在线时间
110 小时
发表于 2016-9-14 23:12:06 | 显示全部楼层
你ad採樣是否會中斷掉sd的讀寫?
不然應該會ad採樣,跟寫數據到sd卡
應該能完成吧!
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-7
在线时间
6 小时
 楼主| 发表于 2016-9-22 10:57:18 | 显示全部楼层
過路人一號 发表于 2016-9-14 23:12
你ad採樣是否會中斷掉sd的讀寫?
不然應該會ad採樣,跟寫數據到sd卡
應該能完成吧!

一边采数据一边存数据过程肯定是能实现的,只是我不太明白是不是需要定义buffer还是要启用DMA
回复

使用道具 举报

72

主题

179

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2014-5-12
在线时间
158 小时
发表于 2016-9-22 13:26:30 | 显示全部楼层
一直都在的星空 发表于 2016-9-22 10:57
一边采数据一边存数据过程肯定是能实现的,只是我不太明白是不是需要定义buffer还是要启用DMA

都可以吧
回复

使用道具 举报

72

主题

179

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2014-5-12
在线时间
158 小时
发表于 2016-9-22 13:27:22 | 显示全部楼层
存数据到SD卡 有没有用相关的驱动芯片?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-7
在线时间
6 小时
 楼主| 发表于 2016-9-22 14:07:57 | 显示全部楼层
新生 发表于 2016-9-22 13:27
存数据到SD卡 有没有用相关的驱动芯片?

没有用驱动芯片,单片机用的是STM32,芯片自带ADC采样。SD卡的文件系统已经移植好了
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
37
金钱
37
注册时间
2016-7-16
在线时间
8 小时
发表于 2016-9-22 20:13:50 | 显示全部楼层
你现在弄好的程序呢?发出来看看
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-7-18
在线时间
3 小时
发表于 2016-9-23 22:11:44 | 显示全部楼层
请问你这个可以测量读取速度吗
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-7
在线时间
6 小时
 楼主| 发表于 2016-9-24 14:41:16 | 显示全部楼层
小兔天 发表于 2016-9-22 20:13
你现在弄好的程序呢?发出来看看

主函数大概是这样的:初始化,显示初始的一个界面,检测SD卡;若检测到SD卡,向SD卡写入buf2里面的数据。程序下载进去后,验证是可以实现的。我的问题是是否可以定义buf1、buf2两个缓存区?ADC采样的数值存入buf1,buf1满数据存入buf2,同时buf1的数据写入SD卡;buf2满后数据存入buf1,buf2数据写入SD卡……依次交替


int main(void)
{
        u32 total,free;
//         int i,j;
  u8 dir=1;         
        u16 adcx;
        float temp;
        FRESULT res;
        FIL fsrc;
       
        unsigned char buf2[26]="2013 08 28 16 28.279";
        NVIC_Configuration();         
        delay_init();          
        uart_init(9600);           
        exfuns_init();                             
        LCD_Init();               
         Adc_Init();  
        usmart_dev.init(72);            
        mem_init();                                                  

        LCD_Display_Dir(dir);   
        POINT_COLOR=BLUE;         
        LCD_ShowString(10,10,200,16,16,"Molar Monitoring System");                 
        LCD_ShowString(60,50,200,16,16,"Mini STM32");       
        LCD_ShowString(60,70,200,16,16,"FATFS TEST");       
        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(60,110,200,16,16,"Use USMART for test");          
        LCD_ShowString(60,130,200,16,16,"2014/3/14");          


        while(SD_Initialize())                                       
        {
                LCD_ShowString(60,150,200,16,16,"SD Card Error!");
                delay_ms(500);
                LCD_Fill(60,150,240,150+16,WHITE);//Çå3yÏÔê¾                          
                delay_ms(500);
        }                                               

               

  f_mount(fs[0],"0:",1);                                        

  res=f_open(&fsrc,"0:/test1/test1.txt",FA_OPEN_ALWAYS|FA_WRITE);
        if(res==FR_OK)                     
  {
                res=f_lseek(&fsrc,fsrc.fsize);                        
    res=f_write(&fsrc,buf2, sizeof(buf2),&bw);      

  }
  f_close(&fsrc);                  

       
        while(exf_getfree("0",&total,&free))       
        {
                LCD_ShowString(60,150,200,16,16,"Fatfs Error!");
                delay_ms(500);
                LCD_Fill(60,150,240,150+16,WHITE);                  
                delay_ms(500);
        }                       

        POINT_COLOR=BLUE;                 
        LCD_ShowString(60,150,200,16,16,"FATFS OK!");         
        LCD_ShowString(60,170,200,16,16,"SD Total Size:     MB");         
        LCD_ShowString(60,190,200,16,16,"SD Free Size:     MB");             
        LCD_ShowNum(172,170,total>>10,5,16);                                       
        LCD_ShowNum(172,190,free>>10,5,16);                                               
       
       
        delay_ms(5000);
        LCD_Clear(WHITE);
        POINT_COLOR=BLUE;
        LCD_ShowString(20,200,200,16,16,"Molar Monitoring System");       

        LCD_ShowString(20,220,200,16,16,"ADC:");
        LCD_ShowString(100,220,200,16,16,"Voltage:     V");
       
while(1)
        {

                adcx=Get_Adc_Average(ADC_Channel_1,10);  
                LCD_ShowxNum(60,200,adcx,4,16,0);      
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                LCD_ShowxNum(170,220,adcx,1,16,0);         
                LCD_ShowString(180,220,200,16,16,".");
                temp-=adcx;
                temp*=1000;
                LCD_ShowxNum(190,220,temp,3,16,0X80);
                delay_ms(250);
       }
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-7
在线时间
6 小时
 楼主| 发表于 2016-9-24 14:42:16 | 显示全部楼层
毛科丹 发表于 2016-9-23 22:11
请问你这个可以测量读取速度吗

不能,现在我想要的功能还没有实现
回复

使用道具 举报

9

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2016-8-2
在线时间
33 小时
发表于 2016-10-29 21:31:29 | 显示全部楼层
我觉得如果你的采样频率不是很高,是不是可以每次采样完毕直接对采样到的数据直接进行保存。随后等待第二次的采样,当采样完毕后,进行第二次的保存。也就是说,将保存部分的工作,放到每次采样的后面。

其次,我有一本疑问,请问,你的数据是如何进行保存的?每次都是保存为一个独立的文件,还是每次数据采集完毕后,继续上次的文件进行保存?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-7
在线时间
6 小时
 楼主| 发表于 2016-10-31 15:35:00 | 显示全部楼层
刘毅壁虎 发表于 2016-10-29 21:31
我觉得如果你的采样频率不是很高,是不是可以每次采样完毕直接对采样到的数据直接进行保存。随后等待第二次 ...

继续上一次数据存进的位置写数据。你说的这个采一个数据写一个数据的做法我可以试试
回复

使用道具 举报

9

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2016-8-2
在线时间
33 小时
发表于 2016-11-27 17:31:28 | 显示全部楼层
一直都在的星空 发表于 2016-10-31 15:35
继续上一次数据存进的位置写数据。你说的这个采一个数据写一个数据的做法我可以试试

你是打开一个文件,不关闭,然后一直往里写对吗?你从来都不新建一个文件吗?还是就是用一个文件一写到底?
回复

使用道具 举报

6

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-5-16
在线时间
37 小时
发表于 2017-2-10 08:45:25 | 显示全部楼层
你的问题解决了吗?如果是1S钟进行500次采样,那种方案比较容易实现呢?.  1.每采样一次进行存储一次,也就是2ms存储一次,这种做法出现数据掉失。请问你有什么好的想法解决这种问题吗?
回复

使用道具 举报

2

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2016-10-21
在线时间
88 小时
发表于 2017-4-10 13:59:15 | 显示全部楼层
流畅笔记 发表于 2017-2-10 08:45
你的问题解决了吗?如果是1S钟进行500次采样,那种方案比较容易实现呢?.  1.每采样一次进行存储一次,也就 ...

想问一下,您的这个问题解决了吗。。。是怎么解决的
回复

使用道具 举报

tszxb 该用户已被删除
发表于 2017-4-10 20:35:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-2-26
在线时间
2 小时
发表于 2017-5-12 13:40:45 | 显示全部楼层
请问如果一直显示Fatfs Error,那是哪里出了问题
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8054
金钱
8054
注册时间
2014-8-13
在线时间
1597 小时
发表于 2017-5-12 14:00:51 | 显示全部楼层
首先,不要小数据量频繁写入,在内存开辟一个缓冲区,4K或者1分钟的采集量大小的缓冲区。然后写入的时候不要频繁open文件,仅仅open一次就好了,不要close,采集完再close。
最关键的地方,就是文件写入了,写入之后flush(sync?),那样,即使文件没有close,数据也是已经写入了的,出现意外,最大的损失量也不过是缓冲区(缓冲区也不要擦除,不停的写,注意对齐就可以了)里的数据,SD卡不损坏,SD卡上已经写入的数据是不会损失的
回复

使用道具 举报

3

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-3-28
在线时间
29 小时
发表于 2017-9-15 15:33:53 | 显示全部楼层
mack13013 发表于 2017-5-12 14:00
首先,不要小数据量频繁写入,在内存开辟一个缓冲区,4K或者1分钟的采集量大小的缓冲区。然后写入的时候不 ...

您好。如果一次性大量的写,会不会造成采样的中断呢?
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8054
金钱
8054
注册时间
2014-8-13
在线时间
1597 小时
发表于 2017-9-15 16:01:23 | 显示全部楼层
小韩天真 发表于 2017-9-15 15:33
您好。如果一次性大量的写,会不会造成采样的中断呢?

如果单片机没有ucos之类的系统,单纯跑裸机,一次性大量的写,是会造成采样中断的(我把采集过程放到级别比较高的中断里也不行【因为我没处理好已采集的但是没存储的数据和新采集的数据覆盖旧数据的问题,后来干脆不用这种方式了】)

总之,尽量不突发,尽量使你的任务均匀
回复

使用道具 举报

3

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-3-28
在线时间
29 小时
发表于 2017-9-15 19:58:24 | 显示全部楼层
mack13013 发表于 2017-9-15 16:01
如果单片机没有ucos之类的系统,单纯跑裸机,一次性大量的写,是会造成采样中断的(我把采集过程放到级别 ...

谢谢您的回复,让我少走一些弯路!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 21:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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