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:切换 ADS1256输入多路复用器时获得随机尖峰

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1291852/ads1256-getting-random-spikes-while-switching-input-mux-of-ads1256

器件型号:ADS1256

大家好!
希望大家都过得很愉快。
这是我第一次在论坛上提出质询,如果我犯了任何一个先例,请原谅我。

我使用的是  带有 Raspberry Pi 4B 的 ADS1256波形板。 我修改了 waveeshare 提供的代码,基本上添加了时序限制。 它适用于单通道输出、但对于多通道输出、其在高达2mV 的输出中抛出随机尖峰。 更大的尖峰通常具有相同的幅度、因此我认为我超出了某个延迟限制、但无法弄清出现了什么情况、因为我仅根据数据表设置了延迟。 即使我故意拖延太多,问题仍然存在。  
这是相关的代码片段、

/******************************************************************************
function: Set the channel to be read
parameter:
Channal : Set channel number
Info:
******************************************************************************/


void ADS1256_SetDiffChannal(UBYTE Channal)
{
if (Channal == 0){
ADS1256_WriteReg(REG_MUX, (0 << 4) | 1); //DiffChannal AIN0-AIN1

}
else if(Channal == 1){
ADS1256_WriteReg(REG_MUX, (2 << 4) | 3); //DiffChannal AIN2-AIN3

}
else if(Channal == 2){
ADS1256_WriteReg(REG_MUX, (4 << 4) | 5); //DiffChannal AIN4-AIN5

}
else if(Channal == 3){
ADS1256_WriteReg(REG_MUX, (6 << 4) | 7); //DiffChannal AIN6-AIN7

}
}


******************************************************************************/
static UDOUBLE ADS1256_Read_ADC_Data(void)
{
UDOUBLE read = 0;
UBYTE buf[3] = {0,0,0};


DEV_Digital_Write(DEV_CS_PIN, 0);
DEV_Delay_us(1);

ADS1256_WaitDRDY();
DEV_SPI_WriteByte(CMD_RDATA);
DEV_Delay_us(7);
buf[0] = DEV_SPI_ReadByte();
buf[1] = DEV_SPI_ReadByte();
buf[2] = DEV_SPI_ReadByte();


read = ((UDOUBLE)buf[0] << 16) & 0x00FF0000;
read |= ((UDOUBLE)buf[1] << 8); /* Pay attention to It is wrong read |= (buf[1] << 8) */
read |= buf[2] ;

DEV_Digital_Write(DEV_CS_PIN, 1);
return read;
}

/******************************************************************************
function: Read ADC specified channel data
parameter:
Channel: Channel number
Info:
******************************************************************************/
UDOUBLE ADS1256_GetChannalValue(UBYTE Channel)
{
UDOUBLE Value = 0;
ADS1256_WaitDRDY();

if(Channel>=4){
return 0;
}
if(channel ==1){
ADS1256_SetDiffChannal(Channel);

Value = ADS1256_Read_ADC_Data();
}
else{
ADS1256_SetDiffChannal(Channel);

DEV_Delay_us(4);
ADS1256_WriteCmd(CMD_SYNC);
DEV_Delay_us(4);
ADS1256_WriteCmd(CMD_WAKEUP);

DEV_Delay_us(1);
Value = ADS1256_Read_ADC_Data();
}

return Value;
}

/******************************************************************************
function: Read data from all channels
parameter:
ADC_Value : ADC Value
Info:
******************************************************************************/
void ADS1256_GetAll(UDOUBLE *ADC_Value)
{
UBYTE i;
for(i = 0; i<channel; i++){
ADS1256_WaitDRDY();
ADC_Value[i] = ADS1256_GetChannalValue(i);
}

}

以下是2个通道上的输出快照

我希望我能很好地描述这个问题。 如果有什么缺失、请指出、我会尽快添加。  
谢谢大家!

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

    尊敬的 Pankaj Kumar:

    确定您是否满足 ADC 时序要求的最佳方法是使用逻辑分析仪查看数字信号。 只需查看代码并确保符合时序就会非常困难。

    请注意、TI 不提供对 Waveshare 板的支持、因为它并非由 TI 开发。 如果您对该电路板或代码有任何问题、请联系电路板制造商。

    -Bryan

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

    嘿、布赖恩
    感谢您的答复。
    我发现了问题。 在 RDATA 命令和 WaitDRDY 函数 成为尖峰源之后的延迟。 如果我将延迟从7us 增加到100us 左右、则它们会减少。 您很可能这与电路板有关。 遗憾的是、我没有逻辑分析仪来精确定位延迟、但我现在会得到一个。
    再次感谢

    谢谢!
    ~á n Pankaj