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-4:从ADS1299-4中读取连续数据

Guru**** 2560390 points
Other Parts Discussed in Thread: ADS1299, ADS1299EEGFE-PDK, ADS1299-4

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/615518/ads1299-4-read-continuous-data-from-ads1299-4

部件号:ADS1299-4
线程中讨论的其他部件:ADS1299ADS1299EEGFE-PDK

您好,

我正在使用 ADS1299-4在定制板上工作 ,与IC的通信似乎很好-识别号读取很好,可以写入和读取控制寄存器,像连续模式和采样频率这样的参数似乎设置没有问题。 我现在正处于从ADS1299获取数据的阶段,但我面临着无法获取有效数据的问题。

例如,对于5V的单极模拟电源,当使用ADS1299EEGFE-PDK通过通道1读取中间电源值时,我得到的ADC代码为0x0.047万F4D,电压为249.8142万V,两者看起来都正确。 但是,对于我的自定义板,我得到的值是相当随机的,而且似乎无效-虽然我期望得到大约0x0.047万F4D的ADC代码,但我得到的是一个相当随机的,彼此不同的数字序列,例如

H1数据:007FFFFFF0;CH2数据:45.692万
CH1数据:FFFFFF444A;CH2数据:FFEF0000
CH1数据:FFB3439A;CH2数据:2万
CH1数据:FFA345F9;CH2数据:FFB5万
CH1数据:66.4454万;CH2数据:FF89万
CH1数据:007FFFAA;CH2数据:0044EC74
CH1数据:FFA441F2;CH2数据:35万
CH1数据:FFE3.4533万;CH2数据:FFE1万
CH1数据:FFA644AA;CH2数据:78万
CH1数据:0.6444万C1;CH2数据:007D0000
CH1数据:FFB044C1;CH2数据:007B0000
CH1数据:FFAD4638;CH2数据:FF97万
CH1数据:FFA6.446万;CH2数据:77万
CH1数据:FFE7.4545万;CH2数据:FFCC0000
CH1数据:FDC4519;CH2数据:6万
CH1数据:0.0045万B9;CH2数据:77万

但是,对于其他类型的测量,情况似乎相似,中电压测量似乎最适合测试测量模式。

