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.

[参考译文] ADS7066:通道测量问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1511335/ads7066-issues-with-channel-measurements

器件型号:ADS7066

工具/软件:

您好:

我一直在测量 ADS7066 ADC 的不同通道、但在测量读数时遇到问题。

我考虑了 ADS7066内部的采样电容器、根据  第8.2节中描述的典型应用来计算在执行读数之前信号稳定所需的延迟  

根据我的计算结果、内部采样电容器 充电时间(5 *τ)为2.25e-8秒。我实现了从选择通道作为多路复用器输入到发送 NOP 条件来执行 ADC 读取操作之间的1 µs 延迟、因为我认为这个延迟就足够了。

    // Select channel as MUX input
    SPI_ADS7066_writeSingleRegister(hADS7066, CHANNEL_SEL_ADDRESS, channel);
    delay_us(1);

    // Send no operation to let adc convert
    SPI_ADS7066_sendNOP(hADS7066);

    // Read data from channel in SDO port

    if (WRSPI_Receive(pADS7066Desc->hSPI,(uint8_t *)&RxRawData, 3) != EMBL_OK){
        SEGGER_RTT_printf(0, "ERROR: Failed to receive data\n");
        Throw(EMBL_ERROR);
    }

但是、由于此1 µs 延迟、ADC 读数不稳定。 我针对不同的延迟进行了测试、发现当500 µs 延迟时、读数是稳定的。

如何在确保信号保持稳定的同时减少通道读取之间的延迟时间? 这是如何发生的? 我的想法是正确的吗?

