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.

[参考译文] ADS1158:测量固定直流信号时,某些情况下的数据明显不正确

Guru**** 2579725 points
Other Parts Discussed in Thread: ADS1158, ADS1258, ADS1262

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/574539/ads1158-data-apparently-incorrect-in-some-cases-while-measuring-a-fixed-dc-signal

部件号:ADS1158
线程中讨论的其他部件: REF5025REF5040ADS1258ADS1262

在我们的模拟电路中,我发现 有些情况下 从ADS1158导出了不正确的数据。

因此,我使用 Tektronix函数发生器 生成 300 MV信号。 我使用ADS1158的通道AIN5 (0xD) 对其进行测量。

参考电压:4.96V

我使用GPIO引脚在发生异常情况时触发示波器。

在正常情况下,ADC计数为2238~2278。 (298.4毫伏~ 303.73毫伏)

但在不正常的情况下,我得到了大量的计数,这不是SPI接口问题或计算问题。

因为在范围内,ADS1158的信号输出实际上在DOUT引脚上发送了该大值

请检查

状态字节:0x8D (new和chid = AIN5)

Data BYTE1:0x51

Data BYTE0:0x8C

数据= 0x518C = 2.0876万 -->2783mv   !!

C1是测量信号,来自示波器,其最大值为P1:最大值(C1)= 584mv

请给出一些有关此情景的线索。谢谢

