OpenEdv-开源电子网

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

ADS1256采集数据用 SD卡存储

[复制链接]

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
发表于 2023-7-26 21:43:00 | 显示全部楼层 |阅读模式
10金钱
各位大佬,我用1256采集正弦波(前边有调理电路),发送ADS1256_CMD_RDATA命令后进行数据采集,用f_write将采集到的数据存进SD卡,然后用matlab处理,结果波形很失真,就是丢失了很多数据,呈锯齿一样的。采样率没达到,该怎么办?有没有大佬做过类似的,救救孩子把。困扰好久了。

1、我想达到较高的采样率,该怎么优化呢?
(用的是硬件SPI,SDIO+DMA)
2、有没有类似的参考啊大佬们,急死了

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

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 09:53:35 | 显示全部楼层
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-27 10:17:54 | 显示全部楼层
正弦波频率多少?采样率多少?ADS1256的SPI波特率多少?
专治疑难杂症
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 10:40:00 | 显示全部楼层
LcwSwust 发表于 2023-7-27 10:17
正弦波频率多少?采样率多少?ADS1256的SPI波特率多少?

谢谢您的的回复!采集10Hz的都不太准确,采样率设置为30K的,用的是F1的SPI2,开始设置SPI_BaudRatePrescaler_256,后边改成32了也不对,不知道什么原因。
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 10:42:12 | 显示全部楼层
救救孩子把各位大佬!!!
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-27 10:47:01 | 显示全部楼层
葭月之末 发表于 2023-7-27 10:40
谢谢您的的回复!采集10Hz的都不太准确,采样率设置为30K的,用的是F1的SPI2,开始设置SPI_BaudRatePresc ...

哦,速度不高,单片机性能肯定足够。
这样吧,先别弄SD卡了,把数据整对再说:
定义一个10K的数组,采集的数据放入这个数组,采集完成后停止采集,把这个数组通过串口发往串口调试助手,再想办法绘制成曲线。
专治疑难杂症
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 10:58:59 | 显示全部楼层
LcwSwust 发表于 2023-7-27 10:47
哦,速度不高,单片机性能肯定足够。
这样吧,先别弄SD卡了,把数据整对再说:
定义一个10K的数组,采 ...

我是先测试低频的,结果不对。我最终不要这么低的呀大佬,怎么搞。这么低都不对
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-27 11:06:36 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-7-27 11:11 编辑
葭月之末 发表于 2023-7-27 10:58
我是先测试低频的,结果不对。我最终不要这么低的呀大佬,怎么搞。这么低都不对

别光说什么不对,你想想我要怎么回答?别人怎么帮你解决?凭你给的这些话然后瞎猜就能解决问题?
电路没有?程序没有?示波器波形没有?数据也没有?为了找出问题你做了啥?有没有怀疑是哪里的问题?
专治疑难杂症
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 11:20:44 | 显示全部楼层
LcwSwust 发表于 2023-7-27 11:06
别光说什么不对,你想想我要怎么回答?别人怎么帮你解决?凭你给的这些话就能解决问题?
电路没有?程序 ...

