This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADS1299: 关于ADS1299运行几分钟后就出现失真的问题

Part Number: ADS1299

我利用信号发生器输出接到ADS1299上进行测试的时候,发现刚开始运行的时候各个通道都没有问题,但是过了四五分钟左右之后就出现了好几个通道都出现了失真的情况,请问这是什么原因呢?

  • 您好,

    用示波器检查下基准电压是否是稳定的?您采集内部测试信号也有这种现象吗?

  • 内部测试信号是将CHnSET 设置成0x61进行内部噪声测试呢还是将其设置成0x65进行方波测试呢?

  • 设置成0x65进行方波测试

  • 设置成0x65后测了十几分钟没有出现相关的通道有失真的情况,但是这个波形好像不是方波吧,这个波形怎么这么奇怪呢?这个是正确的波形嘛?

  • 此时您使用的fCLK是多少?CONFIG2配置的值是什么?因为PGA Gain 与信号带宽有关(数据表 table 5),PGA设置24,不知道是不是带宽太窄的原因造成的。您将增益设置为1 看是怎样的输出?

    基准电压用示波器检查是稳定的吗?值是多少?

    另外,您可以您读取转换结果的SPI通信波形吗?看下通信时序是否存在问题

  • fCLK=2.048MHZ

    CONFIG2设置成0xd0;

    增益改为1也是一样的波形

  • 基准电压是VREFP嘛?测电压不是用万用表测的嘛?

  • 基准电压是VREFP和VREFN之间的电压,用万用表量测不出来是否波动,万用表测量的是有效值。

  • 因为我的板子都是贴片,没有引出来的引脚接口,所以用示波器不可能一直戳着去测量的啊,有一个点是,我用内部方波信号去测量的时候并没有出现失真的现象,但是用信号发生器的时候过了四五分钟后就会出现部分通道波形失真的情况,这应该跟基准电压没有关系吧,如果有关系为什么内部信号是正常的呢?

    顺便提一下,为什么我的内部方波信号出来的波形这么奇怪呢?正常的测试信号应该是什么样子的呢?需要怎么修改呢?

    麻烦尽快回复解决一下。谢谢

  • 现在看您测量出的内部方波信号异常,不是正常的方波信号,以及运行四五分钟后出现失真,这都可能是基准电压、供电电压不稳定或引入干扰造成的。

    为了排除与输入信号、输入电路等有关,建议先调试好先能够正确测量内部test信号。

    您可以飞线从测试点或芯片管脚引出测试线连接到示波器探头上进行测量。

  • 内部测试信号除了将CHnSET设置成0x65之外,其他寄存器需不需要修改呢?比如CONFIG2或者其他寄存器

  • 是的,需要通过CONFIG2寄存器配置测试信号源、幅值和频率的。

  • 那一般需要配置成什么呢

  • 为方便测试,一般都选内部测试信号。

    幅值都可以;

    方波信号的话,CAL_FREQ[1:0]就是00或01。

    通过内部测试信号,主要是想排除与外部输入信号源、输入电路等有关的因素。

  • 我是把VREFP、VREFN引出来接到示波器观察就可以是嘛?

    还有就是正常的内部测试信号波形是什么样的呢?

  • 是的;

    配置成交流信号的话,采集电压值绘制波形出来,就是方波信号。

  • 怎么知道配置的是不是交流信号,配置成交流信号需要修改哪些寄存器呢?

  • 就是配置CONFIG2寄存器 bit CAL_FREQ[1:0]为00或01以选择不同的频率。

  • 我将VREFP引出来后,观察其一直是高电平,没有问题啊,因为我的VREFN接的是地

  • 我针对一个通道输入稳定的正弦波的时候,观察了十几分钟之后并没有出现波形失真的情况,但是为什么测试信号输出不正确呢?

  • fclk是多少?将增益设置为1再看看,因为增益设置与带宽有关,看看是不是将增益设置为24导致带宽太窄的原因

  • 我针对一个通道输入稳定的正弦波的时候,观察了十几分钟之后并没有出现波形失真的情况

    这里的正弦波输出幅值是正确的吗?

  • 另外,上述异常的方波您是怎样由输出代码转换成的?这个转换过程是否验证过是正常的?

  • fclk采用外部的2.048MHZ,之前设置成内部测试信号的时候有将增益设置成1的,它也是一样的波形。

  • 上述正弦波我是使用信号发生器输出幅值为2mv的波形,增益为24,这样的输出正弦波幅值是正确的吧。

  • 这个在您之前的回复中我看到了,抱歉,上一条回复我该删掉的,忘记删掉了

  • 异常的方波的输出还是跟输入正弦波一样的,就是设置成DRDY中断形式,然后中断后就去读取数据。

  • 上述正弦波我是使用信号发生器输出幅值为2mv的波形,增益为24,这样的输出正弦波幅值是正确的吧。

    输出幅值是多少?是2*24=48mV吗?

  • 异常的方波的输出还是跟输入正弦波一样的,就是设置成DRDY中断形式,然后中断后就去读取数据。

    您采集的是ADC转换输出的数字信号,我的意思是您是怎样将数字信号转换成上述波形的?这个转换过程是否验证过是正确的

  • 这个转换是在上位机进行转换的,我这边没有处理。输出的幅值是正确的。

  • 我之前有用直接输入固定的电平值,然后再计算其输出电平值,结果是正确的。

  • 抱歉,点错了,本来想点“回复”的,不过也没啥关系。

    您可以将采集内部测试信号时的寄存器配置附在这里吗?我想看一下是否使能了偏置电路。

    将数字信号转换成上述波形的过程,建议您验证其过程的正确性

  • /**ADS1299上电复位 **/
    void ADS_PowerOnInit(uint8_t num)
    {
        uint8_t temp=0;
    
        switch(num)
        {
            case 0:
    
                GPIO_write(CONFIG_ADS1299_CS1, 0);//Low to communicated
    
                usleep(1000);
                SPI_ReadWriteByte(ADS_RESET);
                usleep(1000);//wait for stable,最小2个SCLK
                SPI_ReadWriteByte(SDATAC);//STOP命令在硬件上已经将START拉低了
                usleep(1000);//wait for stable
    
                //*fc for bias test
                ADS_REG(num,WREG|ID,0X3e);      //ID:0X3E
                usleep(5);
                ADS_REG(num,WREG|CONFIG1,0xf4); //  启动CLK时钟输出 数据速率为1ksps
                usleep(5);
                ADS_REG(num,WREG|CONFIG2,0Xd0);//测试方波信号内部产生,方波幅值(VREFP–VREFN)/2400=±3.75mV 增益24 实际测到的电压±90mV  权值 4500000uV/8838606 = 0.509uV
                usleep(5);
                ADS_REG(num,WREG|CONFIG3,0Xec); //使用内部参考电压,BIASREF使用内部产生(AVDD+AVSS)/2,使能BIAS buffer ec
                usleep(5);
    
                ADS_REG(num,WREG|LOFF,0X00);     //关闭导联脱落检测相关
                usleep(5);
                //0x65 内部方波测试,0x61 内部噪声测试
                ADS_REG(num,WREG|CH1SET,0X65);  //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH2SET,0X65);    //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH3SET,0X65);    //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH4SET,0X65);    //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH5SET,0X65);  //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH6SET,0X65);    //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH7SET,0X65);  //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH8SET,0X65);    //amplified x24
                usleep(5);
    
                ADS_REG(num,WREG|BIAS_SENSP,0X01);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|BIAS_SENSN,0X01);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_SENSP,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_SENSN,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_FLIP,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_STATP,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_STATN,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|GPIO,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|MISC1,0X20);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|MISC2,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|CONFIG4,0X00);     //使用对应通道右腿驱动
                usleep(5);
                GPIO_write(CONFIG_ADS1299_CS1, 1);
    
                temp=ADS_REG(num,RREG|CONFIG1,0xf4);   //  250Hz 0x96;500hz,0x95
                LOG_INFO("CONFIG1: 0X%x", temp);
    
                break;
    
            case 1:
                GPIO_write(CONFIG_ADS1299_CS2, 0);//Low to communicated
                usleep(5);
                SPI_ReadWriteByte(ADS_RESET);
                usleep(9);//wait for stable
                SPI_ReadWriteByte(SDATAC);
                usleep(10);//wait for stable
    
                //*fc for bias test
                ADS_REG(num,WREG|ID,0X3e);      //ID:0X3E
                usleep(5);
                ADS_REG(num,WREG|CONFIG1,0xd4); //  启动CLK时钟输出 数据速率为1ksps
                usleep(5);
                ADS_REG(num,WREG|CONFIG2,0Xd0);//测试方波信号内部产生,方波幅值(VREFP–VREFN)/2400=±3.75mV 增益24 实际测到的电压±90mV  权值 4500000uV/8838606 = 0.509uV
                usleep(5);
                ADS_REG(num,WREG|CONFIG3,0Xe8); //使用内部参考电压,BIASREF使用内部产生(AVDD+AVSS)/2,使能BIAS buffer ec
                usleep(5);
    
                ADS_REG(num,WREG|LOFF,0X00);     //关闭导联脱落检测相关
                usleep(5);
                ADS_REG(num,WREG|CH1SET,0X65);  //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH2SET,0X65);    //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH3SET,0X65);    //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH4SET,0X65);    //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH5SET,0X65);  //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH6SET,0X65);    //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH7SET,0X65);  //amplified x24
                usleep(5);
                ADS_REG(num,WREG|CH8SET,0X65);    //amplified x24
                usleep(5);
    
                ADS_REG(num,WREG|BIAS_SENSP,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|BIAS_SENSN,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_SENSP,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_SENSN,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_FLIP,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_STATP,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|LOFF_STATN,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|GPIO,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|MISC1,0X20);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|MISC2,0X00);     //使用对应通道右腿驱动
                usleep(5);
                ADS_REG(num,WREG|CONFIG4,0X00);     //使用对应通道右腿驱动
                usleep(5);
    
                GPIO_write(CONFIG_ADS1299_CS2, 1);
    
                temp=ADS_REG(num,RREG|CONFIG1,0xf4);   //  250Hz 0x96;500hz,0x95
                LOG_INFO("CONFIG1: 0X%x", temp);
    
                break;
    
        }
    
    }

  • 看上面代码有2种配置方式,case0和case1,在采集内部方波信号的时候,您使用的是哪种?

    两种配置方式MISC1寄存器SRB1 都置1了,电路图中SRB1管脚接的是什么?

  • case0和case1是因为我们使用了两片ADS1299,在采集内部方波信号时我将两片的16个通道都设置成了0x65

  • 看上图SRB1是连接导联的,SRB1置1的话,那么它是连接到采样通道的负输入端的,会影响内部测试信号的。 

    我不知道 BIAS电路是怎样连接的,为排除影响,您将寄存器 BIAS_SENSP、BIAS_SENSN和SRB1都置0,看采集内部信号是否正常?

  • 我按照你说的将BIAS_SENSP、BIAS_SENSN和SRB1都置0了,但是内部测试信号还是跟之前一样

  • 将数字信号转换成上述波形的过程,您是否验证其过程的正确性?

    为方便跟进您的问题,您可以针对内部测试信号异常重新发个帖子吗?这个帖子太长了,不方便跟进

  • 这个转换过程应该没有问题,因为我使用信号发生器输出正弦波的时候是能够正常转换的,而且也将信号发生器接到示波器去观察其其波形是非常稳定和顺滑的

  • 使用信号发生器输出正弦波的时候是能够正常转换的

    您这里描述的应该是ADC过程。

    我上述描述的转换过程,是将采集的数字信号转换成您上图显示的模拟信号,是DAC过程,我需要您确认的是这个DAC过程。