如果有人建议如何调试问题,我将不胜感激...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kamen:

    感谢您的提问。

    您是否可以共享您用于板上测量的寄存器设置?

    要验证设备的操作,您可以尝试探测参考电压和电源电压,以确认它们已按预期进行配置。 我假设您仍在使用单极5V电源和内部4.5 -V参考? 如果您愿意,您还可以共享原理图的ADS1299-4部分,我们可以查看相关的连接。

    此致,
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Ryan:

    感谢您的回复。 下面我提供了所需的详细信息。 我觉得我读取ADS1299中的数据的方式有些错误,但是我还不能弄清楚我忽略了什么。

    实际上,我使用的是单极电源5V (测量值- 5V电压正常),内部参考电压(测量的电压BIAS OUT-GND和BIAS INV-GND -与预期一样2.5V)。 在下图BIASREF,CH1 P,CH 1 N,CH2 P,CH2 N, SRB1是浮动的-尚未连接-我认为无需连接这些信号即可看到正确的内部测试信号。  

    ADS1299-4连接如下所示:

    ADS1299配置如下:

    /*******************************************************************************
    *
    ** ADS1299寄存器配置
    *
    ************************************************************************ /
    静态字节地址1299_cfg(void){
    
    字节设置;
    
    //=================== 配置并激活通道#1
    设置= 0x00;
    设置&=~channel_power _down; //为通道
    设置启用电源|= ADS1299_PGA_GAIN01;
    设置&=~SRB2; //我们不在应用程序中使用SRB2引脚,因此它是开放式
    设置|= ADS1299_input_supply;
    ads1299_write_reg (CH1SET,settings);
    
    settings = 0x00;
    settings &=~channel_power _down; //为通道
    设置启用电源|= ADS1299_PGA_GAIN01;
    设置&=~SRB2; //我们不在应用程序中使用SRB2引脚,因此它是开放式
    设置|= ADS1299_input_supply;
    ads1299_write_reg (CH2SET,设置);
    
    设置= 0x00;
    设置|=通道_电源_关闭; //禁用通道设置的电源
    |= ADS1299_PGA_GAIN01;
    设置&=~SRB2; //我们不在应用程序中使用SRB2引脚,因此它是开放式
    设置|= ADS1299_input_shBic;
    ads1299_write_reg(CH3SET, settings);
    
    设置= 0x00;
    设置|= channel_POWER_DOWN; //禁用通道设置的电源
    |= ADS1299_PGA_GAIN01;
    设置&=~SRB2; //我们不在应用程序中使用SRB2引脚,因此它是开放式
    设置|= ADS1299_input_shBic;
    ads1299_write_reg(CH4SET, settings);
    
    //=================== 设置配置寄存器1 -用于所有通道=================
    设置= 0x00;
    设置|= CFG1RES7; //写入1小时,用于位7
    设置|= DAISY_EN; //菊花链禁用
    设置&=~CLK_EN; //不向CLK引脚
    设置提供内部时钟信号|= sampling_rate 0.025万HZ;//采样率250 Hz
    
    ads1299_write_reg(config1, settings);
    
    //=================== SET CONFIG REGISTER 2-适用于所有通道==================
    设置= 0x00;
    设置|= CFG2RES75; //保留位[7:5],始终写入6H => 110
    设置|= INT_CAL; //使用内部测试信号
    设置|= CAL_AMP; //定义测试信号振幅
    设置|= CAL_FREQ_221; //定义测试信号频率
    
    ads1299_write_reg(CONFIIG2, settings);
    
    //=================== 设置配置寄存器3 -用于所有通道=================
    设置= 0x00;
    设置|= PD_REFBUF; //启用内部参考缓冲
    区设置|= CFG3RES_65; //始终写入3h
    设置&=~BIANSE_MEAS; //禁用所有通道
    设置的偏置测量|= BIASREF_INT; //使用内部偏置参考电压(AVDD+Avss)/2
    设置|= PD_BIAS; //启用偏置放大器功率
    设置&=~BIANSE_LOFF_SENS; //禁用偏置感应
    
    ads1299_write_reg(CONFIIG3, settings);
    
    //=================== SET CONFIG REGISTER 4-用于所有通道==================
    设置= 0x00;
    设置&=~CFG4RES_74; //始终写入0h
    设置&=~singer_shot; //连续转换模式
    设置&=~CFG4RES_2; //始终写入0h
    设置&=~PD_LOFF_COMP; //禁用导联脱落比较
    器设置&=~CFG4RES_0; //保留,始终写入0
    
    ads1299_write_reg(CONFIIG4,settings);
    
    ads1299_write_reg(LoFF_SENSP, 0x00);//为所有通道
    ads1299_write_reg (LoFF_SENSN, 0x00)禁用XP输入上所有通道
    ads1299_write_reg (bias sSENSP,0x00)的导联脱落检测;//为所有通道ads1299_senderation禁用x_ads99的输出
    //禁用所有通道的XP输出的路由,以促进偏置派生
    
    ads1299_write_reg (LoFF,0x00); //导联脱落控制寄存器....
    ads1299_write_reg (LoFF_flip,0x00);//导联脱落翻转寄存器....
    ads1299_write_reg (MISC1,0x00); //此寄存器提供将SRB1引脚路由到四个通道的所有反相输入的控制。
    
    返回0;}
    

    相应的定义:

    ...
    
    #define ADS1299_ID_Four_CH 0x1C
    #define ADS1299_4_MAX_CHAN 0x04 //ADS1299-4仅具有4个通道
    
    //SPI命令定义
    #define _wakeup 0x02 //从待机模式唤醒
    #define _standby 0x04 //进入待机模式
    #define _reset 0x06 //将设备寄存器重置为默认
    值#define _start 0x08 //开始和重新启动(同步)#conversions
    define _stop 0x0A //停止转换
    #define _RDATAC 0x10 //启用读取数据连续模式(通电时的默认模式)
    #define _SDATAC 0x11 //停止读取数据连续模式
    #define _RDATA 0x12 //通过命令读取数据; 支持多个回读
    #define _RREG 0x20 //读取寄存器
    #define _WREG 0x40 //写入寄存器
    
    //注册地址
    #define ID 0x00
    #define config1 0x01
    #define CONFIIG2 0x02
    #define CONFIG3 0x03
    #define LoFF 0x04
    #define CH1SET 0x05
    #定义CH2SET 0x06
    #定义CH3SET 0x07
    #定义CH4SET 0x08
    #define CH5SET 0x09
    #define CH6SET 0x0A
    #define CH7SET 0x0B
    #define CH8SET 0x0C
    #define bias SENSP 0x0D
    #define bias SENSN 0x0E
    #define LoFF_SENSP 0x0F
    #define LoFF_SENSN 0x10
    #define LoFF_flip 0x11
    #define LoFF_STATP 0x12
    #define LoFF_statn 0x13
    #define GPIO 0x14
    #define MISC1. 0x15
    #define MISC2. 0x16
    #define CONFIIG4 0x17
    
    // ads1299 config 1寄存器位
    #define CFG1RES7 0x80 // 1000万
    #define DAISY_EN 0x40 // 100万
    #define CLK_EN 0x20 // 10万
    #define CFG1RES43 0x10 // 1万
    #define sampling_rate 0.025万HZ 0x06 // 0.011万
    #define sampling_rate _0.05万HZ 0x05 // 0.0101万
    #define sampling_rate 0.1万HZ 0x04 // 0.01万
    #define sampling_rate 0.2万HZ 0x03 // 0.0011万
    #define sampling_rate _0.4万HZ 0x02 // 0.001万
    #define sampling_rate _0.8万HZ 0x01 // 0.0001万
    #define sampling_rate _1.6万HZ 0x00 // 0万
    
    // ads1299 config 2寄存器位
    #define CFG2RES75 0xC0 // 1100万
    #define INT_CAL 0x10 // 1万
    #define CFG2RES3 0x00 // 0万
    #define CAL_AMP 0x04 // 0.01万
    #define CAL_FREQ_221 0x00 // 0万
    #define CAL_FREQ_220 0x01 // 0.0001万
    #define CAL_FREQ_DC 0x03 // 0.0011万
    
    // ads1299 config 3寄存器位
    #define pd_REFBUF 0x80 // 1000万
    #define CFG3RES_65 0x42 // 110万
    #define bias _MEAS 0x00 // 1万
    #define BIASREF_INT 0x08 // 0.1万
    #define pd_bias 0x04 // 0.01万
    #define bias LoFF_SENS 0x00 // 0万
    #define bias _stat 0x01 // 0.0001万
    
    // ads1299 config 4寄存器位
    #define CFG4RES_74 0xF0 // 1111万
    #define singe_shot 0x08 // 1万
    #define CFG4RES_2 0x04 // 0.01万
    #define PD_LoFF_COMP 0x02 // 0.001万
    #define CFG4RES_0 0x00 // 0.0001万
    
    // ads1299单个通道设置位
    #define channel_power _ddown 0x80 // 1000万
    #define SRB2 0x08 //0.1万
    
    #define ADS1299_input_normal 0x00 // 0万
    #define ADS1299_input_s短路 0x01 // 0.0001万
    #define ADS1299_input_MEAS_Bias 0x02 // 0.001万
    #define ADS1299_input_supply 0x03 // 0.0011万
    #define ADS1299_input_TEMP 0x04 // 0.01万
    #define ADS1299_input_TESTSIGNAL 0x05 // 0.0101万
    #define ADS1299_input_set_BIASP 0x06 // 0.011万
    #define ADS1299_input_set_BIASN 0x07 // 0.0111万
    
    //增益
    #define ADS1299_PGA_GAIN01 0x00 // 0万
    #define ADS1299_PGA_GAIN02 0x10 // 1万
    #define ADS1299_PGA_GAIN04 0x20 // 10万
    #define ADS1299_PGA_GAIN06 0x30 // 11万
    #定义ADS1299_PGA_GAIN08 0x40 // 100万
    #define ADS1299_PGA_GAIN12 0x50 // 101万
    #define ADS1299_PGA_GAIN24 0x60 // 110万
    
    #define gain 1
    #define scale_fact 100万 *(4.5 / 838.8607万)/gain)// Vref= 4.5V;2^23-1 = 838.8607万...
    

    另外,我正在使用TI-RTOS,ADS1299-4 DATA READY引脚生成中断,在中断中,信号将被张贴到任务中(此部分似乎工作正常)。 数据读取部分如下所示:

    静态void data_taskFxn(UArg a0, UArg A1)
    {
    
    字节I,j,inByte;
    字节tmpb[4];
    UINT32状态数据;
    
    UINT32转换数据[ADS1299_4_MAX_CHAN];
    
    联合
    {
    浮子f;
    字节I[4];
    UINT32 x;
    }正在读取_ch_1,正在读取_ch_2;
    
    
    ...
    
    //===================
    semaphore_Params sParams;
    semaphore_Params_init (&sParams);
    sParams.mode = semaphore_Mode_binary;
    
    semaphore_construct (&sem1299,0,&sParams);
    hSem1299 = semaphore_handle (&sem1299);
    
    对于(;;){
    
    semaphore_pend (hSem1299,BIOS_WAY_Forever);
    
    ads1299_select();
    
    //============ 获取24位状态数据=================
    
    STATUS_DATA = 0x0万;
    
    //读取状态寄存器(1100 + LoFF_STATP + LoFF_statn + GPIO [7:4])
    用于(j=0;j<3;j++)
    {
    SPI_WRITE字节(0x00);
    SPI_READ_BYTE(&inByte);
    status_data=(status_data<<8)| inByte;
    }
    
    //============ 获取通道数据===================
    
    memset (ConversionData,0,sizeof (ConversionData));
    
    for (i=0;i<ADS1299_4_MAX_CHAN;i++)//读取ADS1299_4_MAX_CHAN x 3字节块中的24位通道数据
    { 	
    用于(j=0;j<3;j++)
    {
    SPI_WRITE字节(0x00);
    SPI_READ_BYTE(&inByte);
    ConversionData[i]=(ConversionData[I]<<8)| inByte;
    }
    }
    ads1299_Deselect ();
    
    //=================== 重新格式化数据===========================================
    
    用于(i=0;i<ADS1299_4_MAX_CHAN;i++)
    {
    IF (ConversionData[I]&0x80万)// IF ConversionData[I]的位23为1
    { 	
    ConversionData[i]|= 0xFF0万;
    }
    否则
    {
    ConversionData[i]&= 0x00FFFFFF;
    }
    }
    //========= 将ADC读数转换为电压=================================
    
    reading_ch_1.f =转换数据[0];
    reading_ch_1.f *= scale_fact;
    
    reading_ch_2.f =转换数据[1];
    reading_ch_2.f *= scale_fact;
    
    #ifdef DEBUGOUT
    Sprintf (UART_buf,"CH1:0x%8X",ConversionData[0]);
    write_UART ();
    #endif
    ... 

    上述代码的最新情况是,我从CH1的调试中得到以下信息(自我发布问题以来的情况略有不同):

    ...
    通道1:0xFFFFFFFFFF0000
    通道1:0xFFFFFFFFFF0000
    
    通道1:0xFFFFFFFFFF0000
    通道1:0xFFFFFFFFFFFFFFFF0000
    通道1:0xFFFFFFFFFF0000
    
    通道1:0xFFFFFFFFFF0000通道1:0xFFFFFFFFFF0000
    通道1:0xFFFFFFFFFF0000
    通道1:0xFFFF0000
    通道1:0xFFFFFF0000通道
    1:0xFFFFFF0000
    
    
    
    
    通道
    
    1:0xFFFFFF0000通道1:0xFFFFFF0000通道1:0xFFFFFF0000通道1
    
    :0xFFFFFF0000通道1:0xFFFFFF0000通道1:0xFFFFFF0:1:0xFFFFFF0通道1:0xFFFFFF0通道1:1:0xFFFFFF0:1:0xFFFFFF
    
    
    
    0xFFFF0000...
    



    持续打印以上结果表明由ADS1299-4驱动的中断机制工作正常
    (我还可以使用示波器观察中断内针脚切换的信号,这是正常的)。 如果我停止转换
    并且不断读取数据,尝试读取ID寄存器,它读取正常,所以我也排除了数据读取功能的问题。
    观察内部信号时,不应受电极针脚连接状态的影响。

    正如我所看到的,可能的问题可能是读取数据的顺序不正确(但我看不到其中的遗漏),或者
    案例数据读取(和调试)可能需要太多时间,用新值覆盖旧值可能会导致一些混乱-但我不是
    确定这是否是真正的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Kamen:

    感谢您提供更多详细信息。

    您提到您能够正确读取ID寄存器。 您是否还可以确认您可以读取所有设备寄存器? 这将确认寄存器已正确写入上面列出的设置。

    如果寄存器设置读回正确,我会尝试使用逻辑分析器探测一个或两个数据读取周期,并检查SPI信号(/CS,/DRDY,SCLK,DOUT)之间的计时。 正如您在上一个注释中所提到的,您可能会将读取事务与新数据重叠,从而导致数据损坏。 每个示例都以24位状态字开头,前四位始终为1100。

    此致,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Ryan:

    再次感谢您提供的有用建议。 我最终发现了数据读取的问题:

    如上面的代码所示,我盲目地遵循在线循环的代码示例,而不注意数据读取函数自动提供所需的虚拟字节, 因此,读取数据读取循环中的每个字节之前的SPI_WRITE BYTE(0x00)指令似乎转移了所有结果,导致混乱。 现在,我从设备获得的数据似乎很有意义-测试信号会发出,当收集电极信号时,我会听到噪音(尚未连接电极)。 现在,我面临着新的挑战: 设置中置测量值时,我得到一个代码0x007FFFFFFF,该代码似乎是有意义的值(23位“1”和MSB 1“0”表示符号),但这仍然与我希望看到的内容无关- 如前面所述,值接近0x0.047万F4D。

    寄存器设置中的任何设置是否可能反映中间供应的代码值?

    当前寄存器设置如下所示:


    CH1设置:0x03

    CH2设置:0x03

    CH3设置:0x81

    CH4设定:0x81

    配置1:0xD6

    CONFIIG2:0xD4

    CONFIIG3:0xCE

    CONFIIG4:0x00

    LoFF_SENSP:0x00

    LoFF_SENSN:0x00

    BIAS-SENSP:0x00

    BIAS-SENSN:0x00

    LoFF:0x00

    LoFF_flip:0x00

    MISC1:0x00

    在这种情况下,我正在向CONFIIG3提供一个值0xEC,但从它读取0xCE (偏差在 BIAS-LOFF_SENS和保留的位5中)-这种行为是否正常?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Ryan:
    经过一些思考后:

    ADC代码= 0x007FFFFFFF应是ADC范围内的最大正值。 因此,ADC代码0x007FFFFFFF对应于4.5V,这似乎是一个有意义的结果,但仍不是中端电源。

    我做错了什么,或者如何调查问题?  

    现在,我几乎可以正确读取从SPI读取的某些值。 另一个观察结果是,当选择测试信号的1x和2x幅度时,设置对输出没有影响。
    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Ryan:

    为了确认SPI通信没有问题,我测量了SPI总线上的信号。 因此,问题仍然是我所忽略的内容以及为什么我得到的是0x007FFFFFFF,而不是中电压的预期值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外,DRDY - CLCK行:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Kamen:

    感谢您的更新。

    我从最新的问题开始。 /DRDY将返回与第一个SCLK下降沿对齐的高值。 这不是设备的问题。 您必须使用/DRDY的下降边缘来监视新数据。

    您的寄存器设置显示正确,可读取MVDD测量值。 我不确定保留位的含义是什么(CONFIIG3中的位6:5),但您应该确认您写入了正确的值以确保。 不应将位5读为'0'。 请注意,您应该读取SPI设置为CPOL = 0和CPHA = 1的数据。 数据在SCLK的上升沿上移出,因此向上应在下降沿上锁定数据。

    此外,您提到在CONFIIG2中选择1x或2x选项时,测试信号幅值不会改变? 这肯定会有所不同,请您分享这些结果吗? 再次-确认您可以从设备读取正确的寄存器值,以确保设置已生效。

    此致,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的Ryan:
    感谢您的注释-最终我发现在用于配置寄存器的常量定义中有一个愚蠢的遗漏(也可在上面的代码中看到)。 现在我相信我能够正确地达到中等供应水平。

    现在我正在处理正确的测试信号-事实上,我正在看到脉冲,只是有点困惑如何将它们转换为电压。

    首先,查看数据表,我还不清楚测试信号直流电平在理论上应该是什么?

    此致,
    假面
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hi Kamen -测试信号的直流电平将是该给定通道的偏移电压。 要将输出代码转换为伏特,您需要将十进制等效值乘以LSB大小。 有关更多信息,请阅读第38页上的"数据格式"部分。

    此致,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ryan:
    我认为我现在得到了正确的信号和值。 非常感谢您在回答我的问题上付出的努力和时间。
    此致,
    假面
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Kamen:

    您所做的实际上是翻译输出代码的正确方法。 在二进制二进制补码中,您需要测试MSB以了解输出的符号。 基本上,对于MSB =0,您可以将输出代码直接从十六进制转换为十进制转换为伏特。 当MSB = 1时,您需要从十进制代码中减去(2^24 - 1),然后再转换为伏特。 您基本上做了相同的事情(但顺序相反)。 结果应为4.7945V - 4.5V =-0.0.2549万V。

    此直流电平-2.55mV是在PGA级输出时,INxP和INxN之间通道的偏移电压。

    此致,