不好意思。有点着急了。
1、示波器我之前看了时序是对的,但是没有截图下来
2、电路的话,我是按照数据手册画的,用的是差分,单通道
3、为了找出问题,我调试了好久的程序,也查过了时序还有读写寄存器
我开始用的方法是,每采集一个数据就用f_write写进SD卡,上位机处理数据后发现丢失了很多数据,然后加大缓存数组,采集好了一次性写进去,但是还是有问题。
我开了SDIO的DMA,还是没解决。
我现在的打算是,用DRDY去触发外部中断,然后在中断里处理数据,不知道这样的话,采样率能不能保证至少7.5K呢
//这是中断服务函数
void EXTI15_10_IRQHandler(void)
{
       
        int ulResult;
        volatile u16 bufferIndex;
       
        if(EXTI_GetITStatus(EXTI_Line10)!=RESET)
        {
                if(bufferIndex<BUFFER_SIZE)
                        {
                                ulResult |= (SPI2_ReadWriteByte(0xff) << 16);
                                ulResult |= (SPI2_ReadWriteByte(0xff) << 8);
                                ulResult |= SPI2_ReadWriteByte(0xff);       
                               
//                                state = 1;
//                LED1=!LED1;       
//                                if( ulResult & 0x800000 )
//                                 {
//                                                ulResult = ~ulResult;
//                                                ulResult &= 0x7fffff;
//                                                ulResult += 1;
//                                                ulResult = -ulResult;
//                                 }
//                                                currentBuffer[bufferIndex++] = ulResult*5/8388607;                         
                       
                        /* &#184;&#186;&#202;&#253;&#189;&#248;&#208;&#208;&#192;&#169;&#213;&#185;&#161;&#163;24&#206;&#187;&#211;&#208;·&#251;&#186;&#197;&#202;&#253;&#192;&#169;&#213;&#185;&#206;&#170;32&#206;&#187;&#211;&#208;·&#251;&#186;&#197;&#202;&#253; */
                                        if (ulResult & 0x800000)
                                        {
                                                ulResult += 0xFF000000;
                                        }
                                                currentBuffer[bufferIndex++] = ulResult;                         
                        }       
                       
                        else
                                {               
//                                        LED1=!LED1;       

                                        f_lseek(file,f_size(file)); //&#189;&#171;&#214;&#184;&#213;&#235;&#214;&#184;&#207;ò&#206;&#196;&#188;&#254;&#196;&#169;&#206;&#178;
                                        f_write(file,(const void*)currentBuffer,BUFFER_SIZE * sizeof(int32_t),&bw);         //&#208;&#180;&#202;&#253;&#190;&#221;
                                        bufferIndex=0;

          //&#199;&#208;&#187;&#187;&#181;&#189;&#193;í&#210;&#187;&#184;&#246;&#187;&#186;&#179;&#229;&#199;&#248;                                       
                                        currentBuffer = (currentBuffer == buffer1) ? buffer2 : buffer1;                                          
//                                        f_close(file);
                                       
                                       
// ???????
//                        myfree(0,buffer1);//&#202;&#205;·&#197;&#196;&#218;&#180;&#230;          
//                        myfree(0,buffer2);//&#202;&#205;·&#197;&#196;&#218;&#180;&#230;          
                                }       
                               
                                EXTI_ClearITPendingBit(EXTI_Line10); //&#199;&#229;&#179;&#253;LINE0&#201;&#207;&#181;&#196;&#214;&#208;&#182;&#207;±ê&#214;&#190;&#206;&#187;  
                       
                                state = 1;
                }                               
}


