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.

[参考译文] MSP430F5328:对 REF 电压采样-为什么它不是由 ADC 在满量程时测量的?

Guru**** 2747405 points

Other Parts Discussed in Thread: MSP430F5328

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/791771/msp430f5328-sampling-the-ref-voltage---why-is-it-not-measured-at-full-scale-by-the-adc

器件型号:MSP430F5328

我有一个问题我不是很理解。  如果我对基准电压进行采样并从 TLV 结构中应用基准校准、应该读取满量程、即0xFFF?

例如:

选择2伏基准作为基准:

 

为 ADC 选择要采样的基准通道:

 

VeREF+通过 REFOUT 连接。 VREF 也映射到引脚、并在1.96664处测得

所选的 ADC 基准

以一秒的间隔从 ADC 获取16个样本、并以定点取平均值。

原始 ADC 采样平均值= 0xc=4092。  转换为伏特2/4096 * 4092 = 1.998046875

将 0x7E9A TLV 的基准校准因子应用到原始 ADC 值和平均值得到 的0xfd2 = 4050。  转换为伏特2/4096 * 4050 = 1.9775390625

 

REF 的典型规格为1.98。

当应用 REF TLV 校准时、从 ADC 测得的基准电压为什么不接近或恰好不是0xFFF?

基准电压是否不是2伏、而是1.98伏? 如果正确,那么为什么说“测量值在存储到 TLV 结构之前被标准化为1.5/2.0/2.5V:”

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

    感谢您的发帖、我们将研究这一点、尽快回复您。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仅出于我的理解、您是否在计算中考虑了增益和失调电压误差?

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

    我在另一个步骤中应用了基准校准、然后应用了增益和偏移。  我的结果是:

    平均原始 ADC 和:FFC

    平均基准已更正原始 ADC 总和:fd2

    平均基准增益已更正原始 ADC 总和:fd2

    确定了相同的值。

    从该微 TLV:

    ADC TLV:

    参考 TLV:

    REF 和 ADC 偏移/增益通过以下方式完成:


     UINT16应用参考计算系数(UINT16 adcSample)
     {
        uint32 adcResult;/*移至 uint32以防止溢出*/

        /*按基准校准系数调整原始 ADC 样本*/
        adcResult =(uint32) adcSample * ref2VoltCalFactor;//乘以参考校准因子*/
        adcResult = adcResult >> 15;//除以32768 */

        return ((uint16) adcResult);
     }

     UINT16应用程序 GainAndOffsetCorrection (UINT16 adcSample)
     {
        uint32 adcResult;

        /*将增益和偏移校正应用于基准校正的 ADC 样本*/
        adcResult =(uint32) adcSample * adcGainCalibration;//乘以增益*/
        adcResult = adcResult >> 15;//除以32768 */
        adcResult = adcResult + adcOffsetCalibration;//添加偏移量*/

        if (adcResult & 0x80000000)//如果偏移加法使数字为负数,则将结果设置为零
        {
            adcResult = 0;
        }

        return ((uint16) adcResult);
     }

    首先执行 REF 校准、然后执行偏移/增益。

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

    尊敬的 T.SOS:

    您确实提出了一个好问题。 让我逐步解释一下。

    首先、让我尝试了解您的设置:您通过 REFCTL0.REFVSEL = 1和 REFCTL0.REFON = 1将 REF 模块设置为2.0V、并通过 REFCTL0.REFOUT = 1从 VREF+引脚输出。 然后、选择 ADC 对 VeREF+引脚(通道8)进行采样、并使用 VREF+和 AVSS 作为基准。 在这种情况下、由于 VeREF+引脚的电压来自 VREF+、因此您期望得到的值为"0xFFF"、而不是"0xFFC"。 理想情况下、VeREF+的 ADC 输入端的电压应"等于"VREF+、但是、尽管 VeREF+引脚直接与 VREF+相连、但 VeREF+端子和 ADC 输入端子之间有一个模拟多路复用器、如数据表中的以下快照所示:

    对于模拟多路复用器、您可以从用户指南中找到详细信息、如下所示:

    由于从 ADC 的输入引脚 Ax 到器件内部的实际"采样保持"端子的三个模拟多路复用器、将会产生轻微的电压损耗。 同样、正如 Lukas 所说、考虑到 ADC 的偏移和增益误差以及其他非线性误差、您可以看到理想值"0xFFF"与实数"0xFFC"之间存在微小差异。

    然后、让我们来谈谈校准。 基准校准的目的是、正如您在数据表中看到的、基准电压在不同器件之间有一个轻微的变化。 例如、2.0V VREF+的实际电压可能在1.9503V 至2.0097V 之间变化、并且分布的标称值为1.98V。 因此、用户需要进行校准、作为 ADC 值达到2.0V 的"标准化"。

    未经校准、ADC 原始数据在"0xFFC"处取平均值、但由于需要校准基准电压、因此无法在此计算中使用2.0V 电压。 很抱歉、但我需要指出0xFFC 的使用错误。 让我们暂时搁置一下。

    此外、您还可以通过外部仪器(可能是61/2数字仪表)在 VREF+引脚上进行测量。 由于我不确定您的仪表是否准确、因此我们也将其放在一边。 然后、您应用了校准并获得"0xFDC"数据。 这次、0xFDC 的用法几乎被纠正(除了需要使用4095而不是4096作为除数)、因为校准的目的是获得一个低于2.0V 基准的值。 目前、我们将 VREF+引脚的电压设置为1.9780V。  

    此外、您还提到了 TLV 中的校准数据为0x7E9A。 让我们看看该数据的含义。 这是允许用户使用此参数将其 ADC 值"校准"为2.0V 基准的一个因素。 事实上、我们可以使用该数据来计算 VREF+的实际值。 公式如下:0x7E9A * 2.0V /(2^15)。 由此,我们得到的电压为1.9781V --这非常接近我们之前得到的1.9780V。

    然后让我们回到使用您自己的仪器得到的价值-- 1.9664V。 我不是100%肯定的,但我建议你对你的仪器进行校准--是的,仪器也需要经常校准。  

    希望这能为您提供帮助。 如果您有更新、请随时通知我。

    此致、

    哈里

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

    感谢您的回答。 我正在思考答案、还有几个问题。

    "此外、您还可以通过外部仪器(可能是61/2数字仪表)在 VREF+引脚上进行测量。 由于我不确定您的仪表是否准确、因此我们也将其放在一边。 然后、您应用了校准并获得"0xFDC"数据。 这次、0xFDC 的用法几乎被纠正(除了需要使用4095而不是4096作为除数)、因为校准的目的是获得一个低于2.0V 基准的值。 目前、我们将 VREF+引脚的电压设置为1.9780V。 "

    我不明白为什么你说"...(除了你需要使用4095而不是4096作为除数)"

    "然后让我们回到使用您自己的仪器得到的价值-- 1.9664V。 我不是100%肯定的,但我建议你对你的仪器进行校准--是的,仪器也需要经常校准。 "

    该仪表是 Keysight 34461A 6 1/2于2018年7月校准、需要2019年7月进行校准。 作为双重检查、我使用了另一个仪表并测量了相同的 VREF 电压。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 T.SOS:

    对于"除了需要使用4095而不是4096作为除数"的语句、您可以参阅以下用户指南中的快照:

    原理是 ADC 将最小基准量化为0x000 (0)、将最大基准量化为0xFFF (4095)。

    至于1.978V 和1.967V 之间的微小差异、很抱歉、现在我无法提出其他想法。 但是、由于它仅为~10mV、我不确定它是由某些系统误差或噪声引起的、还是由什么引起的。

    此致、

    哈里

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

    我会将我的两个答案标记为"TI 认为已解决"、因为它们可能对其他人也有帮助。
    您仍可以在本主题下发布您的问题。

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

    在我生病后回到这个地方。

    "未经校准、ADC 原始数据在"0xFFC"处取平均值、但由于需要校准基准电压、因此无法在此计算中使用2.0V 电压。 很抱歉、但我需要指出0xFFC 的使用错误。 让我们暂时搁置一下。

    此外、您还可以通过外部仪器(可能是61/2数字仪表)在 VREF+引脚上进行测量。 由于我不确定您的仪表是否准确、因此我们也将其放在一边。 然后、您应用了校准并获得"0xFDC"数据。 这次、0xFDC 的用法几乎被纠正(除了需要使用4095而不是4096作为除数)、因为校准的目的是获得一个低于2.0V 基准的值。 目前、我们将 VREF+引脚的电压设置为1.9780V。 "

    为了清晰起见、"0xFDC"应更改为0xFD2。

    这个问题的目的是在不进行过采样的情况下尽可能准确地测量输入。 我一直在努力寻找正确的方法来实现这一目标。 感谢您与我讨论这个问题。

    什么是"...您不能在此计算中使用2.0V 电压。 很抱歉、但我需要指出0xFFC 的使用错误。 让我们暂时把它放在一边。" 那么应该使用什么值?

    根据我的理解、电压/位是2/4096。 您提到我需要使用4095。 在这种情况下:

    参考位数伏/位
    2.40960.000488281
    2.40950.000488400

    但是、现在我有点困惑、就像您提到的"... 因为校准的目的是获得一个低于2.0V 基准的值。 "

    这似乎与手册在"测量值在存储到 TLV 结构之前按1.5/2.0/2.5V 标准化:"中提到的内容相冲突。

    如果我希望从 ADC 转换结果中获取电压的最精确值、即将 ADC 计数转换为电压、那么我应该使用什么值作为参考?

    也许您最好展示如何将 ADC 计数转换为电压。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 T.SOS:

    很遗憾听到这种疾病。 希望您获得良好的效果。

    让我使用内联注释来解释更多内容。 请参阅一些以红色显示的内联注释。

    "未经校准、ADC 原始数据在"0xFFC"处取平均值、但由于需要校准基准电压、因此无法在此计算中使用2.0V 电压。 很抱歉、但我需要指出0xFFC 的使用错误。 让我们暂时搁置一下。

    此外、您还可以通过外部仪器(可能是61/2数字仪表)在 VREF+引脚上进行测量。 由于我不确定您的仪表是否准确、因此我们也将其放在一边。 然后、您应用了校准并获得"0xFDC"数据。 这次、0xFDC 的用法几乎被纠正(除了需要使用4095而不是4096作为除数)、因为校准的目的是获得一个低于2.0V 基准的值。 目前、我们将 VREF+引脚的电压设置为1.9780V。 "

    为了清晰起见、"0xFDC"应更改为0xFD2。 很抱歉出错了。

    这个问题的目的是在不进行过采样的情况下尽可能准确地测量输入。 我一直在努力寻找正确的方法来实现这一目标。 感谢您与我讨论这个问题。  

    什么是"...您不能在此计算中使用2.0V 电压。 很抱歉、但我需要指出0xFFC 的使用错误。 让我们暂时把它放在一边。" 那么应该使用什么值?  

    在这里、我之所以说"您无法使用2.0V"是因为、您需要准确的结果、并且在校准之前基准值有点"未知"(从数据表中可以看到偏差为1.95V 至2.0V)、 不应将"2.0V"用作原始 ADC 数据的计算基准。

    根据我的理解、电压/位是2/4096。 您提到我需要使用4095。 在这种情况下:

    参考位数 V/位
    2 4096 0.000488281
    2 4095 0.000488400

    实际上、这有点令人困惑。 12位 ADC 只有4096-1量化步骤(n 个值只能有 n-1个间隔、对吧?)。 这就是用户指南显示使用4095而不是4096的公式的原因。

    但是、现在我有点困惑、就像您提到的"... 因为校准的目的是获得一个低于2.0V 基准的值。 "

    这似乎与手册在"测量值在存储到 TLV 结构之前按1.5/2.0/2.5V 标准化:"中提到的内容相冲突。

    这实际上是相同东西的不同表达式。 用户指南尝试说 TLV 数据标准化了2.0V、而我说的是、使用 TLV 数据校准后、您可以得到一个标准化的 ADC 结果、即2.0V 基准电压。 在本例中、0xFFC 是原始数据、代表实际基准(我们不知道确切的电压)、而0xFD2是校准数据、代表低于"标准化2.0V 基准"的电压。

    如果我希望从 ADC 转换结果中获取电压的最精确值、即将 ADC 计数转换为电压、那么我应该使用什么值作为参考?  

    也许您最好展示如何将 ADC 计数转换为电压。

    您的过程实际上是正确的。 使用 ADC 原始数据、您首先进行基准校准(如果使用内部基准)、然后进行 ADC 偏移和增益校准。 例如、我手头上有一个 F5529、并执行了如下测试:

    使用内部基准、经过1.5V/2.0V/2.5V 并将1.0V 从外部源注入 A0通道。 ADC 采样16次并求平均值。

    TLV 数据、@0x1A16 = 0x7FF9、@0x1A18 = 0、@0x1A28 = 0x7FAD、@0x1A2A = 0x7F40、 @0x1A2C = 0x8041。 结果如下所示。

    参考电压 ADC 原始数据 校准数据 转换为电压
    1.5V 0xABA 0xABA * 0x7FAD/(2^15)* 0x7FF9/(2^15)+ 0 = 0xAB2 0xAB2/4095 * 1.5 = 1.00293
    2.0V 0x812 0x812 * 0x7F40/(2^15)* 0x7FF9/(2^15)+ 0 = 0x805 0x805 /4095 * 2.0 = 1.00269
    2.5V 0x668 0x668 * 0x8041/(2^15)* 0x7FF9/(2^15)+ 0 = 0x66A 0x66A / 4095 * 2.5 = 1.00244

    希望这会有所帮助。

    此致、

    哈里

     

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

    您好、Harry、

    根据我的理解、电压/位是2/4096。 您提到我需要使用4095。 在这种情况下:

    参考     位数            V/位
          2.              4096          0.000488281
          2                        4095                 0.000488400

    实际上、这有点令人困惑。 12位 ADC 只有4096-1量化步骤(n 个值只能有 n-1个间隔、对吧?)。 这就是用户指南显示使用4095而不是4096的公式的原因。

    这实际上与我的想法相同。  实际上只有4095步距0、因此 V/位必须为0.000488400、对吗?

    这实际上是相同东西的不同表达式。 用户指南尝试说 TLV 数据标准化了2.0V、而我说的是、使用 TLV 数据校准后、您可以得到一个标准化的 ADC 结果、即2.0V 基准电压。 在本例中、0xFFC 是原始数据、代表实际基准(我们不知道确切的电压)、而0xFD2是校准数据、代表低于"标准化2.0V 基准"的电压。

    我认为我的问题是 "低于"一词的含义。 根据我的上述理解、我们无法从 ADC 计数中确定一个准确的值、直到它使用校准因子标准化为2伏基准电压。  因此、无论基准是1.9503、1.98还是2.0097、TLV 校正因数都将调整为标准化的2.00伏基准、以便用户可以根据 ADC 计数确定电压。

     

     

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

    对于该步骤、您是对的。 您需要使用2.0V/4095进行电压阶跃。
    对于"欠"一词、很抱歉。 您的理解是正确的。 TLV 将1.95V-2V 基准电压精确标准化为2.0V。

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

    您好、Harry、

    非常感谢您迄今提供的帮助。  我标记为已修复我的问题。  

    如果我可以提出相关问题:

    您之前施加了1伏电压、结果为:

    2.0V 0x812 0x812 * 0x7F40/(2^15)* 0x7FF9/(2^15)+ 0 = 0x805 0x805 /4095 * 2.0 = 1.00269

    假设 2/4095 = 0.000488400伏/位

    那么、正确地说:

    计算的电压 1.00269
    施加的电压 1
    电压差 0.00269.
    伏/位 0.000488400
    位错误 5.507775
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Harry、

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

    尊敬的 T.SOS:

    很抱歉耽误你的回答。 我没有意识到您实际上发布了一个问题...

    对于我进行的测试、实际上我没有测量"1V"电压的精度。 因此、我建议您将数据表中显示的误差用作系统误差。 谈到您所做的计算、如果输入电压正好为1V、那么您的计算是正确的。

    如果您有进一步的问题、请告诉我。

    此致、

    哈里

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

    您好、Harry、

    从 e MSP430F5328数据表中:

    我们使用内部基准、fADC12CLK 为3、997、696 Hz、REFOUT = 1、Vcc 为2.5伏。  如果我使用 TLV 校正基准、偏移和增益误差、我们的精度是多少?  它只是积分和差分线性误差吗?  这是+3.7 LSB 到-2.7 LSB?   

    如果您认为我们应该、我可以就这个问题打开另一个主题。

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

    应用增益和偏移校准后、误差主要由 INL/DNL 决定。 但是、由于 INL/DNL 不相关、因此您无法直接对它们求和。 您可以为它们使用 RMS。 在本例中、最大值为 sqrt [1.7^2 + 2^2]= 2.6 LSB、最小值为-sqrt [1.7^2+1^2]=-2 LSB
    希望这会有所帮助。

    顺便说一下、如果您仍有其他主题、我建议您打开另一个主题、以便更好地跟踪。 谢谢。

    此致、
    哈里