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.

[参考译文] ADS1299。 将二进制补码格式转换为电压

Guru**** 2589280 points
Other Parts Discussed in Thread: ADS1299

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/705175/ads1299-convert-from-binary-twos-complement-format-to-voltage

主题中讨论的其他器件:ADS1299

您好!

我在将24位二进制补码数据转换为模拟(电压)值时遇到问题。

我首先使用下一个函数将二进制补码转换为十进制值:

int32_t _binTwosCommentToSignedDecimal (uint32_t 数据、int 有效位)

   int32_t power = 1;//pow (2、有效位-1);
   int32_t sum = 0;
   int i;
   int data_bit;
   uint32_t temp_data = 0;
   uint32_t MSB_BIT = 1<<(有效位-1);

   //位反转:1000 0111 --> 1110 0001
   (i=0;<significantBits; ++i)
   {
      temp_data = temp_data +((data<>(有效位1-I));
      如果(i!=0)功率= POWER*2;//pow (2、有效位-1);
   }

         (i=0;<significantBits; ++i)
         {
            DATA_BIT =(TEMP_DATA &(1< >I;
            如果(i=0 && data_bit!=0)
            {
               SUM = POWER *-1;
            }
            其他
            {
               sum +=(data_bit-0)* power;//the -0 is needed
            }
            功率/= 2;
         }

         回款总额;
      }

然后、使用 ADS1299数据表 9.5.1数据格式中提供的一个代码(LSB)的大小、我打算将这个十进制值转换为电压:

电压= DecimalValue x (2 x Vref /增益)/(2^24)

其中:

增益= 24 (在 CHnSET 寄存器中记录的增益)

VREF = 4.5V (我正在使用内部基准、CONFIG3寄存器中的 NPD_REFBUF 域)

我使用已知阻抗中的 Keithley 电流源生成已知信号。

当我将信号转换为电压时、结果是预期结果的两倍。 当我转换删除 LSB 大小公式中的2x 时、结果是正确的。

使用内部测试信号和使用短路输入配置测量噪声时、问题也是如此。 在这两种情况下、转换后的信号都比预期的信号高两倍。

您能帮我确定我在转换中遇到的问题吗? 还是数据表中有任何错误?

此致、

Inigo

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

    我不知道您为什么这么复杂。
    给你。 更简单的方法:
    openbci.com/.../index.php

    然后、您的值为:
    Val =(结果*(基准电压/范围))/增益;
    其中 ReferenceVoltage 是您的4V5、范围为2^23、增益是您的增益
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Inigo、

    欢迎来到我们的论坛、感谢您的发帖!

    [引用用户="Inigo Dorronsoro"]电压= DecimalValue x (2 x Vref /增益)/(2^24)[/quot]

    您的初始公式正确。 ADC 的满量程范围为-VREF 至+VREF、由2^24个代码表示。 PGA 的输入必须限制为+/-VREF/增益、以使 ADC 输入保持在此范围内。

    在将十进制等效值乘以 LSB (最低有效位)大小之前、应检查 MSB 并查看该位是否设置为1。 如果 MSB 等于0、则可以使用上面的公式直接转换十进制代码。 如果 MSB 设置为1、则必须首先从十进制代码中减去2^24、然后乘以 LSB 大小。

    此致、

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

    感谢 Jack jackson52为您提供的答案、

    您发送给我的链接与我的函数具有相同的对话、我尝试了24位、结果是相同的。

    然后、您建议将其转换为电压的公式为:

    Val =(结果*(基准电压/范围))/增益;
    其中 ReferenceVoltage 是您的4V5、范围为2^23、增益是您的增益

    与我使用的公式相同

    电压= DecimalValue x (2 x Vref /增益)/(2^24)

    其中:

    增益= 24 (在 CHnSET 寄存器中记录的增益)

    VREF = 4.5V (我正在使用内部基准、CONFIG3寄存器中的 NPD_REFBUF 域)

    所以、我仍然处于同一个点。 当我将信号转换为电压时、我获得的结果仍然是预期的2倍。

    我想知道我是否理解基准电压值有什么问题...

    请提供进一步的帮助。

    Inigo

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

    感谢您回答 Ryan、

    [您的初始公式正确。 ADC 的满量程范围为-VREF 至+VREF、由2^24个代码表示。 PGA 的输入必须限制为+/-VREF/增益、以使 ADC 输入保持在此范围内。]

    我的输入信号很小、大约为1mV

    在将十进制等效值乘以 LSB (最低有效位)大小之前、应检查 MSB 并查看该位是否设置为1。 如果 MSB 等于0、则可以使用上面的公式直接转换十进制代码。 如果 MSB 设置为1、则必须首先从十进制代码中减去2^24、然后乘以 LSB 大小。


    这是您的意思吗? 如果是这种情况、我不明白为什么我应该减2^24。 此外、应用此转换时的结果是错误的

    如果(((ADS_DATA[0]& 0x800000)>23)=1){
       ADS_DATA[0]= ADS_DATA[0]- 16777216;//减2^24

    dataFloat =((float) ADS_DATA[0])* 2 * 4.5 /(24 * 16777216);// 16777216 = 2^24

    此致、

    Inigo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否检查基准引脚上的值? 实际上是4.5V 吗?

    如何应用信号? 在测量设置中的某个位置、您可能会放大信号
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好!

    我终于找到了问题。 我使用的是内部基准、但我在 VREFP 引脚上施加了-0.5V 的电压。 尽管使用内部基准电压时、该引脚的输入电压并不重要。 我的错误。

    现在我已经移除了与 VREFP 引脚的连接、那么二进制到电压的转换是正确的。

    感谢 Jack 和 Ryan!