OpenEdv-开源电子网

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

ads1256采样率问题求助,实际采样与理想采样不符。

[复制链接]

8

主题

31

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-10-9
在线时间
57 小时
发表于 2023-2-16 11:00:21 | 显示全部楼层 |阅读模式
20金钱
pclk2(spi1)设置成36MHz,spi1分频256,采样率30ksps。我代码采1000个点,相当于采1/30秒,采集30hz频率的方波,按道理理想的采集结果是1个周期的波形,但是实际结果确实很多个周期波形。实在找不出原因,向大家求助一下!!!是代码的问题还是频率设置的有问题,麻烦大家了
33333.png

adtest spi.rar

4.68 MB, 下载次数: 7

最佳答案

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

哦,奇怪,下载的压缩包里ads1256.c没那个函数。 不过,看你贴出来的ADS1256ReadData函数没有问题。 那就检查一下该芯片的晶振频率,尽量将SPI频率弄高些。 还有就是,看你每次读取都有“设置通道”,ADS1256ReadData要发送9字节, 30K采样的话就是30K*9*8=2.1MHz的SCK频率,估计不行啊,得想办法提高效率,不要每次都设置通道。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-2-16 11:00:22 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-2-16 16:50 编辑
A1YCIA 发表于 2023-2-16 16:27
你好。ads1256readdata代码在ads1256.c里面。

哦,奇怪,下载的压缩包里ads1256.c没那个函数。
不过,看你贴出来的ADS1256ReadData函数没有问题。
那就检查一下该芯片的晶振频率,尽量将SPI频率弄高些。

还有就是,看你每次读取都有“设置通道”,ADS1256ReadData要发送9字节,
30K采样的话就是30K*9*8=2.1MHz的SCK频率,估计不行啊,得想办法提高效率,不要每次都设置通道。
专治疑难杂症
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-2-16 13:13:01 | 显示全部楼层
36MHz/256分频/8位数据=每秒传输约17.6K字节,如何做到“采样率30ksps”?
专治疑难杂症
回复

使用道具 举报

8

主题

31

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-10-9
在线时间
57 小时
 楼主| 发表于 2023-2-16 15:52:00 | 显示全部楼层
本帖最后由 A1YCIA 于 2023-2-16 15:54 编辑

@LcwSwust 您好,我改成128分频还是没有实现采集到1个周期的方波,我用256分频采集到大概32个周期(图右),改成128分频采集到大概16个周期(图左),但是我再降低分频采集到的结果就全是乱的数字了,请教一下
22222.png
MUME9ZLA`38C%ROI)`BP1HW.png
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-2-16 16:19:37 | 显示全部楼层
A1YCIA 发表于 2023-2-16 15:52
@LcwSwust 您好,我改成128分频还是没有实现采集到1个周期的方波,我用256分频采集到大概32个周期(图右), ...

你的代码里我没看到ADS1256ReadData函数的源码。根据手册,如果你的ADS芯片晶振是7.68MHz,那你的SCK频率最高可以达到1.92MHz。
傲游截图20230216161643.jpg


傲游截图20230216161748.jpg
专治疑难杂症
回复

使用道具 举报

8

主题

31

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-10-9
在线时间
57 小时
 楼主| 发表于 2023-2-16 16:26:59 | 显示全部楼层
LcwSwust 发表于 2023-2-16 16:19
你的代码里我没看到ADS1256ReadData函数的源码。根据手册,如果你的ADS芯片晶振是7.68MHz,那你的SCK频率 ...

unsigned char SPI_WriteByte(unsigned char TxData)
{
  unsigned char RxData=0;
  while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
  SPI_I2S_SendData(SPI1,TxData);
  while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
  RxData=SPI_I2S_ReceiveData(SPI1);
  return RxData;
}


