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:始终读取错误的失调电压、即使所有输入均连接到 GND、所有通道上的模拟电压仍为-ve Vref (-2.5V)

Guru**** 2553450 points
Other Parts Discussed in Thread: OPA350, ADS1256

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/883876/ads1256-reading-wrong-offset-all-the-time-and-analog-voltage-coming-as--ve-vref--2-5v-on-all-channels-even-though-all-input-connected-to-gnd

器件型号:ADS1256
主题中讨论的其他器件: OPA350

您好!  

我使用的是 AD1256、读数有问题。 偏移值如所示  


[0;37m[ADS125x] gf_fSC = 3089023.000000

[0;37m[ADS125x] gf_ofc =-3089023.000000

ADC 输出就是这样  

REC:(08:57:59)[0;37m[APP]正在初始化 ADS125X…


REC:(08:58:00)[0;37m[ADS125x]启动校准.
[0;32m[ADS125x](INFO) FSC2 = 45
[0;32m[ADS125x](INFO) FSC1 = b

[0;32m[ADS125x](INFO) FSC0 = C6
[0;32m[ADS125x](info) OCFS2 = ff
[0;32m[ADS125x](info) OCFS2 = fe
[0;32m[ADS125x](INFO) OCFS2 = C8

REC:(08:58:01)[0;37m[ADS125x]校准...


REC:(08:58:02)[0;32m[ADS125x](INFO) FSC2 = 2f
[0;32m[ADS125x](INFO) FSC1 = 22
[0;32m[ADS125x](INFO) FSC0 = 80
[0;32m[ADS125x](info) OCFS2 = ff
[0;32m[ADS125x](info) OCFS2 = fe
[0;32m[ADS125x](INFO) OCFS2 = 31
[0;37m[ADS125x]校准...

REC:(08:58:04)[0;32m[ADS125x](INFO) FSC2 = 2f
[0;32m[ADS125x](INFO) FSC1 = 22
[0;32m[ADS125x](INFO) FSC0 = 7f
[0;32m[ADS125x](info) OCFS2 = ff
[0;32m[ADS125x](info) OCFS2 = fe
[0;32m[ADS125x](INFO) OCFS2 = 31

REC:(08:58:04)[0;32m[app](info)!!! 硬件初始化成功!!


REC:(08:58:05)[0;37m[ADS125x]原始 ADC = 65328
[0;37m[ADS125x] gf_fSC = 3089023.000000
[0;37m[ADS125x] gf_ofc =-3089023.000000
[0;37m[app]电压(AN0 - AN1)=-2.513977 V


REC:(08:58:06)[0;37m[ADS125x]原始 ADC = 65522
[0;37m[ADS125x] gf_fSC = 3089023.000000
[0;37m[ADS125x] gf_ofc =-3089023.000000
[0;37m[app]电压(AN2 - AN3)=-2.513862 V

REC:(08:58:06)[0;37m[ADS125x]原始 ADC = 32
[0;37m[ADS125x] gf_fSC = 3089023.000000
[0;37m[ADS125x] gf_ofc =-3089023.000000
[0;37m[app]电压(AN4 - AN5)=-2.513834 V

REC:(08:58:07)[0;37m[ADS125x]原始 ADC = 65532
[0;37m[ADS125x] gf_fSC = 3089023.000000
[0;37m[ADS125x] gf_ofc =-3089023.000000
[0;37m[app]电压(AN6 - AN7)=-2.513856 V

我在开发板上测试了相同的代码、并按预期工作。 但不在我的新原型板上。

在 Vref 1.25V 和2.5V 下进行了测试

VCC -- 3.3V

VCC ---- 5.2V

这种设置似乎找不到任何问题。

PS --所有电容器均为陶瓷非极化电容器

任何帮助都将不胜感激。  

谢谢

 

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

    尊敬的 Anil:

    您使用哪些命令来执行偏移和增益校准? SELFOCAL、SELFGCAL、SELFCAL、SYSOCAL 和/或 SYSGCAL? 您说在执行校准例程时所有输入都接地了吗?

    此外、在此配置中、您是否打开或关闭了 ADS12F50的缓冲器?

    您说的是、无论您是否使用 VREF = 1.25或2.5V、AVDD = 3.3或5V、您都能获得相同的结果吗? 您是否使用这些设置的全部4倍组合、或仅使用其中的一些组合?

    请告诉我、以便我们可以尝试确定这里发生了什么。

    布莱恩

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

    您好、Bryan、  

    感谢您的快速响应。  

    我正在执行自校准(SELFCAL)。

    校准期间、输入是否接地似乎无关紧要、或者结果不一样。

    缓冲器关闭。

    是的、尽管将 Vref 更改为1.25V 或2.5V、但我仍然获得相同的结果。 我的 AVDD 为5V。   

    根据数据表、范围应为 AVDD 4.75- 5.25V。因此我将其保持在5V、不确定 AVDD 将在3.3V 下工作。

    固件在开发板上完美工作、但在我的原型板上不工作。  

    在布局中、我尽可能缩短所有布线。 使用示波器、我监控所有电力线、并且任何电力线上都没有噪声。

    不确定这里发生了什么。

    谢谢、Bryan。

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

    尊敬的 Anil:

    感谢您的反馈。 您在原始帖子中提到了"Vcc - 3.3V"、因此我想确保您的操作不在 ADS1212的建议 AVDD 范围之外。 但我猜您是指 DVDD?

    您能告诉我您使用的数据速率和 PGA 增益是多少?

    布莱恩

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

    您好、Bryan、

    是的、DVDD 为3.3V。

    我的数据速率 SPS 为2.5、增益 si 设置为1。

    使用开发板时的输出。 相同的固件

    REC:(11:21:08)[0;37m[app]正在初始化 ADS125X…


    REC:(11:21:09)[0;37m[ADS125x]启动校准.
    [0;32m[ADS125x](INFO) FSC2 = 45
    [0;32m[ADS125x](INFO) FSC1 = b
    [0;32m[ADS125x](info) FSC0 = ae

    [0;32m[ADS125x](INFO) OCFS2 = 0
    [0;32m[ADS125x](INFO) OCFS2 = 5
    [0;32m[ADS125x](INFO) OCFS2 = B1


    REC:(11:21:10)[0;37m[ADS125x]校准...

    REC:(11:21:11)[0;32m[ADS125x](INFO) FSC2 = 2f
    [0;32m[ADS125x](INFO) FSC1 = 22
    [0;32m[ADS125x](INFO) FSC0 = A1
    [0;32m[ADS125x](INFO) OCFS2 = 0
    [0;32m[ADS125x](INFO) OCFS2 = 8
    [0;32m[ADS125x](INFO) OCFS2 = 90
    [0;37m[ADS125x]校准...

    REC:(11:21:13)[0;32m[ADS125x](INFO) FSC2 = 2f

    [0;32m[ADS125x](INFO) FSC1 = 22
    [0;32m[ADS125x](INFO) FSC0 = A1
    [0;32m[ADS125x](INFO) OCFS2 = 0
    [0;32m[ADS125x](INFO) OCFS2 = 8
    [0;32m[ADS125x](INFO) OCFS2 = 90

    REC:(11:21:13)[0;32m[app](信息)!!! 硬件初始化成功!!


    REC:(11:21:14)[0;37m[ADS125x]原始 ADC = 2.
    [0;37m[ADS125x] gf_fSC = 3089057.000000
    [0;37m[ADS125x] gf_ofc = 2192.000000
    [0;37m[app]电压(AN0 - AN1)= 0.001785V

    REC:(11:21:14)[0;37m[ADS125x]原始 ADC = 65001
    [0;37m[ADS125x] gf_fSC = 3089057.000000
    [0;37m[ADS125x] gf_ofc = 2192.000000
    [0;37m[app]电压(AN2 - AN3)= 0.001467V

    REC:(11:21:15)[0;37m[ADS125x]原始 ADC = 258
    [0;37m[ADS125x] gf_fSC = 3089057.000000
    [0;37m[ADS125x] gf_ofc = 2192.000000
    [0;37m[app]电压(AN4 - AN5)= 0.001937V

    REC:(11:21:16)[0;37m[ADS125x]原始 ADC = 89
    [0;37m[ADS125x] gf_fSC = 3089057.000000
    [0;37m[ADS125x] gf_ofc = 2192.000000

    [0;37m[app]电压(AN6 - AN7)= 0.001837V

    一切都和预期的一样  

    谢谢

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

    您好、Gama、

    您如何解读 FSC 和 OSC 的值? 初始线程中的值(FSC = 2F227Fh、OSC = FFFE31h)似乎合理、但我不清楚此后会发生什么情况、从而使 FSC = 3089023和 OSC =-3089023。 原始 ADC 代码考虑了偏移和增益校准、因此也不清楚代码= 65532如何变为-2.51V。对于2.5V VREF、66532 = 39.4mV

    我无法在原理图中读取电容值、因此很难判断 OPA350输出端的电容大小。 由于 OPA350上的压降、OPA350输出端的电阻器将导致较小的增益误差。 我没有看到任何令人惊讶的错误、假设是"DGND/2"。 是相对于 AVDD 和 DVDD 的真正接地。 没有显示电源电路供我验证。

    布莱恩

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

    您好、Gama、

    此外、我还使用 ADS1256计算器工具 来解释您提供的校准值。 请参阅下图、了解我要获得的结果。 在该初始线程中提供的数据中、偏移似乎为负值、因此十六进制值被误解为结果。

    校准后、您能否将输入短接在一起并进行测量? 该值实际上应该是 ADC 的噪声-如果不是、可能还有其他问题。

    布莱恩

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

    许 Bryan

    读取原始 ADC 值后、这就是我转换为电压的方式  

    f_2_Vref = 2 *(gf_Vref_p - gf_Vref_n);
    if (u32_RAW_ADC > 0x7FFFFF)

    /*负满标度*/
    u32_RAW_ADC = 16777216 - u32_RAW_ADC;
    f_adc_out =(float)(u32_raW_adc);
    * pf_voltage =((-1.0 * f_adc_out)/(gf_fSC * gf_beta)+ gf_ofc / gf_alpha)* f_2_vref / gf_gain;

    其他

    /*正满量程*/
    f_adc_out =(float)(u32_raW_adc);
    * pf_voltage =(f_adc_out /(gf_fSC * gf_beta)+ gf_ofc / gf_alpha)* f_2_vref / gf_gain;

    OPA350之后、电容器为10uF 和0.1uF。

    DGND 和 AGND 连接在一起、然后通过0欧姆电阻连接到我的电源接地。  

    固件在其他开发板上工作、因此我认为这是一个固件问题。

    谢谢

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

    您好、Gama、

    如何计算"u32_RAW_ADC"值?

    将多个字节组合成一个32位字时、有几个" gotchas "。 我在另一个 E2E 帖子中帮助其他人解决此问题、因此在这里也可能有所帮助: https://e2e.ti.com/support/data-converters/f/73/p/878552/3269878#3269878 

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

    尊敬的 Chris:

    这是我的原始 ADC 代码

    AVR_ASSERT_break (GB_ads125x_init = true);
    s16_ret = ads125x_cs_en ();
    AVR_ERROR_break (S16_ret);
    AVR_ASSERT (gstr_hw.pf趣味_SPI_TX!= NULL);/*断言,因为它意味着内存损坏*/
    S16_ret = gstr_hw.pf有趣_SPI_TX (ADS125X_RD_DATA_CMD);

    AVR_ASSERT (gstr_hw.pf趣味_SPI_Rx!= NULL);/*断言,因为它意味着内存损坏*/
    s16_ret = gstr_hw.pf有趣_spi_rx (&u8_tmp);/*读取 MSB*/
    AVR_ERROR_break (S16_ret);
    * pu32_raW_ADC =((uint32_t)(u8_tmp)<< 16);
    s16_ret = gstr_hw.pf有趣_spi_rx (&u8_tmp);/*读取中间字节*/
    AVR_ERROR_break (S16_ret);
    *pu32_raW_ADC |=((uint32_t)(u8_tmp)<< 8);
    s16_ret = gstr_hw.pf有趣_spi_rx (&u8_tmp);/*读取 LSB*/
    AVR_ERROR_break (S16_ret);
    *pu32_raW_ADC |=(uint32_t)(u8_tmp);

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

    您好、Gama、

    Chris 看了上面的代码片段、它似乎按预期运行。 但是、我相信原始线程的误差只是从将负十六进制值转换为十进制数来产生的。 当偏移量为正时(000890h)、计算效果良好。 但是、当我转换负十六进制值(FFFE31h)时、结果为-463、而不是-3089057。 我昨天通过 ADS1256配置计算器向该线程发布的图像中显示了产生的失调电压。 请 µV、我手动计算了十进制值、但计算器显示该值为-377 μ V 的小负偏移。

    不过,我仍然不清楚为何你要这样做。 ADC 会自动将 OFC 和 FSC 寄存器值应用于每次转换、因此 ADC 输出代码已经包含这两个校正。 因此、如果更改数据速率、则需要再次执行校准、建议在更改 PGA 增益或缓冲器设置时执行其他校准、因为校准值在这些情况下会有所不同。

    最终、如果您获取校准的 ADC 代码并再次应用 FSC 和 OFC 值、实际上会将误差重新添加到系统中。 您是否正在尝试重新计算未校准的 ADC 代码? 如果是这样、您只需关闭校准、ADC 代码就会为您提供该值。 如果不是、请告诉我您尝试做什么、也许我们可以找出一些事情。 但是、为了检查您的系统是否正常工作、我建议运行校准例程、对 ADC 的输入施加1/2 Vs 电压(将它们短接至0V 差分)、然后检查输出代码是什么。 生成的代码应接近给定数据速率和增益设置下 ADC 的噪声-如果不是、可能其他问题也是错误的。

    布莱恩

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

    您好、Bryan、

    如果无法存储校准值,我们如何获得原始 Vin?

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

    您好、Gama、

    如果您需要未校准值、则可以在不应用校准命令的情况下读取数据、并将此代码存储在 MCU 中。 然后、您可以打开校准、执行测量并获取校准值。 我假设您的输入在这段时间内是恒定的、因此这应该是两个值的准确表示。

    出于好奇、您为什么需要校准值和未校准值? 这在您的系统中是如何使用的? 我从未见过以这种方式使用 ADS1256、因此了解为什么需要这样做可能会有所帮助。

    布莱恩

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

    感谢您的快速回复。

    "根据原始 Vin,我指的是输入电压,因此正如您先前所说的,补偿是自动应用的,因此 ADC 代码已经是补偿值, 根据数据表上的公式,我必须反转该公式才能获得 Vin,如果我不知道 α 和 β+校准因子,那么我将如何获得 Vin?”  

    下面是我们如何计算 Vin 的方法,您能否验证这是正确的方法?

    谢谢

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

    您好、Gama、

    如果您只是尝试将原始 ADC 值转换为输入电压、则可以将 f_adc_out 乘以 ADC 的 LSB 大小。 如数据表所示,这等于2*VREF/(PGA*(2^23-1))-更多详细信息请参阅第23页。 您的代码中似乎已经有 VREF 和 PGA 增益作为输入。 这适用于校准代码和未校准代码。

    如果您尝试确定未校准值、则应关闭校准并确保 FSC 和 OFC 寄存器设置为其默认值。 然后、原始输出代码将表示未校准值。

    布莱恩