主函数里这样的
        while(1)                                             
        {               
                LED0=!LED0;       
                if (state)
                        {
//                LED1=!LED1;       
                                CS_0();
                                while(ADS1256_DRDY);//&#181;±ADS1256_DRDY&#206;&#170;&#181;&#205;&#202;±&#178;&#197;&#196;&#220;&#208;&#180;&#188;&#196;&#180;&#230;&#198;÷
       
                                SPI2_ReadWriteByte(ADS1256_CMD_SYNC);//&#205;&#172;&#178;&#189;&#186;ó&#163;&#172;DRDY&#210;&#253;&#189;&#197;&#189;&#171;±&#163;&#179;&#214;&#184;&#223;&#206;&#187;

                                SPI2_ReadWriteByte(ADS1256_CMD_WAKEUP);
       
                                while(ADS1256_DRDY);//&#181;±ADS1256_DRDY        &#206;&#170;&#184;&#223;&#202;±&#187;&#189;&#208;&#209;&#161;&#162;&#182;&#193;&#200;&#161;&#202;&#253;&#190;&#221;
                               
                                SPI2_ReadWriteByte(ADS1256_CMD_RDATAC);//·&#162;&#203;&#205;&#181;&#165;&#180;&#206;&#182;&#193;&#195;ü&#193;&#238;
                               
                                while(ADS1256_DRDY);//&#181;±ADS1256_DRDY        &#206;&#170;&#184;&#223;&#202;±&#187;&#189;&#208;&#209;&#161;&#162;&#182;&#193;&#200;&#161;&#202;&#253;&#190;&#221;
                                       
                                delay_us(8);

                                state = 0;
//                LED1=!LED1;       
                        }
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-27 11:27:49 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-7-27 11:30 编辑
葭月之末 发表于 2023-7-27 11:20
不好意思。有点着急了。
1、示波器我之前看了时序是对的,但是没有截图下来
2、电路的话,我是按照数据 ...

有想法就去试一下,最好不要在两个地方操作同一个东西,考虑一下主循环与中断同时操作SPI2是否会引起冲突或死机或影响ADS1256的指令时序
不要在中断里进行文件操作,太耗时,下次中断就来不及响应了。
我还是那句话,先别弄SD卡了,把数据整对再说,数据可以用串口发给电脑。

专治疑难杂症
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 11:30:26 | 显示全部楼层
LcwSwust 发表于 2023-7-27 11:27
有想法就去试一下,最好不要在两个地方操作同一个东西,考虑一下主循环与中断同时操作SPI2是否会引起冲突 ...

我试了,没有死机。我怕数据处理太耗时了,直接写二进制进去,结果卡里全是乱码。用winhex看了,是没有数据的乱码。啊啊啊
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-27 11:31:25 | 显示全部楼层
葭月之末 发表于 2023-7-27 11:30
我试了,没有死机。我怕数据处理太耗时了,直接写二进制进去,结果卡里全是乱码。用winhex看了,是没有数 ...

嗯,那你继续。
专治疑难杂症
回复

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4418
金钱
4418
注册时间
2018-5-11
在线时间
923 小时
发表于 2023-7-27 11:31:46 | 显示全部楼层
本帖最后由 warship 于 2023-7-27 11:37 编辑

LcwSwust说得对,
先不要搞SD了,
眉毛胡子一把抓,不利于排查问题。
先采集数据保存在数据,
然后输出到串口,
分析数据是否正常,
如果正常了,
再逐步加大信号频率,
看看在满足需求的情况下最大能支持到多高的频率。
ADS1256最大采样率30kSPS
对1kHz以下采样波形应该还凑合,
有再高的频率需求就别想了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 11:37:05 | 显示全部楼层
warship 发表于 2023-7-27 11:31
LcwSwust说得对,
先不要搞SD了,
眉毛胡子一把抓,不利于排查问题。

谢谢您的回复!
这个“先采集数据保存在数据”是啥意思啊
我之前看了,输出到串口的数据和我卡里的数据是一样的呢
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 11:37:31 | 显示全部楼层

不知道乍整了大佬。哎
回复

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4418
金钱
4418
注册时间
2018-5-11
在线时间
923 小时
发表于 2023-7-27 11:40:28 | 显示全部楼层
本帖最后由 warship 于 2023-7-27 11:42 编辑
葭月之末 发表于 2023-7-27 11:37
谢谢您的回复!
这个“先采集数据保存在数据”是啥意思啊
我之前看了,输出到串口的数据和我卡里的数据 ...

写错了,是先采集数据保存在数组,
保存两三个周期的数据就可以,
然后输出到串口分析数据是否正确。
直接写卡会比较耗时,
不利于分析问题。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 11:54:23 | 显示全部楼层
warship 发表于 2023-7-27 11:40
写错了,是先采集数据保存在数组,
保存两三个周期的数据就可以,
然后输出到串口分析数据是否正确。

好的。我想问问您:
1、保存两三个周期的话,我的理解是需要监测数据到来的次数,也就是当DRDY触发三次以后停止采集的意思吗?
回复

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4418
金钱
4418
注册时间
2018-5-11
在线时间
923 小时
发表于 2023-7-27 12:25:05 | 显示全部楼层
葭月之末 发表于 2023-7-27 11:54
好的。我想问问您:
1、保存两三个周期的话,我的理解是需要监测数据到来的次数,也就是当DRDY触发三次 ...

单次采集的话,
每次DRDY只能读取单个数据,
连续采集的话,
你要根据设置的采样速度还有信号频率,
算一算两三个周期后停止采集,
具体要研究ADS1256的手册。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 12:51:23 | 显示全部楼层
warship 发表于 2023-7-27 12:25
单次采集的话,
每次DRDY只能读取单个数据,
连续采集的话,

好的,我知道了。我说的三次是按照单词采集的,
我还想再问问您“输出到串口分析数据”大概是什么样的呢?我串口用的不多,谢谢
还想问问您,有没有类似的采集数据保存到SD卡的比较高速的例程呢?时间不多了,有点急,非常感谢
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-7-27 15:22:56 | 显示全部楼层
葭月之末 发表于 2023-7-27 12:51
好的,我知道了。我说的三次是按照单词采集的,
我还想再问问您“输出到串口分析数据”大概是什么样的呢 ...

SDIO+DMA写文件4M/s都没压力的,你要是不用文件系统还可以更快,看了一轮感觉你的问题出在采样上,不是在存储上
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 16:08:58 | 显示全部楼层
阿侑kevin 发表于 2023-7-27 15:22
SDIO+DMA写文件4M/s都没压力的,你要是不用文件系统还可以更快,看了一轮感觉你的问题出在采样上,不是在 ...

对的,我测试过速度的,也计算过,是可以的。但是不知道怎么解决。
您说的问题在采样上,可以具体一点指点一下吗?大佬
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-7-27 16:11:58 | 显示全部楼层
本帖最后由 阿侑kevin 于 2023-7-27 16:13 编辑
葭月之末 发表于 2023-7-27 16:08
对的,我测试过速度的,也计算过,是可以的。但是不知道怎么解决。
您说的问题在采样上,可以具体一点指 ...

前面几楼都已经说了啊,你先采样,然后用串口吧采样数据打印出来画图,看看你的采样对不对,你要不会用串口也可以用keil自带的终端输出,然后保存成文件https://blog.csdn.net/wbdxz/article/details/104536153
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 16:22:27 | 显示全部楼层
阿侑kevin 发表于 2023-7-27 16:11
前面几楼都已经说了啊,你先采样,然后用串口吧采样数据打印出来画图,看看你的采样对不对,你要不会用串 ...

好的,谢谢您们。我去学习一下。
但是我也怀疑是不是我将数据存进SD卡的方式或者“时候”不对。
请问一下您,有采集AD数据(比较高速一点的)存进SD卡的例程可以参考一下吗?
非常感谢
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2023-7-27 16:25:03 | 显示全部楼层
较高的采样率不大建议,太高了精度就差了,我这边测1K采样率配合差分输入精度还可以,如果是单端输入精度则差点
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-7-27 16:34:49 | 显示全部楼层
葭月之末 发表于 2023-7-27 16:22
好的,谢谢您们。我去学习一下。
但是我也怀疑是不是我将数据存进SD卡的方式或者“时候”不对。
请问一 ...

一步步来,第一次先搞定采样,第二步再搞存储,SD卡存储例程百度很多
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 16:51:42 | 显示全部楼层
阿侑kevin 发表于 2023-7-27 16:34
一步步来,第一次先搞定采样,第二步再搞存储,SD卡存储例程百度很多

啊啊啊,主要是我是两个都初步拉通了才整合在一起的。
主要是AD的采样率上不去。哎
回复

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2021-8-16
在线时间
64 小时
 楼主| 发表于 2023-7-27 16:53:32 | 显示全部楼层
peng1554 发表于 2023-7-27 16:25
较高的采样率不大建议,太高了精度就差了,我这边测1K采样率配合差分输入精度还可以,如果是单端输入精度则 ...

主要是我现在1K都达不到。
版主可以参考一下您是怎么采集以及存储的吗?我找了好久都没解决。
时间都过去了,好着急啊
非常感谢答复!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 04:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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