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.

[参考译文] ADS114S08:ADS114S08 讲座读数中的热电偶错误

Guru**** 2969460 points

Other Parts Discussed in Thread: ADS114S08, ADS124S08

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1651083/ads114s08-ads114s08-thermocouple-error-in-lecture-readings

部件号: ADS114S08
主题中讨论的其他器件: ADS124S08

尊敬的 Sirs:

我无法正确读取 K 型和 J 型热电偶。 我的应用程序代码被复制
来自您的示例 tc_MSP432E_ADS124S08、但已根据我的电路进行了调整。 我将使用产生的偏置
通过 ADS114S08 本身、而不是外部上拉/下拉电阻来偏置热电偶。
在我的设计中、该电路还能够读取 RTD、这限制了我对 ADC 输入的使用
使用温度传感器。
因此、由于 ADC 只能在引脚 AN0 至 AN5 上使用偏置、因此我使用
反向输入:AIN1 作为热电偶的负(和偏置)端子、AIN2 如所示
正极端子。 对于第二个热电偶、我将使用输入 AIN5 作为负(和偏置)
端子 AIN6 作为正极端子。

我附加了一个文件、从第 339 行开始、您可以在其中看到 TC1 和 TC2 的配置。
ads114s08Config.h 

当我根据极性正确连接热电偶时、会得到非常高的负值 
​​来自寄存器的值(–16711846)(在寄存器值到 MV 转换之前)。 当我反转极性时,我得到了应该是正确的值,但如果我
加热热热电偶、然后​​再次开始读取非常高的负值、就像第一种情况一样。
与硬件和低电平固件相关的所有内容均正常工作(SPI,数据就绪引脚)等。 
因为我正在读取 RTD 而没有出现任何问题。
 
有什么建议吗?

随附原理图:
temp.pdf 