非常感谢您的帮助!

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

    您好、Jon、  

    感谢您在 TI E2E 论坛上发帖!  

    500µs 相当可观、因此、 如果您能回答一些后续问题、我想详细了解 ADS7066如何使用和配置、以便进行更好的评估:

    • 就可以在您的系统中分享 ADS7066的原理图了吗? 还是使用 EVM?  
    • 信道看到什么类型的输入? 是直流输入吗?
      • 读回时预期的代码是什么?实际读回的代码是什么?  
    • 您使用的采样频率是多少?  
    •   所有 通道是否都需要500µs、还是仅需要几个通道? 是始终需要还是仅在切换通道时需要?
    • 您的"SPI_ADS7066_SendNOP (hADS7066)"函数是什么样子的?
      • 这主要是为了确认考虑了 N+2延迟。  
    • ADC 似乎配置为手动模式、您能否确认、或者 ADC 采用哪种模式?  
    • ADS7066是使用内部基准还是存在外部基准?  

    µs ADS7066内部 S/H 电路能够使读数在低于2 μ s 的范围内保持稳定、这是一种很好的做法、应该留出一些时间来实现多路复用器/开关稳定。   

    如果不知道整个系统、则很难进行评估、但 从以下一些初始调试步骤开始:

    1. REF 引脚上的电压是多少? 电压是稳定的还是基准电压有噪声?  
    2. 读取数据时是否 考虑了正确的延迟、具体取决于配置的模式(第7.4节)?
      1. 例如、在手动模式(7.4.2)下、图7-13中的它显示了如何将通道选择为周期 N 的帧、然后在周期 N+1中、多路复用器将通道更改为所选并采集数据、最后在周期 N+2上、数据被转换并在 SDO 上输出
    3. 如果您继续读取数据(同一通道) 之间的比较 500µs 延迟数据输出最终是否稳定、还是一直保持不稳定?
      1. 如果采用后者:您的回读功能是否包括每次配置多路复用器的选择通道写入?  还是只是 NOP +回读?

    此致、  

    Yolanda

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

    你好、Yolanda、  

    感谢您的重播。

    • 就可以在您的系统中分享 ADS7066的原理图了吗? 还是使用 EVM?
      • 查看随附的原理图。

    • 信道看到什么类型的输入? 是直流输入吗?
      • 现在我使用5V 或3V 电源的直流输入进行测试  
      • 读回时预期的代码是什么?实际读回的代码是什么?  
      • 我希望从 ADC 读取5V 或3V 的输入电压。 ADC 和 MCU 之间的通信正常运行;但是、问题在于 ADC 发送的数据。 ADC 读数不准确。
    • 您使用的采样频率是多少?  
      • SPI CLK 在1 MHz 处设置。
    •   所有 通道是否都需要500µs、还是仅需要几个通道? 是始终需要还是仅在切换通道时需要?
      • 每次读取信道时、我都需要一致的500 µs 延迟。 请注意、在执行5V 读取时、ADC 输出始终保持稳定;然而、在3V 读取期间会特别出现不稳定情况。

    • 您的"SPI_ADS7066_SendNOP (hADS7066)"函数是什么样子的?
      • 这主要是为了确认考虑了 N+2延迟。  

     

    void
    SPI_ADS7066_sendNOP(HANDLER hADS7066){
        PSPI_ADS7066DESC pADS7066Desc = (PSPI_ADS7066DESC)hADS7066;
    
        uint8_t dataTx[4] = { 0 };
        uint8_t numberOfBytes = SPI_CRC_ENABLED(pADS7066Desc) ? 4 : 3;
        EMBL_RETCODES ret = EMBL_OK;
    
        dataTx[0] = OPCODE_NULL;
        dataTx[1] = OPCODE_NULL;
        dataTx[2] = OPCODE_NULL;
    
        if (SPI_CRC_ENABLED(pADS7066Desc)) { dataTx[3] = SPI_ADS7066_calculateCRC(&dataTx[0], 3, 0xFF); }
        do {
            ret = WRSPI_Transmit(pADS7066Desc->hSPI, dataTx, numberOfBytes);
        } while (ret == EMBL_BUSY);
    }

    其中:#define OPCODE_NULL (uint8_t) 0x00)

    • ADC 似乎配置为手动模式、您能否确认、或者 ADC 采用哪种模式?  
      • 是、处于手动模式。
    • ADS7066是使用其 内部基准还是存在外部基准?  
      • 5V 的外部基准电压

    查找我对 ADC 执行的附加 Init:

    void
    SPI_ADS7066_basicInitObject(HANDLER hADS7066) {
    
        if (CHECK_MEMORY(hADS7066)) {
            Throw(EMBL_WRONGPARAMS);
        }
    
        // Force all channels to be analog inputs (voltage from sensors)
        // No CRC
    
        SPI_ADS7066_writeSingleRegister(hADS7066, GENERAL_CFG_ADDRESS, OPMODE_CFG_CLK_DIV_6);
        if (SPI_ADS7066_readSingleRegister(hADS7066, GENERAL_CFG_ADDRESS) != OPMODE_CFG_CLK_DIV_6)
        {
            Throw(EMBL_ERROR);
        }
    
        // Normal operation for output data, 4-bit channel ID appended to ADC data
        // SPI mode 0
    
        SPI_ADS7066_writeSingleRegister(hADS7066, DATA_CFG_ADDRESS, DATA_CFG_APPEND_STATUS_FOUR_BIT_CHID);
        if (SPI_ADS7066_readSingleRegister(hADS7066, DATA_CFG_ADDRESS) != DATA_CFG_APPEND_STATUS_FOUR_BIT_CHID)
        {
            Throw(EMBL_ERROR);
        }
    
        SPI_ADS7066_writeSingleRegister(hADS7066, OSR_CFG_ADDRESS, OSR_CFG_OSR_16);
        if (SPI_ADS7066_readSingleRegister(hADS7066, OSR_CFG_ADDRESS) != OSR_CFG_OSR_16)
        {
            Throw(EMBL_ERROR);
        }
    
        // High speed oscillator enabled
    
        SPI_ADS7066_writeSingleRegister(hADS7066, OPMODE_CFG_ADDRESS, OPMODE_CFG_CLK_DIV_10);
        if (SPI_ADS7066_readSingleRegister(hADS7066, OPMODE_CFG_ADDRESS) != OPMODE_CFG_CLK_DIV_10)
        {
            Throw(EMBL_ERROR);
        }
    
        // Set the sequence mode to manual, we have to select the channel mannually
    
        SPI_ADS7066_writeSingleRegister(hADS7066, SEQUENCE_CFG_ADDRESS, SEQUENCE_CFG_SEQ_MODE_MANUAL);
        if (SPI_ADS7066_readSingleRegister(hADS7066, SEQUENCE_CFG_ADDRESS) != SEQUENCE_CFG_SEQ_MODE_MANUAL)
        {
            Throw(EMBL_ERROR);
        }
    }

    如果不知道整个系统、则很难进行评估、但 从以下一些初始调试步骤开始:

    1. REF 引脚上的电压是多少? 电压是稳定的还是基准电压有噪声?  
      1.  Vref 电压是5V 稳定电压。  
    2. 读取数据时是否 考虑了正确的延迟、具体取决于配置的模式(第7.4节)?
      1. 例如、在手动模式(7.4.2)下、图7-13中的它显示了如何将通道选择为周期 N 的帧、然后在周期 N+1中、多路复用器将通道更改为所选并采集数据、最后在周期 N+2上、数据被转换并在 SDO 上输出
      2. 周期执行正确。 首先、我更改多路复用器输出(周期1)、然后发送 NOP 条件(周期2)以确保正确执行多路复用器更改、最后读取数据(周期3)。 总共涉及3个周期。

    3. 如果您继续读取数据(同一通道) 之间的比较 500µs 延迟数据输出最终是否稳定、还是一直保持不稳定?
      1. 我只读取一个通道、但即使输入稳定为3.00V、测量的电压也不稳定

      1. 如果采用后者:您的回读功能是否包括每次配置多路复用器的选择通道写入?  还是只是 NOP +回读?
        1. 我写入以选择通道、发送 NOP 条件、然后执行回读。  

    此致、  

    Jon。

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

    您好、Jon、  

    感谢您的全面回答。  

    您能共享输入源的阻抗吗? 3V 和5V。 有什么驱动这些来源的吗? 还是直接测量?  

    当进行这些测量时、您是否能够分享3V 输入信号在 ADC 输入端的样子?  

    或者、您能否观察它在500us 延迟期间如何查看 ADC 的输入、从而确定 ADC 测量时是否存在任何明显的干扰和/或指数电压恢复(例如电容器充电)?

    此致、  

    Yolanda

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

    你好、Yolanda、  

    ADC 的输入源通过一些电缆直接连接到器件的电源。 稳压器的器件型号为:

    • BD33GA3WEFJ 用于3V 电源

    • TR10S05、用于5V 电源

    请注意、我们在 ADC 输入端不包含电荷反冲滤波器。

    此附件将为500 µs 延迟期间的 ADC 输入测量值。 根据观察、信号中没有明显的干扰或电压恢复。

    此致、  

    Jon。

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

    再次感谢 Jon、  

    这很有趣、500us 不是预期的延迟、尤其是在1MHz SCLK 时。  

     BD33GA3WEFJ 的输出 看起来确实很稳定、从数据表判断、它应该能够提供 在1MHz 上自行驱动 ADC 所需的电流。 I

    AVDD 或 REF 引脚上的5V 电源上是否有任何严重的噪声?  

    既然5V 输入(与电源/基准相同)不存在问题、我想确认 ADC、5V 电源和3V 电源也有类似的基准。 它们都共用同一个接地端、或者在某个时候连接在一起、对吧?  

    您是否还能够分享数据通信(SCLK、CS、SDO、SDI)的示波器或逻辑分析仪图片?   

    此致、  

    Yolanda

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

    你好、Yolanda、  

    我注意到每次出现设置不匹配时、都与 CLK 有关。 此外、当设置不匹配时、所有错误的 ADC 读数都会发生。 似乎没有正确生成 CLK、从而导致 ADC 读数不正确。

    正确测量:

    V = 2.96V

    测量不正确:

    V = 0.915V

    尽管存在这个问题、但我还是通过在发送 NOP 条件和读取数据之间延迟运行测试来获得良好的测量结果。 经过一些实验后、我发现50 µs 延迟可以可靠地工作、并确保系统正常运行。

    附件是我最近实现的伪代码。 请注意、我设法仅将初始500 µs 延迟减少到1 µs、这足以确保正确的数据传输。

        // Select channel as MUX input
        SPI_ADS7066_writeSingleRegister(hADS7066, CHANNEL_SEL_ADDRESS, channel);
        delay_us(1);
    
        // Send no operation to let adc convert
        SPI_ADS7066_sendNOP(hADS7066);
        delay_us(50);
        
        // Read data from channel in SDO port
    
        if (WRSPI_Receive(pADS7066Desc->hSPI,(uint8_t *)&RxRawData, 3) != EMBL_OK){
            SEGGER_RTT_printf(0, "ERROR: Failed to receive data\n");
            Throw(EMBL_ERROR);
        }

    感谢您的帮助! ADC 现在按预期运行。

    此致、  

    Jon。

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

    感谢 Jon 的更新!

    我很高兴一切都运行良好、延误时间可以缩短到1us!

    此致、  

    Yolanda