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.

[参考译文] ADS1115:ADC 间歇性返回零

Guru**** 2812305 points

Other Parts Discussed in Thread: ISO1540, ADS1115

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/917941/ads1115-adc-intermittently-returning-zero

器件型号:ADS1115
Thread 中讨论的其他器件:ISO1540

我在 I2C 隔离器 ISO1540的后面使用 ADS1115。 我得到的是间歇性零结果。 我正在使用示波器来验证 I2C 信号、一切看起来都很好。

到目前为止、我已经在多个应用中遇到了这个问题。 我当前的解决方案是多次读取它以获得非零值。 有时、它会在第一次尝试时返回数据、有时在连续20次读数之后返回。

我的应用程序正在使用 ST STM32G4控制器、但我以前遇到 Arduino 测试系统问题。 微控制器侧为3.3V、ADS 侧为5V。 我的 ADC 电压接近5.0V、但不接近5.5V 限值。

虽然我确信该器件工作正常、但它不会出现在我的应用中。

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

    John、

    您能否发布 I2C 通信的示波器截图? 它可能有助于调试。 发布良好的读数、然后使用报告零结果的转换发布另一个读数。  

    我的主要问题是 ADC 运行电压为5V、微控制器侧运行电压为3.3V。 如果上拉电阻仅变为3.3V、则数字高电平可能不足以供 ADC 读取。 通常、您会在两者之间使用某种 I2C 电压电平转换器。  

    无论如何、示波器截图应显示 ADC 是否确认通信。  

    吴约瑟

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

    以下是隔离器5V 和3.3V 侧的一些 O 示波器截图。  隔离器也用作电压转换器。

    具有`μ A 正常数据的5V 侧

    具有良好数据的3.3V 侧

    具有零数据的5V 侧

    具有零数据的3.3V 侧

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

    John、

    我需要一些时间来查看这一点。 看起来、3.3V 方面的电源在 SDA 上很难下拉。 但是、这似乎不是问题所在。

    同时、您已将什么编程到配置寄存器中?

    吴约瑟

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

    以下是驱动程序函数:

    uint16_t GetAds1115Values (ADS1115_HandleTypeDef * hdev、uint8_t channel、uint16_t m_gain、uint8_t *计数)

    uint8_t ADSwriting[6];
    int16_t RESULT_WORD;
    uint8_t 重试次数= 5;
      执行{
          ADSWRITE[0]= 0x01;
           开关(通道)
           {
              情况(0):
               ADSwriting[1]= 0xC3;// 11000011
               中断;
               情况(1):
               ADSwriting[1]= 0xD3;// 11010011
               中断;
               情况(2):
               ADSwrite[1]= 0xE3;// 11100011
               中断;
               情况(3):
               ADSwriting[1]= 0xF3;// 11110011
               中断;
          }

    // ADSwriting[2]= 0x03;// 00000011 8SPS
    // ADSwriting[2]= 0x23;// 10000011 16SPS
    // ADSwriting[2]= 0x43;// 10000011 32SPS
    // ADSwriting[2]= 0x63;// 01100011 64 SPS
    ADSwriting[2]= 0x83;// 10000011 128 SPS
    // ADSwriting[2]= 0xC3;// 11000011 475SPS
    // ADSwrite[2]= 0xE3;// 11100011 860SPS
    HAL_I2C_Master_transmit (hdev->h2c、hdev->addr、ADSwrite、3、100);
    HAL_DELAY (60);
    ADSwritE[0]= 0x00;
    HAL_I2C_Master_transmit (hdev->h2c、hdev->addr、ADSwrite、1、100);
    HAL_I2C_Master_Receive (hdev->h2c、hdev->addr、ADSwrite、2、100);
    Result 字=(ADSwrite[0]<< 8 | ADSwrite[1]);


        if (result_word = 0)
        {
            重试--;
            HAL_DELAY (10);
        }


    }while (result_word_=0 &&重试次数);


    if (result_word < 0)//可以在0附近稍微变为负值

        RESULT_WORD = 1;

    *count =重试;

    return (result_word);

    这是输出

    通道0值13292、23.814777伏、计数= 3
    通道1值13107、23.483320伏、计数= 3
    通道2值13207、23.662487伏、计数= 1
    通道3值20416、5.104000伏、计数= 5

    通道0值13291、23.812986伏、计数= 4
    通道1值13107、23.483320伏、计数= 1
    通道2值13209、23.666069伏、计数= 2
    通道3值0,0.000000伏,计数= 0****

    通道0值13288、23.807611伏、计数= 2
    通道1值13107、23.483320伏、计数= 3
    通道2值13207、23.662487伏、计数= 2
    通道3值20414、5.103500伏、计数= 2

    通道0值0,0.000000伏,计数= 0****
    通道1值13106、23.481529伏、计数= 5
    通道2值13208、23.664278伏、计数= 4
    通道3值20416、5.104000伏、计数= 5

    通道0值13290、23.811195伏、计数= 5
    通道1值13106、23.481529伏、计数= 4
    通道2值13209、23.666069伏、计数= 3
    通道3值20416、5.104000伏、计数= 5

    通道0值13291、23.812986伏、计数= 5
    通道1值13106、23.481529伏、计数= 4
    通道2值13208、23.664278伏、计数= 5
    通道3值20418、5.104500伏、计数= 4

    通道0值13290、23.811195伏、计数= 5
    通道1值13106、23.481529伏、计数= 2
    通道2值13207、23.662487伏、计数= 3
    通道3值20417、5.104250伏、计数= 3

    通道0值0,0.000000伏,计数= 0****
    通道1值13107、23.483320伏、计数= 5
    通道2值0、0.000000伏、计数= 0 ****
    通道3值20416、5.104000伏、计数= 3

    通道0值13290、23.811195伏、计数= 4
    通道1值13106、23.481529伏、计数= 4
    通道2值13207、23.662487伏、计数= 5
    通道3值20416、5.104000伏、计数= 5

    通道0值13291、23.812986伏、计数= 4
    通道1值13110、23.488695伏、计数= 5
    通道2值13208、23.664278伏、计数= 5
    通道3值20417、5.104250伏、计数= 4

    通道0值13292、23.814777伏、计数= 3
    通道1值13106、23.481529伏、计数= 5
    通道2值0、0.000000伏、计数= 0 ****
    通道3值20417、5.104250伏、计数= 5

    通道0值13291、23.812986伏、计数= 4
    通道1值13106、23.481529伏、计数= 4
    通道2值13207、23.662487伏、计数= 5
    通道3值20413、5.103250伏、计数= 5

    您可以看到计数值不是5的位置、零计数是重试失败。

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

    John、

    根据您提供的代码、您似乎已设置器件来测量四个输入单端。 FSR 设置为±4.096V 范围、器件处于单次转换模式、数据速率为128SPS、比较器禁用。

    首先、我将使器件保持单次转换模式。 使用连续转换模式和切换通道可能难以跟踪通道数据。 在进行中的转换完成之前、写入配置不会设置配置。 在收集数据时、控制器可能会丢失对哪个通道获取的数据的跟踪。

    我不确定、但这可能是没有足够时间完成转换的问题。 通常、在开始转换后、控制器会在开始读取之前等待一个设定的时间周期。 此时间为:

    (1/(数据周期)+ 10%)+ 20us

    10%是针对器件内部时钟的变化、20us 是允许器件从断电状态唤醒。 如果器件设置为128SPS、则时间周期为862us。

    要查看这是否是问题、您可以执行两项操作之一、您可以单独尝试。 首先、您可以在读取转换数据之前添加此延迟。 这将允许器件有时间完成转换。 其次、您可以将数据速率更改为更快的值。 如果您将数据速率设置为475SPS、并且此问题发生频率较低、或消失、则可能是问题的根源。

    您还可以使用逻辑分析仪来检查转换开始到转换读取之间的时间、并查看零数据在通信之间是否对应的时间更短。

    无论如何、您应该能够快速测试此项、以查看其是否有用。


    吴约瑟

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

    感谢您的回复。  在设置配置和读取数据寄存器(HAL_DELAY_60)之间确实有60ms 的延迟。  我认为这对于任何数据速率都足够了。   

    我将尝试更快的数据速率、看看这是否有用。   

    电路板已经构建、在该区域非常紧密。  我不知道我是否可以在比较器输出上获得一条线路来监视转换完成。  我可能能够用显微镜把它放在上面。  也许周日我可以解决这个问题。

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

    John、

    关于数据速率、我想指出一点。 ADS1115是一款 Δ-Σ(或过采样)类型的数据转换器。 在数据周期内、ADC 以大约250kHz 的速率对输入电压进行采样。 收集所有这些样本以生成一个数据点。  

    如果将器件的数据速率设置为128SPS、则需要等待整个数据周期才能获取数据点。  


    吴约瑟

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

    数据速率为475SPS、等待时间为60ms 时、我得到:


    通道0值13462、24.119360伏、计数= 5
    通道1值13280、23.793278伏、计数= 1
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13463、24.121153伏、计数= 4
    通道1值13279、23.791487伏、计数= 5
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13463、24.121153伏、计数= 3
    通道1值13281、23.795069伏、计数= 5
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13461、24.117569伏、计数= 5
    通道1值0,0.000000伏,计数= 0****
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13460、24.115778伏、计数= 5
    通道1值13281、23.795069伏、计数= 5
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13460、24.115778伏、计数= 3
    通道1值13277、23.787903伏、计数= 4
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13459、24.113985伏、计数= 4
    通道1值13276、23.786112伏、计数= 4
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13460、24.115778伏、计数= 5
    通道1值13275、23.784319伏、计数= 4
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    数据速率为860SPS 时、我得到该值


    通道0值13437、24.074570伏、计数= 2
    通道1值13250、23.739529伏、计数= 1
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13437、24.074570伏、计数= 4
    通道1值0,0.000000伏,计数= 0****
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值0,0.000000伏,计数= 0****
    通道1值13248、23.735945伏、计数= 5
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值0,0.000000伏,计数= 0****
    通道1值0,0.000000伏,计数= 0****
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13437、24.074570伏、计数= 2
    通道1值0,0.000000伏,计数= 0****
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    通道0值13437、24.074570伏、计数= 2
    通道1值13250、23.739529伏、计数= 4
    通道2值13348、23.915112伏、计数= 4
    通道3值0,0.000000伏,计数= 0****

    通道0值0,0.000000伏,计数= 0****
    通道1值0,0.000000伏,计数= 0****
    通道2值0、0.000000伏、计数= 0 ****
    通道3值0,0.000000伏,计数= 0****

    我将尝试以3.3V 而不是5的电压运行它。

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

    看起来 ADS1115不像5V。  以下是最高数据速率下3.3V 的结果:

    通道0值13405、24.017237伏、计数= 5
    通道1值13925、24.948900伏、计数= 5
    通道2值13953、24.999067伏、计数= 5
    通道3值13413、3.353250伏、计数= 5

    通道0值14042、25.158525伏、计数= 5
    通道1值13928、24.954275伏、计数= 5
    通道2值13953、24.999067伏、计数= 5
    通道3值13411、3.352750伏、计数= 5

    通道0值14044、25.162107伏、计数= 5
    通道1值13929、24.956066伏、计数= 5
    通道2值13955、25.002649伏、计数= 5
    通道3值13413、3.353250伏、计数= 5

    通道0值14045、25.163900伏、计数= 5
    通道1值13928、24.954275伏、计数= 5
    通道2值13956、25.004442伏、计数= 5
    通道3值13413、3.353250伏、计数= 5

    通道0值14043、25.160316伏、计数= 5
    通道1值13929、24.956066伏、计数= 5
    通道2值13955、25.002649伏、计数= 5
    通道3值13414、3.353500伏、计数= 5

    通道0值14045、25.163900伏、计数= 5
    通道1值13929、24.956066伏、计数= 5
    通道2值13956、25.004442伏、计数= 5
    通道3值13413、3.353250伏、计数= 5

    通道0值14044、25.162107伏、计数= 5
    通道1值13930、24.957859伏、计数= 5
    通道2值13955、25.002649伏、计数= 5
    通道3值13414、3.353500伏、计数= 5

    通道0值14044、25.162107伏、计数= 5
    通道1值13931、24.959650伏、计数= 5
    通道2值13955、25.002649伏、计数= 5
    通道3值13413、3.353250伏、计数= 5

    通道0值14046、25.165391伏、计数= 5
    通道1值13932、24.961441伏、计数= 5
    通道2值13955、25.002649伏、计数= 5
    通道3值13414、3.353500伏、计数= 5

    我可以尝试4.50v、以便可以使用4.096 Vref

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

    看起来它也喜欢4.5V、但它总是错过了第一个转换:

    编译信息
    2020年6月26日
    13:20:09
    /Core/Src/main.c

    通道0值13398、24.004694伏、计数= 4
    通道1值13218、23.682196伏、计数= 5
    通道2值13321、23.866735伏、计数= 5
    通道3值18102、4.525500伏、计数= 5

    通道0值13401、24.010069伏、计数= 5
    通道1值13218、23.682196伏、计数= 5
    通道2值13323、23.870319伏、计数= 5
    通道3值18108、4.527000伏、计数= 5

    通道0值13402、24.011860伏、计数= 5
    通道1值13221、23.687571伏、计数= 5
    通道2值13320、23.864944伏、计数= 5
    通道3值18103、4.525750伏、计数= 5

    通道0值13402、24.011860伏、计数= 5
    通道1值13219、23.683987伏、计数= 5
    通道2值13322、23.868528伏、计数= 5
    通道3值18104、4.526000伏、计数= 5

    通道0值13401、24.010069伏、计数= 5
    通道1值13220、23.685778伏、计数= 5
    通道2值13322、23.868528伏、计数= 5
    通道3值18106、4.526500伏、计数= 5

    通道0值13404、24.015444伏、计数= 5
    通道1值13219、23.683987伏、计数= 5
    通道2值13325、23.873903伏、计数= 5
    通道3值18105、4.526250伏、计数= 5

    通道0值13401、24.010069伏、计数= 5
    通道1值13221、23.687571伏、计数= 5
    通道2值13322、23.868528伏、计数= 5
    通道3值18107、4.526750伏、计数= 5

    通道0值13401、24.010069伏、计数= 5
    通道1值13221、23.687571伏、计数= 5
    通道2值13322、23.868528伏、计数= 5
    通道3值18110、4.527500伏、计数= 5

    通道0值13403、24.013653伏、计数= 5
    通道1值13219、23.683987伏、计数= 5
    通道2值13320、23.864944伏、计数= 5
    通道3值18106、4.526500伏、计数= 5

    通道0值13404、24.015444伏、计数= 5
    通道1值13218、23.682196伏、计数= 5
    通道2值13321、23.866735伏、计数= 5
    通道3值18106、4.526500伏、计数= 5

    通道0值13401、24.010069伏、计数= 5
    通道1值13218、23.682196伏、计数= 5
    通道2值13322、23.868528伏、计数= 5
    通道3值18106、4.526500伏、计数= 5

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

    John、


    器件的输出实际上不应受到电源电压的影响、尤其是电源处于正常工作范围内时。 由于您具有某种隔离、我想知道您的传感器输入和 ADC 之间是否存在公共接地。

    您可以共享原理图吗? 了解如何设置此测试可能会有所帮助。 除了原理图、我想知道您连接到器件的 ADC 输入端的是什么。


    吴约瑟

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

    这 是隔离式模拟部分。  我使用隔离式直流/直流转换器来驱动它。  到部分的模拟输入来自一个48V 系统、此系统不与主系统共用一个接地。  我现在使用的解决方案是向直流/直流转换器的输出添加100欧姆负载、以更好地进行调节、并在 C160和 C156之间放置一个1N4148二极管、以实现0.6V 的压降。  这为我提供了约4.5V 的 ADS、它几乎能够完美工作。

    e2e.ti.com/.../ISO_5F00_Analogue_5F00_Section.pdf

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

    John、


    我有一个测试可供您尝试。 正如我在上一篇文章中提到的、器件的运行实际上不应受到电源电压的影响。 现在我已经看到了您的原理图、我将尝试进行修改。

    在原理图中、您将 L7和 L8电感器连接到器件的电源和接地端。 我会将其移除并替换为短路。 我通常避免使用具有 ADC 的电感器。 在 ADC 中、有数字电流流经器件。 虽然平均值不大、但它们可能瞬间较大、这就是我们在电源上使用旁路电容器的原因。 由于 L (di/dt)较大、具有电感器的数字电流将使电压尖峰。

    由于电源电压中存在较大的尖峰、您可能会产生如此大的周期性尖峰、从而使器件中的上电复位跳闸。 这可能会重置器件。 如果是这种情况、这将解释器件偶尔读取0V 的原因。 0V 读数将是上电后器件的第一次读数。 通常情况下、我本来希望配置寄存器的读取只会提供之前的 ADC 转换、但我认为您可能只是复位器件。

    同样、短接 L7和 L8并再次在电源上运行测试。 我认为这可能是问题所在。 我在过去看到过这样的情况:电源中的电感器或接地的电感器连接导致了这种复位。

    吴约瑟

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

    Joseph、

    它看起来可能已经修复了它。  我不会遇到读取故障和 I2C 总线错误。  我会继续进行测试、但我相信这就是答案。

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

    John、

    谢谢。 我以前见过这种情况。 我现在将关闭此帖子、但如果您有其他问题、您可以发帖、我们可以继续处理此问题(或任何其他问题)。

    吴约瑟