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与 Arduino Due (UDOO 板)采样频率问题

Guru**** 2502075 points
Other Parts Discussed in Thread: ADS1299, ADS1298, ADS1294, ADS1296

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/679079/ads1299-interfacing-ads1299-with-arduino-due-udoo-board-sampling-frequency-problem

器件型号:ADS1299
主题中讨论的其他器件: ADS1298ADS1294ADS1296

我们目前正在使用 ADS1299并使用 SPI 接口与 Arduino Due 进行通信。 除了 CONFIG1寄存器中写入0x94h (对应于1K SPS)之外、每个寄存器都设置为默认值。 器件设置为 RDATAC 模式、当 DRDY 变为低电平且 CS 设置为高电平时接收字节。 然而、即使最低采样率为250SPS、我们每通道仅能接收166个样本。
这是从 SPI 接口接收样本的代码部分、在 void 循环方法中连续调用该接口。
int sendOsc (空)
 如果(!isRDATAC)||(gNumActiveChan < 1) )返回(10);//设备应处于 RDATAC 模式
 if (digitalRead (IPIn_DRDY)=高电平)返回(20);
 digitalWrite (IPIn_CS、低电平);
 delayMicroseconds (1);
 int numSerialBytes = 1 +(3 * gNumActiveChan);
 WiredSerial.println (numSerialBytes);//8位报头加上每个活动信道24位
 unsigned char serialBytes[numSerialBytes];
 int i = 0;
 int Vref = 4.5;
 长 val;
 serialBytes[i++]= SPI.transfer (0);
 SPI.transfer (0);//跳过标头的第2个字节
 SPI.transfer (0);//跳过标头的第3个字节
 
 
 对于(int ch = 1;ch <= gNumActiveChan;ch++)
 
 
   IF (gActiveChan [ch])
         
     
     serialBytes[i++]= SPI.transfer (0); //每通道读取3个字节
    
     serialBytes[i++]= SPI.transfer (0);
 
     serialBytes[i++]= SPI.transfer (0);
     
     int k = i - 2;
     IF (serialBytes[k]& 0x80)
       Val =((0xFF << 24)|(serialBytes[k]& 0xFF)<< 16)|(serialBytes[k + 1]& 0xFF)<< 8)|((serialBytes[k + 2]& 0xFF)<< 0);
     其他
       Val =((0x00 << 24)|(serialBytes[k]& 0xFF)<< 16)|(serialBytes[k + 1]& 0xFF)<< 8)|((serialBytes[k + 2]& 0xFF)<< 0);
 
        双电压= val *(Vref /(pow (2、23)- 1)/ 12 * 1000000);//转换为微电压
           WiredSerial.print (voltage);
            WiredSerial.print (");
   
 
          
 
 WiredSerial.println();
 delayMicroseconds (1);
 digitalWrite (IPIn_CS、高电平);
 退货(50);
 
 
 
 
设置代码如下所示–
 
void adsSetup()
 //使用命名空间 ADS1298;
 ADC_wreg (GPIO、0);
 ADC_wreg (CONFIG3、PD_REFBUF | CONFIG3_CONST);
 //对于 RLD:为内部基准加电并等待其稳定
 // adc_wreg (CONFIG3、RLDREF_INT | PD_RLD | PD_REFBUF | VREF_4V | CONFIG3_CONST);
 //延迟(150);
 adc_wreg (config1、0x94h);
延迟(150);
 对于(int i = 1;i <= 8;++I)
 
   ADC_wreg (CHnSET + I、FITER_INPUT | GAIN_12X);//使用 x12增益报告此通道
 
 digitalWrite (PIN_START、HIGH);
 
void setup()
 PinMode (IPIn_CS、输出);
 引脚模式(PIN_START、输出);
 引脚模式(IPIn_DRDY、输入);
 SPI.begin();
 SPI.setBitOrder(MSBFIRST);
 SPI.setDataMode(SPI_MODE1);
 delay (1000);//等待 ads129n 准备就绪-可能需要一段时间为电容器充电
 ADC_SEND_COMMAND (复位);
 延迟(10); //需要等待18 tclk 最小值
 ADC_SEND_COMMAND (SDATAC);
 延迟(10);
 //确定可用通道的型号和数量
 IDval = adc_rreg (ID);
 开关(IDval & B00011111)
 {//最低有效位报告通道
   案件  B10000://16
     gMaxChan = 4;//ads1294
     中断;
   案例 B10001://17
     gMaxChan = 6;//ads1296
     中断;
   B10010号案件://18
     gMaxChan = 8;//ADS1298
     中断;
   B11110案://30
     gMaxChan = 8;//ads1299
     中断;
   默认值:
     gMaxChan = 0;
 
 WiredSerial.begin(BAUD_RATE);
 while (WiredSerial.Read()>=0)
 延迟(200); //获取由于复位问题而导致的
 IF (gMaxChan = 0)
 
   PinMode (kPIN_LED、输出);
   while (1)
   {//loop forever
     digitalWrite (kPIN_LED、HIGH);  //打开 LED
     延迟(500);               
     digitalWrite (kPIN_LED、低电平);   //关闭 LED
     延迟(500);
   
 }//错误模式
 adsSetup();
 gNumActiveChan = detectActiveChannels();
 ADC_SEND_COMMAND (RDATAC);
 延迟(10);
 isRDATAC = true;
 
请参阅下面随附的文件。 该代码包含我们对寄存器的读取和写入方式。
 

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

    感谢您的发帖、欢迎来到我们的论坛!

    如果我们可以查看示波器捕获或显示 SPI 信号(DIN、DOUT、SCLK、/CS)以及/DRDY 中断的逻辑分析仪输出、则更容易地调试该问题。 将数据速率配置为1kSPS 后、是否会在不读取数据的情况下看到一致的/DRDY 中断?


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

    您好、Ryan、

    感谢您的回复。 我们尝试使用 DSO 进行检查、发现当我们通过软件应用测试信号时、当数据被传输时、DRDY 正在相对于 DOUT 进行切换。 但是、当我们上传上述代码时、我们发现在通过 SPI 传输通道字节期间、DRDY 在之间切换、看起来不同步、即在传输期间未锁存为高电平、在其他情况下未锁存为低电平。 此外、标头字节在每24个字节后不会正确重复出现。 SCLK 与内部时钟同步是否存在问题? 要通过 RDATAC 模式获得所需的采样数、需要进行哪些必要的寄存器配置?

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

    Vaibhav、您好!

    在 RDATAC 模式下读取数据时、不允许/DRDY 从高电平转换为低电平。 输出移位寄存器中的数据将立即被新数据覆盖。 请记住、/DRDY 未锁存-在/DRDY 下降沿之后、第一个 SCLK 下降沿将强制/DRDY 清零并返回高电平。

    SCLK 和 CLK 不需要同步。 实际上、ADS1299中的 SPI 接口是异步接口。 目的是让您使用 GPIO 监视/DRDY 引脚的状态。 当/DRDY 变为低电平时、MCU 应进入中断服务例程(ISR)以收集数据。 这涉及将/CS 引脚拉低、切换 SCLK 直到接收到所有数据、并再次将/CS 拉高。 ISR 必须在下一次转换准备就绪前完成(即在下一个/DRDY 下降沿之前)。 连续/DRDY 下降沿之间的周期将等于配置的数据速率。

    如果无法足够快地读取数据、则必须降低数据速率或增加 SCLK 频率。 或者、RDATA 模式允许您通过在需要读取数据时发送 RDATA SPI 操作码来按需读取最新的转换结果。

    此致、