大家好,为基于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引脚切换为高,不确定是否需要,将其保留
返回值;
}