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.

[参考译文] ADS1256:通道切换的正确排序

Guru**** 2535150 points
Other Parts Discussed in Thread: ADS1256

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1100605/ads1256-proper-sequencing-of-channel-switching

部件号:ADS1256

大家好,为基于Raspberry的DAQ使用Waveshare ADS1256 HAT。 我的读数速度很好(4个信道,1 kHz),我想澄清有关规范和代码的几件事。  

首先,我的WaitDRDY()函数只是一个while循环,打算最终实现中断。 它现在可以工作,但可以更有效。

最大的一个问题是规范中表13中的过滤器设置时间以及我如何实施它。 我的理解是,当多路复用器从一个通道切换到下一个通道时,需要一定的时间来采样新值并将其过滤掉,大概是为了防止上一个通道重影到新通道。 以我30 ksps的速率,我应该允许210我们这样做,这就是附加序列中的T18。 所以在我的代码中,我在SYNC和WAKEUP之间标记时间,发送WAKEUP和DATA READ命令,然后有一个while循环,在下一组事件之前等待210我们。 我尝试在While循环之前将该缓冲区数组移动到,但随后我得到了垃圾数据。 想知道我是否正确理解了计时顺序,以及是否有一种切片的方法来实现210 us延迟,比如取消其他引脚的中断?  

非常感谢!

Dave Ruxton

 

UDOUBLE ADS1256_FastRead (UBYTE通道){

UDOUBLE值= 0;
UbyTE buf[3]={0,0,0};
结构时间值停止,启动;
Int diffTime;


ADS1256_WaitDRDY();                     //等待数据就绪pin变为低电平
ADS1256_SetChannel (通道);              //将下一个通道写入MUX寄存器(如果在通道0上,则发送通道1)
ADS1256_WriteCmd (CMD_SYNC);            //发送同步命令
gettimeofday (&start,NULL);                  //过滤器设置时间的开始时间戳(T18在规格中)
ADS1256_WriteCmd (CMD_WAKEUP);         //发送唤醒命令
dev_Digital_Write(dev_CS_PIN, 0);          //下拉芯片选择引脚(未在规格中显示,但显然有必要?
DEP_SPI_WriteByte (CMD_RDATA);           //发送读取数据命令
而(1){                                 //等待过滤器稳定时间,连续检查计时器直到时间结束
gettimeofday (&stop,NULL);
DiffTime =(stop.tv_sec - start.tv_sec)* 100万 + stop.tv_usec - start.tv_usec;
IF (diffTime >= 210){/210 us,用于每个ads1236规范30 ksps的采样率
中断;
}
}
buf[0]= dev_SPI_ReadByte();               //将数据字节读入数组
buf[1]= dev_SPI_ReadByte();
buf[2]= dev_SPI_ReadByte();
dev_Digital_Write(dev_CS_PIN, 1);
值=((UDOUBLE) buf[0]<16)和0x00FF0000;        //读取字节并将其转换为值
值|=((UDOUBLE) buf[1]<8);
value |= buf[2];
IF (值和0x80万)                      //不知道它的作用,它在原始库中


值&= 0xFF0万;
dev_Digital_Write(dev_CS_PIN, 1);         //将CS引脚切换为高,不确定是否需要,将其保留
返回值;
}

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

    您好,David:

    通常,您希望DRDY是由中断驱动的,而不是基于计时器。 可以使用计时器,但也可能会失去对您在循环中的位置的跟踪,并获取损坏的数据。

    或者,您可以连续读回状态字节(寄存器0),其中位0复制DRDY的状态。 然后,当该位降低时,这表示新数据已准备就绪。

    ADS1256的输出采用二进制二进制补码格式。 指令"IF (value & 0x80万)"正在检查ADC输出代码MSB是否为1,这表示它是负数。

    此外,还有一点:波形共享板不是TI产品,我们不直接为其提供支持。 我可以帮助您了解ADS1256的一般操作,但对于特定于主板或固件的问题,您必须联系waveshare。 您还可以搜索此论坛上使用波形板的其他一些帖子,似乎其他人在以最高数据速率检索数据时遇到了问题。 我仍然不知道为什么。

    -Bryan

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

    谢谢,当我重写上述顺序时,我实际上已经接近规格30 ksps,但我人为地将唤醒呼叫和启动下一个信道交换机之间的时间限制为每个滤波器设置时间210 us。 这是否是对您的规范的正确解释?  

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

    您好,David:

    解释是正确的,但不能保证表13中给出的时间是准确的100 %。 无论您为ADC提供什么时钟,都将具有一定的容差,这将随温度和时间的变化而略有变化。 如果时钟速度减慢,即使是有一点(1 2 %),您也可能在新数据可用之前开始读取数据,因为您假设T18始终精确为210 us,而这一次取决于fCLK。 这就是为什么使用DRDY作为中断或至少轮询状态字节以查看新数据是否准备就绪更有意义的原因。

    同样,您所做的工作将 会奏效,只是不能保证工作正常。 我将由你决定如何进行。

    -Bryan

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

    我要给它一个机会。 感谢您的帮助!