此致,

            伊凡

 

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

    您好Ivan:

    感谢您提供示波器镜头!

    我想知道您在数据检索过程中在DIN上发送什么命令? 我询问的原因是,0x8C对于状态字节是一个合理的值。

     

    对我诊断此问题有帮助的其他信息包括:

    • 您运行ADS1158的数据速率是多少?

    • 您是使用 信道数据读取命令(0x30)读取数据还是 使用信道数据直接读取 (0x00)读取数据?

    • 您使用的是固定信道模式还是自动扫描模式?

      • 如果使用自动扫描模式,您是否启用了其他信道?

     

    我建议使用 通道数据读取命令(0x30)进行读取,因为它不需要您切换芯片选择,并且您可以在/DRDY转换期间读取数据。 使用Channel Data Read Direct (0x00)命令在/DRDY转换期间读取数据可能会导致数据损坏。

     

    此致,
    Chris  

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

     我询问的原因是,0x8C对于状态字节是一个合理的值

    -->为什么?  在我的测试中,Chid[0:4]= 0xD正确,表示AIN5,是吗?

    添加所需信息

    0.我使用轮询方法获取ADS1158数据。 在ADC初始化后,开始引脚始终被拉至高电平,以进行数据转换。

    如果我发现已设置状态字节的新位,则以下两个数据是新的和有效的。 否则,忽略并丢弃数据。

    1.用于获取数据的Usechannel Read命令,即  通道数据读取命令(0x30),并启用Mult_REG_ACCESS_ARTING

    对于数据速率,我在初始化过程中只将DLY[2:0]设置为010。  DRATE[1:0]=11 (默认值)

    2.使用自动扫描模式(默认)

    3.我启用了其他信道。总共启用了6个单选端输入,分别是S0,S1,S2,S3,S4, S5。 我只接受S5结果进行实验。

    我建议使用 通道数据读取命令(0x30)进行读取,因为它不需要您切换芯片选择,并且您可以在/DRDY转换期间读取数据

    ==>

    4.我附上了部分代码。请检查是否有问题。  我在读取数据开始时断言CS过低,在读取结束时断言CS

    5.另一件奇怪的事情是,我发现OVF位的状态位有时被设置(很少)。 我不知道原因。 我确信输入不会溢出(4.096V)

    我只是丢弃数据。

    如果需要任何进一步的信息并对其有帮助,请告诉 我。

    void SPI_xmit(UINT16 A);
    
    
    // ADS1158初始配置
    void ADS1158Config(void){//
    	unsigned int temp =0;
    
    	ADS1158Reset();
    
    	ADS1158SetSwitchDelay(ADS1158_Delay_2);1158;
    
    	ADS1158SetChannel( ADS1158_MS0_ADS|
    						ADS1158_MUX_S1 | M1158_SS1_MS2_ADS1158_MS2_ADS1158_ADS1158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_ADS158_</s>1158 11581158
    						
    						
    						
    						
    
    
    
    
    
    
    如果(fAssert){
    GpioDataRegs.GPBCLEAR.bit.GPIO57 = 1;
    DELAY _US(1);}
    否则{
    	DELAY _US (5);
    	GpioDataRegs.GPBSET.bit.GPIO57 = 1;
    }
    }
    
    void ADS1158SendByte (无符号字符字节){
    unsigned char dummy =0;
    
    SPI_xmit (字节);
    
    同时(SpiaRegs.SPISTS.bit.INT_flag !=1){}
    //等待RX数据就绪
    虚拟= SpiaRegs.SPIRXBUF;
    
    }
    
    无符号字符SPIReceiveByte(void){
    无符号字符结果=0;
    
    结果= SpiaRegs.SPIRXBUF;//读取RXBUF以清除INT_FLAG
    
    SPI_xmit(0xff);//发送NOP以生成SCLK
    
    同时(SpiaRegs.SPISTS.bit.INT_flag !=1){}
    //等待RX数据就绪
    结果= SpiaRegs.SPIRXBUF;
    
    
    返回结果;
    }/***********************************************************************
    
    
    高级函数
    */
    void ADS1158ReadData (UINT16* status,Long* Data){
    //长数据;
    	无符号int adcCode[3]={0};
    //断言CS以开始传输
    
    	//禁用MCU中断
    	DINT;
    
    ADS1158AssertCS(1);
    
    //发送命令字节
    ADS1158SendByte (ADS1158_CMD_CH_RDATA | ADS1158_CMD_Mult_REG_ACCESSIT);
    
    //获取转换结果
    
    *status = SPIReceiveByte();
    adcCode[0]= SPIReceiveByte();
    adcCode[1]= SPIReceiveByte();
    如果(adcCode[0]和0x80){
    *Data =(Long)(0xff)<<24;
    }
    *Data =*Data |((Long)(adcCode[0]& 0xff)<<8);
    *Data =*Data |((Long)(adcCode[1]& 0xff)<<0);
    
    
    
    //取消断言CS
    ADS1158AssertCS(0);
    //返回数据;
    	
    	//启用返回中断
    EINT;
    ERTM;
    
    	//调试:触发范围
    如果(*Data >5000&(*status == 0x8D)){
    GpioDataRegs.GPASET.bit.GPIO13 = 1;
    DELAY _US (1万);
    GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;
    ASM (" ESTOP0");
    }
    
    
    }
    
    void ADS1158ReadRegister (int StartAddress,int NumRegs,unsigned * pData){
    int i;
    //断言CS以开始传输
    ADS1158AssertCS(1);
    
    如果( NumRegs >1){//
    		发送命令字节
    		ADS1158SendByte(ADS1158_CMD_RREG |1158 | ADS1158_CMD_Mult_REG_ACCESS|(StartAddress & 0xF));
    } 否则{
    	//发送命令字节
    		ADS1158SendByte(ADS1158_CMD_RREG |1158 |(StartAddress & 0xF));
    }
    
    //获取注册内容
    对于(i = 0;i < NumRegs;I++){
    *pData++= SPIReceiveByte();
    }
    
    //取消断言CS
    ADS1158AssertCS(0);
    
    return;
    }
    
    void ADS1158WriteRegister (int StartAddress,int NumRegs,unsigned * pData){
    int i;
    
    //断言CS以开始传输
    ADS1158AssertCS(1);
    
    //发送命令字节
    如果( NumRegs >1){//
    		发送命令字节
    		ADS1158SendByte(ADS1158_CMD_WREG |1158 | ADS1158_CMD_Mult_REG_ACCESS|(StartAddress & 0xF));
    } 否则{
    	//发送命令字节
    		ADS1158SendByte(ADS1158_CMD_WREG |1158 |(StartAddress & 0xF));
    }
    
    //发送数据字节
    对于(i = 0;i < NumRegs;I++){
    ADS1158SendByte(*pData+);
    }
    
    //取消断言CS
    ADS1158AssertCS(0);
    
    return;
    }
    
    void ADS1158Reset(void){//
    
    	重置转换
    	器GpioDataRegs.GPBCLEAR.bit.GPIO51=1;
    
    
    DELAY _US (10);	//租用延迟2 Tclk <= 1 us
    GpioDataRegs.GPBSET.Bit.GPIO51 = 1;//活动低-->初始设置为高
    
    return;
    }
    
    int ADS1158SetChannel(UINT32 Muux){
    
    	unsigned int mux_diff =( Mux & 0x0万ff);
    	unsigned int mux_SG1 =( Mux & 0x0000ff00 )>> 8;
    	unsigned int mux_SG2 =( Mux & 0x00ff0000 )>> 16;
    	unsigned int mux_sys =( Mux_0x0000> 24;
    
    	ADS1158WriteRegister (ADS1158_3_REGISTER_MUXDIF,1,&MUX,diff);
    	ADS1158WriteRegister (ADS1158_4_REGISTER_MUXSG0, 1,&mix_SG1);
    	ADS1158WriteRegister (ADS1158_5_REGISTER_MUXSG1,1,&mix_SG2);
    	ADS1158WriteRegister (ADS1158_6_register_SYSRED, 1,&mix_sys);
    
    
    返回ADS1158_NO_ERROR;
    }
    
    int ADS1158SetDataRate (int datarate){
    Unsigned Temp;
    	ADS1158ReadRegister (ADS1158_1_REGISTER_config1,0x01,&Temp);
    	Temp &= 0xFC; 	//删除旧设置
    	Temp = Temp + datarate;
    //将包含新值的寄存器值写回ADS
    ADS1158WriteRegister (ADS1158_1_REGISTER_config1,0x01,&Temp);
    	ADS1158ReadRegister (ADS1158_1_REGISTER_config1,0x01, 温度(&D);
    
    
    
    返回ADS1158_NO_ERROR;
    }
    
    int ADS1158SetSwitchDelay (int delay){
    Unsigned Temp;
    	ADS1158ReadRegister (ADS1158_1_REGISTER_config1,0x01,&Temp);
    	Temp &= 0x8F; 	//删除旧设置
    	Temp = Temp + DELAY (温度=温度+延迟);
    //将包含新值的寄存器值写回ADS
    ADS1158WriteRegister (ADS1158_1_REGISTER_config1,0x01,&Temp);
    	ADS1158ReadRegister (ADS1158_1_REGISTER_config1,0x01, 温度(&D);
    
    
    
    返回ADS1158_NO_ERROR;
    }
    

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

    您好,Chris:

                     在ADS1158规范的硬件考虑中,需要电源

    如果我们的电路不使用LDO为ADS1158供电,是否可能存在我之前描述的问题?

    即AVDD有波纹(> 2mV)

    我们对此没有太多的关注,因为在大多数时间,ADC似乎运行良好。

    此致,

             伊凡

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

    Chris,

          欢迎您发表任何意见。

    此致,

           伊凡

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

    您好Ivan:

    很抱歉回复延迟...

    关于电源噪声,如果不使用LDO对开关电源进行过滤,可能会导致更嘈杂的ADC转换结果;但是,我怀疑它会导致您所看到的问题。

    我查看了您的代码,发现了一些潜在问题:

    1)我建议先清除"数据"变量,然后再为其分配新值。 此外,32位数据类型的符号扩展中需要包含位16-23,如下所示:

    *Data =0;//确保“数据”中没有剩余值。
    如果(adcCode[0]和0x80){
      *数据=(长)(0xff)<24;
      *Data =*Data |((Long)(0xff)<<16);//别忘了对该字节进行符号扩展
    }
    *Data =*Data |((Long)(adcCode[0]& 0xff)<<8);
    *Data =*Data |((Long)(adcCode[1]& 0xff)<<0);

    2)在“SPIReceiveByte()”函数中,您可能发送了两个字节,但只检索其中一个:

    unsigned char SPIReceiveByte(void){
      无符号字符结果=0;
      结果= SpiaRegs.SPIRXBUF;//读取RXBUF以清除INT_FLAG
      SPI_xmit (0xFFFF);//发送NOP以生成SCLK //此计时是否超时2字节?
      //注:作为最佳实践,我建议在计时结束数据时发送“0x00”。
      同时(SpiaRegs.SPISTS.bit.INT_flag !=1){
      }//等待RX数据就绪
      结果= SpiaRegs.SPIRXBUF;返回结果;
    }

     

    此外,我可能会建议尝试调试该问题的以下事项:

    1. 尝试降低ADC的数据速率,看看这是否有助于解决通信问题。 降低数据速率会增加转换之间的时间,并且通常会放宽SPI计时要求。 有时,您会看到SPI通信问题以较低的数据速率消失。 如果是,这可能是指向SPI计时违规的良好线索。

    2. 您之前的示波器屏幕截图显示SPI信号有一些噪音。 尽管SPI相当不受噪音影响,但我仍然建议在SPI信号上放置一些50-100系列电阻器,以帮助降低数字边缘速率并提供一些噪声滤波(与每个迹线上的寄生电容结合使用)。

    3. 您可以尝试在固定通道模式下配置ADS1158以进行此测试,并查看是否仍存在此问题。 这样您就知道ADC不会在输入通道之间自动复用。

     

    关于状态字节中的OVF位,您选择的其他输入通道是否有浮动或可能超出范围? 另外,您使用什么来为ADS1158提供参考电压?

    您可能还需要检查参考电压以确保其稳定。 如果参考电压降速,也可能导致此类错误(以及转换结果错误)。

     

    此致,
    Chris

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

    您好,Chris:   

           感谢您的意见。 我会尝试你的建议。

    但我认为这不是通信或SPI问题,对吗? 我在范围(ADC的DOUT)中看到的内容与我在程序(MCU)中看到的内容相同。  

    稍后我将更新我尝试使用固定通道和更稳定的ADC电源的结果。

    2)在“SPIReceiveByte()”函数中,您可能发送了两个字节,但只检索其中一个:

    -->它正好发送一个字节(我将其更改为发送0x00以生成clk)  

    您使用什么来为 ADS1158提供参考电压

     -->使用4.096V LDO

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

    老实说,我对示波器的结果有点困惑。 最好也能看到/DRDY和DIN信号,以便更好地了解可能发生的情况。 您也可以尝试降低数据速率,以查看离群值是否消失。 很多时候,当出现SPI计时问题时,您可能会注意到以更快的数据速率出现的问题。

    探查参考电压以确保其稳定且无故障也可能是一个好主意。 看到用于参考的LDO是很奇怪的,通常您需要更精确的电压参考源(类似于REF5025)。

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

    探查参考电压以确保其稳定且无故障也可能是一个好主意。 看到用于参考的LDO是很奇怪的,通常您需要更精确的电压参考源(类似于 REF5025)。

    实际上,我使用TI REF5040作为参考电压。

    老实说,我对示波器的结果有点困惑。 最好也能看到/DRDY和DIN信号,以便更好地了解可能发生的情况。 您也可以尝试降低数据速率,以查看离群值是否消失。 很多时候,当出现SPI计时问题时,您可能会注意到以更快的数据速率出现的问题。

    =>因为我使用轮询方法和新的状态字节位,所以我没有监视DRDY的状态。

    如果可能,我会向您发送另一个示波器快照,其中包含更多信息(DRDY/DIN)

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

    REF5040应该工作正常,因为它是缓冲引用的,并且只要您使用read data命令,轮询/DRDY也应该正常。

    您是否有可以分享的电路示意图?
    我开始想知道ADC是否有外部因素导致了奇怪的行为。 例如,电源引脚上的电感器在电流瞬变过程中可能导致电压峰值,或者ADC的模拟接地和数字接地之间的较大阻抗可能导致模拟接地和数字接地处于不同的电压电位。

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

    您好,Chris:

          您是否有可以分享的电路示意图?

          ==>请参阅此帖子。 只需将ADS1258替换为ADS1158。使用AIN0作为输入

    e2e.ti.com/.../197.0975万

    此致,

             伊凡

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

    您好Ivan:

    我要尝试两件事:

    • 尝试卸下L1和L2电感器,并将其更换为0欧姆电阻器。 串联电感器和并联电容器可形成LC谐振器。 此外,任何快速瞬态电流都可能导致电感器上出现较大的电压峰值。 出于这些原因,我通常不建议在无源滤波器中使用电感器。

    • 尝试在ADC输入之间添加差分滤波电容器。 ADC输入是开关电容器,当 输入切换时,外部电容器可以提供更稳定的输入电压。

    此致,
    Chris

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

    尝试在ADC输入之间添加差分滤波电容器。 ADC输入是开关电容器,当 输入切换时,外部电容器可以提供更稳定的输入电压。

    我对这一行动不是很清楚。 您能否详细解释? AIN0在我们的测试中使用单端测量

    此致,

                  伊凡

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

    您好,Chris:

    尝试在ADC输入之间添加差分滤波电容器。 ADC输入是开关电容器,当 输入切换时,外部电容器可以提供更稳定的输入电压。

                     您能否绘制一个简短的图表? 谢谢

    此致,

                   伊凡

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

    您好Ivan:

    下面是您参考的电路的一个示例:

    对于差分输入,在正负输入之间插入一个盖子,在这种情况下,您似乎正在ADC_VREFP和THERMO1_B之间进行测量

    对于单端测量,执行相同操作,但将AINCOM视为"负输入"。 通过将单端信号视为差分信号,您可以帮助减少电路各个部分之间的共模阻抗耦合。

    这些电容器应放置在靠近ADC的位置,以获得最佳性能。

    此致,
    Chris

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

    您好,Chris:

                   做一些工作,并尝试您建议做的事情。 但是,它们似乎不能解决我的问题

    尝试降低ADC的数据速率,看看这是否有助于解决通信问题

    -您可以尝试在 固定通道模式下配置ADS1158以进行此测试,并查看是否仍存在问题

    -尝试卸下L1和L2电感器,并将其更换为0欧姆电阻器。 串联电感器和并联电容器可形成LC谐振器。 此外,任何快速瞬态电流都可能导致电感器上出现较大的电压峰值。 出于这些原因,我通常不建议在无源滤波器中使用电感器。

    —尝试在ADC输入之间添加差分滤波电容器

    还有什么建议??

    此致,

                  伊凡

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

    老实说,我对示波器的结果有点困惑。 最好也能看到/DRDY和DIN信号,以便更好地了解可能发生的情况

    ==> 为使您感到困惑,我再次进行相同的测试。 正确值应为0.3V (ADC计数应约为2250)。 在这种情况下,我们偶尔会得到cnt =6624 (0x19E0)

    我们使用DRATE:0b11,开关延迟:2,自动扫描(AIN0和AIN1,AIN2,AIN3,AIN4和AIN5)

    我们在范围上看到的是AIN5,因此状态字节为0x8D (new + Chid = 0xD)

    整4字节:

    命令字节的缩放视图(Z1:DIN,Z2:SCLK,Z3:dout,Z4:DRDY)

    数据缩放视图BYTE1:

    数据字节2的缩放视图

    我们应用 您的以下建议,但 仍然存在相同的问题

    1. 改进 ADS1158的AVDD和DVDD (移除电感器 ,不使用开关电源,由IC REG104-5提供)

    2.在  输入滤波采样电流中添加盖子

    3.降低数据速率

    4.使用固定通道

    有什么意见?

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

    您好,Chris:

                   我想我已经解决了这个问题。 但我对这一点仍然有些困惑。

    从我的命令字节(通道数据读取0x30)的别名示波器快照中,您可以看到DRDY已从高转换到低。

    我发现在我的错误案例中,DRDY有一个过渡,而我的通道数据读取命令已发送。

    因此,在读取ADS1158中的数据之前,我只需检查DRDY状态。  如果DRDY为低电平,请从ADS1158读取,以避免在通道读取过程中DRDY转换。

    因此,问题不再发生。 但SPEC说了不同的东西。

    谢谢。

    此致,

                   伊凡

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

    目前,我不确定是否可以在/DRDY转换期间发送SPI命令(输入),或者是否只是在/DRDY转换期间可能发生的数据字节(输出)。 我们的数字设计师目前不在办公室,但下周他回来时,我将与他讨论此事。

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

    我与我们的数字设计师讨论过这个问题,结果发现RDATA命令的时间安排非常重要...

    发送RDATA命令时,它会将转换结果加载到输出移位寄存器中。 当您对这些数据进行计时时,当新数据可用时,它们不会损坏。 但是,如果您在下一次转换完成时(在/DRDY下降沿期间)发送RDATA命令,输出移位寄存器将加载旧数据和新数据的组合数据。

    为避免此问题,最佳解决方案是监视/DRDY,并在转换完成后立即读取数据。 但是,如果您正在轮询/DRDY,我的建议是确保您轮询的频率足够高(比数据速率快2-4倍),以便您能够更快地读取数据(在下一个/DRDY之前)。

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

    [报价用户="Christopher Hall"]

    为避免此问题,最佳解决方案是监视/DRDY,并在转换完成后立即读取数据。

    此致,
    Chris

    [/引述]

    您好,Chris:

           这似乎毫无意义。 在某些情况下,MCU不能立即处理中断处理程序(处理具有较高优先级的其他中断),即使对DRDY使用中断(不是轮询)也是如此。

    在大多数情况下,MCU可以在DRDY下降时立即发送RDATA命令以读取转换后的数据。 但是,MCU可能正忙于处理

    DRDY正在降低时的其他作业。 当MCU完成其它作业并尝试发送RDATA进行读取时,下一个转换可能完成....

    在这种情况下,数据可能已损坏

    对吧?

    此致,

           伊凡

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

    正确,即使使用中断,MCU也可能忙于其它任务,或者被优先级较高的任务中断。 一般来说,作为一个系统设计师,你总是必须决定哪些任务需要成为最高优先级,以及MCU可以处理多少负载。 当尝试使用具有快速数据速率的ADC来实现高数据吞吐量时,这一点尤其具有挑战性!

    对于ADS1158,一旦发送了第一个命令字节,Read data命令将帮助防止数据损坏。 因此,您需要确保能够在/DRDY中断后很快发出此命令,在下一个/DRDY之前。 可能有几种不同的方法来强制执行此操作,但一个示例解决方案可以是设置两个不同的中断:

    1.当MCU检测到/DRDY上的下降边缘时,会发生第一个中断。 此中断应具有高优先级。 在维修此中断时,您应该快速发出一个读取数据命令,然后触发第二个(较低优先级)中断以完成数据读取。 请注意,/CS应保持低电平,直到您完成对所有数据的计时。

    2.第二个中断可以是较低的优先级; 但是,您需要确保服务速度足够快,以便i) ADS1158不会发生SPI超时,2)速度太慢,以至于无法及时读取下一个转换结果(导致数据丢失)。 调用时,此中断会对剩余的数据字节进行超时。 在/DRDY下降沿期间,可以读取这部分数据,而不会发生任何数据损坏。

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

    您好,Chris:

            理解您提到的内容。 但是,结果似乎与规格所说的不同。

    该规范指出,读取通道数据不会损坏具有/不具有DRDY的数据...

    在使用DRDY或通道读取命令的其他ADC中是否存在相同的问题? 例如ADS1258或ADS1262...等。

    此致,

           伊凡

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

    我同意数据表对此不是很清楚。 使用read data命令比read data direct模式更可靠;但是,该命令仍必须在下一个/DRDY下降边缘之前由设备解码。

    我们的新器件(如ADS1262)不存在此问题。 我相信有一个双缓冲输出,可以防止数据损坏。 但是,如果您的读取数据接近/DRDY下降边缘,则很难确定您正在读取的结果(上一个或最新的结果)。 因此,最佳做法始终是确保在下一个转换结果之前有足够的时间读取数据。

    防止数据损坏或数据丢失的其他可能解决方案包括:

    -降低数据速率。 在接近转换结束时读取数据会使您面临完全丢失转换结果的风险。 因此,如果不能提高吞吐量,您也可以利用较慢数据速率的损失噪声性能。

    还有一种选择是使用脉冲转换模式。 如果您仅监视不需要一致采样率的信号,则可以使用脉冲转换模式仅在处理器准备就绪时收集数据。

    此致,
    Chris