主题中讨论的其他器件: ADS1271ADS1271EVM时钟和数据速率
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.
尊敬的社区用户:
首先,请抱歉我的英语不好。 我对 ADS1271EVM 的数据速率(!DRDY 信号)有疑问。 在开始之前、请让我解释一下我的硬件设置:
我尝试创建数据采集系统、为此、我将 ADS1271EVM 与 Arduino Due 结合使用。 主时钟由 Arduino 通过占空比为50%的 PWM 生成。 这种方法允许我轻松更改主时钟、从而更改 ADS1271的数据速率/采样率。 此外、ADS1271EVM 由外部 SCLK 源在高速模式下驱动。 顺便说一下:EVM 板上只有一个 ADS1271处于活动状态。 数据通过 Arduino 通过 SPI 读出、因为 Arduino 通常工作正常。 在测试中、我对幅值为1V 的100Hz Sinus 信号进行了采样、该信号由高质量声卡生成。 在附件中、可以看到使用 ADS1271EVM 采样的正弦值。 信号非常清晰! 当我计算 FFT 时、我真的"震惊"看到采样率比估计值低两倍。
在附件中、您可以看到两个图:一个图仅显示当 SCLK 为低电平时的!DRDY 脉冲、以检查采样率。 您可以看到、在这种情况下、采样率等于估计值20.4Khz@ CLK=10.4MHz。 第二个图显示了通过 SPI 读取数据时的信号。 该图由 CLK=27mH (Fs=52.6kHz)获得。 我们可以估计52.6kHz 的采样率、但您可以看到数据以大约26.3kHz 的频率进行采样。 此外、您还可以看到!DRDY 信号的一种"预脉冲"信号... 在数据表中、SPI 时序要求图中没有"预脉冲"。 这种预脉冲是正常行为还是有错误?
我读取样本的过程:
/
void loop(){
if (DATAREADY)
{
//这是为了避免两次中断,因为当发生预脉冲时,!DRDY 再次变为高电平!
PIOD->PIO_IDR = DRDY; //禁用!DRDY 引脚上的中断
adc_val 高字节= spi.transfer (0x00);
adc_val 中间字节= spi.transfer (0x00);
adc_val_low_Byte=spi.transfer (0x00);
//这是为了避免两次中断,因为当发生预脉冲时,!DRDY 再次变为高电平!
while (digitalRead (12)=高电平){
PIOD->PIO_IER = DRDY; //再次在!DRY PIN 上启用中断
}
DATAREADY=0;
}
}
//这是!DRDY 中断引脚的 ISR。 当 PIN 状态升高时、它会升高!
void ADS1271_DATAREADY()
{
DATAREADY=1;
}
注意:这种行为不取决于 CLK... 我不得不对不同 CLK 的图表示歉意。 它们不是在同一个 CLK 上获取的、但我可以确保行为相同。
非常感谢您的每一个提示!
此致、
图格鲁尔
您好、Alexander、
感谢您的快速回复。 我已经尝试在具有轮询功能的主 while 环路中等待!DRDY 信号,现在!DRDY 信号看起来“正常”,所以我得到估计的采样率! 我不确定, 但中断例程或处于中断模式的 GPIO 可能会导致该信号错误.... 正如大家看到的、我使用的是"Arduino-C-Code 而不是"low-leve-C-Code"、因此我不知道"简单"命令背后到底是什么代码...
我的硬件设置实际上是实验性的、这意味着 ADS1271EVM 通过"跳线"与 Arduino 到期板相连。 由于缺少50欧姆电阻器、信号线路上可能会有一些反射、但在轮询方法中、我从未经历过任何反射(请参阅 Sinus 示例图!)。
第二个问题是:振幅不准确:示例 sinus 具有0.5V (P2P:1V)、但采样的 sinus 显示:0.9V 至-0.6V...
原因是什么?
1) ADS1271输入(AINP 和 AINN)与信号源之间缺少 ADC 缓冲器?
2) 我用于将24位值转换为电压的代码缺点:
adc_val 高字节= spi.transfer (0x00); adc_val 中间字节= spi.transfer (0x00); adc_val_low_Byte=spi.transfer (0x00); ADC_val =(ADC_val 高字节<16)|(ADC_val 中位字节<8)|(ADC_val 低字节); 如果(ADC_val > 0x7fff){//if MSB = 1 ADC_val = ADC_val - 16777216; } 电压= acc_v/((2^23-1)/v_ref);//v_ref=2.5V
谢谢!
最好的雷加尔
图格鲁尔
您好、Alexander、
Sinus 没有共模、因此没有直流失调电压。
据我了解、我可以连接到 AINP 和 AINN、信号可以在0V 电平附近摆动、这意味着正负振幅。 对于 ADS1271 +-VREF (2、5V)。
我可以交替连接到 AINP 和 GND 引脚、但幅值限制为:GND 到 AVDD+0、1V 或具有完全负信号的信号(具有负直流偏移):
-AVDD-0、1V 至 GND。
我的描述是否正确,或者我是否走错了路;-)
此致、
图格鲁尔