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.
大家好!
希望大家都过得很愉快。
这是我第一次在论坛上提出质询,如果我犯了任何一个先例,请原谅我。
我使用的是 带有 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