//-----------------------------------------------------------------//
//        功    能:ADS1256 写数据
//        入口参数: /
//        出口参数: /
//        全局变量: /
//        备    注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
   
        CS_0();
        while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器
        //向寄存器写入数据地址
    SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
    //写入数据的个数n-1
    SPI_WriteByte(0x00);
    //向regaddr地址指向的寄存器写入数据databyte
    SPI_WriteByte(databyte);
        CS_1();
}


//初始化ADS1256
void ADS1256_Init(void)
{
        //*************自校准****************
           while(ADS1256_DRDY);
        CS_0();
        SPI_WriteByte(ADS1256_CMD_SELFCAL);
        while(ADS1256_DRDY);
        CS_1();
        //**********************************

//        ADS1256WREG(ADS1256_STATUS,0x06);               // 高位在前、使用缓冲
        ADS1256WREG(ADS1256_STATUS,0x04);               // 高位在前、不使用缓冲

        //ADS1256WREG(ADS1256_MUX,0x00|0x01);                  // 初始化端口A0为‘+’,AINCOM位‘-’
        ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1);                // 放大倍数1
        ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_15000SPS);  // 数据10sps
        ADS1256WREG(ADS1256_IO,0x00);               

        //*************自校准****************
        while(ADS1256_DRDY);
        CS_0();
        SPI_WriteByte(ADS1256_CMD_SELFCAL);
        while(ADS1256_DRDY);
        CS_1();
        //**********************************
}

//读取AD值
signed int ADS1256ReadData(unsigned char channel)  
{

    unsigned int sum=0;
       
        while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器
        ADS1256WREG(ADS1256_MUX,channel);                //设置通道
        CS_0();
        SPI_WriteByte(ADS1256_CMD_SYNC);
        SPI_WriteByte(ADS1256_CMD_WAKEUP);                      
        SPI_WriteByte(ADS1256_CMD_RDATA);
           sum |= (SPI_WriteByte(0xff) << 16);
        sum |= (SPI_WriteByte(0xff) << 8);
        sum |= SPI_WriteByte(0xff);
        CS_1();

        if (sum>0x7FFFFF)           // if MSB=1,
        {
                sum -= 0x1000000;       // do 2's complement

        }
    return sum;
}


回复

使用道具 举报

8

主题

31

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-10-9
在线时间
57 小时
 楼主| 发表于 2023-2-16 16:27:32 | 显示全部楼层
LcwSwust 发表于 2023-2-16 16:19
你的代码里我没看到ADS1256ReadData函数的源码。根据手册,如果你的ADS芯片晶振是7.68MHz,那你的SCK频率 ...

你好。ads1256readdata代码在ads1256.c里面。
回复

使用道具 举报

8

主题

31

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-10-9
在线时间
57 小时
 楼主| 发表于 2023-2-16 17:03:20 | 显示全部楼层
LcwSwust 发表于 2023-2-16 16:45
哦,奇怪,下载的压缩包里ads1256.c没那个函数。
不过,看你贴出来的ADS1256ReadData函数没有问题。
那 ...

好的谢谢您啦麻烦了
回复

使用道具 举报

8

主题

31

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-10-9
在线时间
57 小时
 楼主| 发表于 2023-2-24 11:43:34 | 显示全部楼层
@LcwSwust 您好,麻烦再请教您一下,我已经把spi频率调到最高,72M/8分频,然后我把设置通道也从读取函数里移除,但是我的采样率还是不理想,测得比理论的慢。
这是我现在的代码和原理图
2.png
1.png

adtest spi.rar

5.31 MB, 下载次数: 9

回复

使用道具 举报

8

主题

31

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-10-9
在线时间
57 小时
 楼主| 发表于 2023-2-24 11:44:05 | 显示全部楼层
还有是我没有把spinss 引脚接到ad cs上吗
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2023-4-6
在线时间
0 小时
发表于 2023-4-6 10:24:20 | 显示全部楼层
最近我也遇到了相似的问题,可以参考另外一位博主的帖子,应该是循环设置采样通道导致的采样率降低。https://www.shaoqun.com/a/1257397.html
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 11:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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