谢谢。此致。


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

    尊敬的 Jose Gaa:

    请在下面查看我的反馈。

    1. 使用 RTD 测量温度时、可以 在 IDAC 电流流经基准电阻时使用 REFP0/REFN0 上生成的外部基准电压进行比例式测量、但由于热电偶测量中没有 IDAC 电流、因此必须使用内部电压基准或提供外部基准电压。 在您的配置中、您仍在 REFP0/REFN0 上为热电偶选择了外部电压基准。 我建议您将 REFSEL[1:0]设置为 10b 以选择内部 2.5V 基准、将 REFCON[1:0]设置为 10b 以开启内部基准、因为内部基准默认为关闭、并将 REFP_BUF 设置为 0b、将 REFN 设置为 1b(这是默认配置)。  
    2. 当您测量 AIN2 和 AIN1 之间的热电偶时、请移除 AIN2 和 AIN3 之间的电阻 R50、然后您可以测量输入来查看热电偶是否正确偏置。
    3. 您还可以在输入端施加离散电压而不是实际的热电偶来执行一些测试、以进行测试。

    BR、

    Dale

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

    尊敬的 Dale:

    感谢您的回答。  

    我的配置与您所描述的完全相同、REFP_BUF = 0(我的 REFP_BUF = 1)除外。 
    如果我们不使用外部基准、是否需要使 REFP_BUF 处于活动状态?
    这些是​​我用于配置您提到的寄存器的示例代码中的标志值。

    //参考监视器配置
    #define ADS_FLAG_REF_DISABLE  0x00
    #define ADS_FLAG_REF_EN_L0     0x40
    #define ADS_FLAG_REF_EN_BOTH  0x80
    #define ADS_FLAG_REF_EN_10M     0xC0
    //正基准缓冲器旁路
    #define ADS_REFP_BYP_DISABLE  0x20
    #define ADS_REFP_BYP_ENABLE     0x00
    //负基准缓冲器旁路
    #define ADS_REFN BYP_DISABLE  0x10
    #define ADS_REFN _BYP_ENABLE     0x00
    //基准输入选择
    #define ADS_REFSEL_P0       0x00
    #define ADS_REFSEL_P1       0x04
    #define ADS_REFSEL_INT       0x08
    //内部基准
    #define ADS_REFINT_OFF       0x00
    #define ADS_REFINT_ON_PDWN     0x01
    #define ADS_REFINT_ON_ALWAY  0x02

    作为一种指示、偏置似乎已正确配置、因为我测量到介于两者之间的 2.5V 电压 
    ADC 的负输入和接地。 您提到移除 R50;这在最终设计中是必要的、还是仅用于测试?
    这样做的目的是能够在没有不同配置的情况下测量同一 PCB 上的 RTD 和热电偶。
    如果根本没有配置 AN3、这会如何影响偏置?

    我已经执行了向输入端施加电压而不是连接热电偶的测试、 
    我得到了正确的读数、这很奇怪。 这可能是增益问题? 在示例代码中、
    增益设置为 2、这在我看来很奇怪、因为热电偶电压非常小、而且有
    其他空间来增加增益。
     
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jose Gaa:

    请查看下面的反馈:

    1. REFP 缓冲器不仅用于外部电压基准、还用于内部电压基准、因此您 应该将其打开。
    2. 移除 R50 可避免 AIN3 产生任何不必要的干扰。 连接后、输入可能有漏电流、它不应导致如此高的误差、但您至少应 在测试热电偶时将其移除以进行调试。
    3. 您可以尝试不同的增益、但我认为这与您看到的现象无关。

    我会推荐你的

    1. 打开 REFP_buf 并移除 R50、验证输入端的偏置电压、监控 ADC AIN1 和 AIN2 之间的差分电压 (Vdiff)、使用单个热电偶捕获数据、与我共享 ADC 原始数据和测量的 Vdiff。
    2.  使用其他偏置技术检查热电偶、例如 REFOUT 以进行测试。

    BR、

    Dale

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

    尊敬的 Dale:

    很抱歉、您的回复太晚了、但我已经离开办公室工作、无法测试您提到的内容。

    打开 REFP_buf 并删除了 R50。

    通过这些设置、我将电源连接到输入来测试 ADC。 我注意到的 
    如果施加正电压、则读数正确、但如果我将导线反向连接到
    模拟负电压(因为热电偶在低于 0°C 的温度下运行)、即 ADC 读数
    返回到大约–16711846。 有什么想法吗?
     
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jose Gaa:

    ADS114S08 以二进制补码格式提供 16 位数据、MSB 指示 差分输入为正或负、请参阅 ADS114S08 数据表的 9.5.2 数据格式部分中的详细信息。 您还可以使用以下工具中的 Code Conversion 页面来验证 从 ADC 接收到的转换数据。

    ADS124S08 EXCEL-CALC-TOOL — ADS1x4S0x 设计计算器

    我可以检查您是否可以共享来自 ADS114S08 的原始数据。

    BR、

    Dale

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

    尊敬的 Dale:

    我终于可以正常工作了;这是数据转换过程中软件中的一个错误。 
    使用示例代码时、如果使用的是 24 位 ADC 而不是 16 位 ADC(我的用例)、
    我没有纠正这个细节。

      #ifdef ADS114S08
      /*返回 32 位符号扩展转换结果*/
      if (DataRx[dataPosition ]& 0x80u){
        符号字节= 0xFFFF0000;                               在这一行中、修复前为:signByte = 0xFF000000;   
      }其他{  
        signByte = 0x00000000;
      }
      middleByte =((int32_t) DataRx[dataPosition ]& 0xFF)<< 8;
      lowerByte  =((int32_t) DataRX[dataPosition + 1]和 0xFF);
      返回 (signByte + middleByte + lowerByte);
      #elif defined (ADS124S08)
      /*返回 32 位符号扩展转换结果*/
      if (DataRx[dataPosition ]& 0x80u){
        signByte = 0xFF000000;
      }其他{
        signByte = 0x00000000;
      }

      uppyte  =((int32_t) DataRx[dataPosition ]& 0xFF)<< 16;
      middleByte =((int32_t) DataRx[dataPosition + 1]& 0xFF)<< 8;
      lowerByte  =((int32_t) DataRx[dataPosition + 2]& 0xFF);
      返回 (signByte + upperByte + middleByte + lowerByte);
      #endif

    感谢您的支持、 我认为该主题已解决。