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.

[参考译文] TMS570LS0232:尝试了解 MibADC 校准方案

Guru**** 2331900 points
Other Parts Discussed in Thread: TMS570LS0232, HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/595497/tms570ls0232-attempting-to-understand-the-mibadc-calibration-scheme

器件型号:TMS570LS0232
主题中讨论的其他器件:HALCOGEN

我通过查看 TMS570LS0232的 SPNU0603A 技术参考手册的第16节一直在研究校准和偏移误差校正序列 、可用的文档提出了很多问题:

(1) 在哪里可以找到要加载到 ADCALR 寄存器中的计算出的二进制补码误差校正值的公式(根据第16.7.1.2节)?

(2) 根据我所能知、这只是一个偏移校准值、没有实际的方法来计算和补偿增益误差。  是这样吗?

(3) 第16.7.1节描述了"嵌入式校准基准电压的转换"、但图16-11和16-13显示使用的基准电压为 ADREFHI / ADREFLO。  这是 TMS570LS0232上 与 VCCAD 和 VSSAD 的共享引脚。  这是否意味着该 IC 没有内部基准、因此校准能力有限?

(4) 我是否正确地说、即使使用偏移误差校准、我们在12位模式下也只会在整个工作温度范围内真正将偏移误差从+/-4LSB 提高到+/-2LSB?

(5)我也回答了以下问题:当采用偏移误差校准时、在12位模式下、差分非线性误差仅在整个工作温度范围内从+/-7 LSB 提高到+/-4LSB。

(6) 如 TMS570LS0232 技术参考手册的图16-12所示、计算中点值 D (cal)后、您应该如何使用该数字?  是表示线性误差项(即曲线误差项而非直线误差项)还是斜率误差项(在最大输入电压下、误差将是理想值的两倍)。

(7)如果偏移误差为负、您是否仅需要使用大于0的参考值进行校准。  换言之、如果 VRefLo 连接到 VSS、则不要自行使用(Bridge_en=1、Hilo=0)、因为实际偏移可能低至-4。  这将返回 ADC 结果0、导致错误的偏移计算?

谢谢

Jeff Cranmer

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

    您好 Jeff、

    希望我能为您提供一些答案。

    [引用 user="Jeffrey Cranmer"](1) 在哪里可以找到要加载到 ADCALR 寄存器中的计算出的二进制补码误差校正值的公式(根据第16.7.1.2节)?[/引用]

    二进制补码是对二进制数的标准操作。 在本例中、我们将处理12位值、因此假设偏移量为1个 ADC 计数或0b000000000001。 2的补码是值中所有位的反转、然后加上1。 或以下内容:

    修正值(VAL)= 0x001或0b000000000001

    ~VAL = 0b1111111110或0xFFE

    二进制补码 =~VAL_1或0b111111111111或0xFFF

    [引用 user="Jeffrey Cranmer"]2) 根据我可以得出的结果、这只是一个偏移校准值、没有计算和补偿增益误差的实用方法。  这是正确的吗?

    没错。

    [引用 USER="Jeffrey Cranmer "](3) 第16.7.1节描述了"嵌入式校准基准电压的转换"、但图16-11和16-13表明使用的基准电压是 ADREFHI / ADREFLO。  这是 TMS570LS0232上 与 VCCAD 和 VSSAD 的共享引脚。  这是否意味着该 IC 没有内部基准、因此校准能力有限?[/quot]

    该基准由外部引脚提供。 正确的是、没有内部基准电压。 是的、校准的有效程度存在限制。

    [引用用户="Jeffrey Cranmer "]

    (4) 我是否正确地说、即使使用偏移误差校准、我们在12位模式下也只会在整个工作温度范围内真正将偏移误差从+/-4LSB 提高到+/-2LSB?

    (5)我也回答了以下问题:当采用偏移误差校准时、在12位模式下、差分非线性误差仅在整个工作温度范围内从+/-7 LSB 提高到+/-4LSB。

    [/报价]

    是的、您回答正确。 这些规格包含在数据表 spns242a、表7-7 MibADC 在整个推荐运行条件范围内的运行特性中

    [引用用户="Jeffrey Cranmer "]

    (6) 如 TMS570LS0232 技术参考手册的图16-12所示、计算中点值 D (cal)后、您应该如何使用该数字?  是表示线性误差项(即曲线误差项而非直线误差项)还是斜率误差项(在最大输入电压下、误差将是理想值的两倍)。

    [/报价]

    差分中点计算可用作另一个完整性检查或另一个校准点、以间接确定 ADREFLO 和 HI 上的范围在预期值内。 即、如果您看到中点的变化超过可接受的水平、您可以采取行动。 否则、它只是另一个参考点。

    [引用用户="Jeffrey Cranmer "]

    (7)如果偏移误差为负、您是否仅需要使用大于0的参考值进行校准。  换言之、如果 VRefLo 连接到 VSS、则不要自行使用(Bridge_en=1、Hilo=0)、因为实际偏移可能低至-4。  这将返回 ADC 结果0、导致错误的偏移计算?

    [/报价]

    否 如果误差偏移为负、则产生的偏移可能为负、这将导致 ADC 读数为负。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Chuck、尽管我认为您可能误解了我的第一个问题。

    我理解二进制补码编号的理论。 我试图理解参考手册第16.7.1.2节中所述的校准方法。

    表16-2列出了四种不同的校准开关模式(即 CAL_EN = 1)。 其中的前两个、BRIDGE_EN=0、提供基于由 R1和 R2内部电阻器形成的分压器的基准电压输入。 当 BRIDGE_EN = 1时、第二对只需应用 ADRefLO 和 ADRefHi。

    在第16.7.1.2节中、该过程建议您捕获部分、可能所有这些电压、然后使用生成的值推断校准偏移误差校正值、该值随后加载到 ADCALCR 中。 它是我尝试得到的这个公式。

    目的是仅将 BRIDGE_EN = 1的这两个值用于偏移校准、而 BRIDGE_EN = 0的这两个值用于计算偏移电压吗? 如果正确、您是否使用两个数字来确定失调电压、或者是否忽略返回最大或最小可转换数的值并使用另一个值计算失调电压校准?

    更深入地研究这一点、ADCALR 寄存器似乎是11位加上一个符号。 这意味着校准功能仅在11位 ADC 转换精度上工作。 这种理解是否正确?
    请告知以下示例是否正确显示了校准程序?

    例如、假设 ADC 上的实际硬件偏移电压为-4 (12位)。 在此示例中、5LSB 的输入电压将返回原始的未补偿转换值1。 您需要应用4 x 12位 LSB 的正偏移调整来补偿此偏移。
    设置 BRIDGE_EN = 0和 Hilo = 0 (ADREFLO 已应用)、ADCALR 寄存器中返回的值将需要为-2 (11位+符号)。 ADC 无法转换低于 ADREFLO 的电压、因此实际返回的结果将为0。
    设置 BRIDGE_EN = 0和 Hilo = 1 (应用了 ADREFHI)、ADCALR 寄存器返回的值将为2045 (11位+符号)。 我们可以使用此结果来计算实际的11位偏移为2045- 2047 =-2。 然后、我们必须将这个数字乘以-2、以获得正确的12位偏移值(+4)、从而写入 ADCALR 寄存器并用于进一步的计算。

    最后、由于 ADC 测量值(在 FIFO 的12 EV_DR 位中返回)受限于限制0和4095、因此意味着任何应用的 ADC 偏移补偿都会将可用的 ADC 范围减小补偿变量的幅度。 即、对于上面给出的示例、
    (1)任何高于 ADREFLO 的低于4LSB 的输入电压将在应用偏移补偿后返回值4、和
    (2)任何原始转换为4091或更高值的输入电压(即 ADREFHI 或更高值的输入电压)在补偿后将返回4095的值。

    这种理解是否正确?

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

    Chuck -请您回答我5月16日的问题吗?

    谢谢

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

    您好 Jeff、

    我对我的答复拖延表示歉意。 为了处理另一项紧急请求、我被从我的活动中抽出了几天。

    [引用用户="Jeffrey Cranmer "]
    我理解二进制补码编号的理论。 我试图理解参考手册第16.7.1.2节中所述的校准方法。

    [/报价]

    这里的理论是、您通过 R1和 R2的不同组合执行转换、使结果与中点([ADREFHI-ADREFLO]/2)等距。 获得所有测试结果后、 然后、您可以通过取平均值来确定实际中点、因为 R1和 R2之间的关系将是一个一致的比率、从而消除半导体工艺导致实际 R1和 R2电阻变化的误差。 当真正的中点已知时、您只需计算理论中点(0xFFF/2 = 0x7FF)与实际中点之间的差值、即可得到要写入 ADCALR 寄存器的偏移量。 一旦写入 ADCALR 寄存器、就会应用该偏移量(添加到后续的每次转换中)。

    检查 Halcogen 生成的 adcCalibration 函数有助于更简洁地演示该过程。

    for (loop_index=0U;loop_index<4U;loop_index++)
    {
    /*禁用自检和校准模式*/
    ADC->CALCR=0x0U;
    
    switch (loop_index)
    {
    判例0U://*测试1:新娘= 0,Hilo =0 */
    ADC->CALCR=0x0U;
    中断;
    
    案例1U://测试1:新娘= 0,Hilo =1 */
    ADC->CALCR=0x0100U;
    中断;
    
    案例2U://测试1:新娘= 1,Hilo =0 */
    ADC->CALCR=0x0200U;
    中断;
    
    案例3U:/*测试1:新娘= 1,希洛=1 */
    ADC->CALCR=0x0300U;
    中断;
    默认值:
    中断;
    }
    
    /*启用校准模式*/
    ADC->CALCR|=0x1U;
    
    /*开始校准转换*/
    ADC->CALCR|=0x00010000U;
    
    /*等待校准转换完成*/
    /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
    while ((ADC->CALCR & 0x00010000U)=0x00010000U)
    {
    } /*等待*/
    
    /*读取转换后的值*/
    conv_val[LOOP_index]= adc->cLR;
    }
    
    /*禁用自检和校准模式*/
    ADC->CALCR=0x0U;
    
    /*计算偏移误差校正值*/
    conv_val [4U]=conv_val [0U]+ conv_val [1U]+ conv_val [2U]+ conv_val [3U];
    
    conv_val [4U]=(conv_val [4U]/4U);
    
    offset_error=conv_val[4U]-0x7FFU;
    
    /*将偏移误差写入校准寄存器*/
    /*将计算值的2;s 补码加载到 ADCALR 寄存器*/
    offset_error=~offset_error;
    offset_error=offset_error & 0xFFFU;
    offset_error=offset_error+1U;
    
    ADC->CALR = OFFSET_ERROR; 

    [引用 USER="Jeffrey Cranmer ]'目的是仅将 BRIDGE_EN = 1的这两个值用于偏移校准、并将 BRIDGE_EN = 0的两个值用于计算偏移电压? 如果为真、您是否使用两个数字来确定失调电压、或者是否忽略返回最大或最小可转换数的值、并使用另一个值来计算失调电压校准?

    通常、如驱动程序代码所示、可以使用所有4种模式。 但是、鉴于 ADREFHI 和 ADRELO 这两种模式会导致中点计算的数据点数现在为4、这两种模式肯定有助于确定 ADC 结果的斜率。 如果您考虑将 ADREFLO 和 ADREFHI 的影响合并到 ADC 范围尾端的误差、则偏移将是整个范围内的平均偏移。 如果大部分转换都在中值范围内、那么谨慎的做法是只包括 D (CAL1)和 D (CAL2)值来确定偏移并提供一个甜蜜的工作点。

    [引用 USER="Jeffrey Cranmer ]深入研究这一点、ADCALR 寄存器似乎是11位加上一个符号。 这意味着校准功能仅在11位 ADC 转换精度上工作。 这种理解是否正确? [/报价]

    校准始终相对于中点、因此偏移不能超过0x7FF 或 ADC 全范围的一半(即、取决于12位或10位分辨率的工作模式)。 这意味着11位+符号位就足够了。

    [引用 user="Jeffrey Cranmer">设置 BRIDGE_EN = 0和 Hilo = 0 (应用了 ADREFLO)、ADCALR 寄存器中返回的值需要为-2 (11位+符号)。 ADC 无法转换低于 ADREFLO 的电压、因此实际返回的结果将为0。[/报价]

    当 BRIDGE_EN = 0且 Hilo = 0时、Vcal1 ADC 电压将为(ADREFHI×R1 + ADREFLO×R2)/(R1 + R2)。 这将如何返回-2值? 请记住、在启用校准期间、ADCALR 寄存器用于存储校准会话的 ADC 转换结果。 即、您将执行此步骤并从 ADCALR 寄存器中检索计数、将其移动到 RAM (D (CAL1)中的中间存储位置。 在 BRIDGE_EN=0和 Hilo =1时运行、从 ADCALR 读取结果并存储(D (CAL2)。 使用公式(D (CAL1)+D (CAL2))/2来计算实际中点、然后通过获取 D (avg)- 0x7FF =偏移值来计算偏移、该偏移值将在退出校准模式后写入 ADCALR。

    [引用 user="Jeffrey Cranmer">最后、由于 ADC 测量值(返回到 FIFO 的12 EV_DR 位中)受限值0和4095、因此所产生的影响是、任何应用的 ADC 偏移补偿都会使可用的 ADC 范围减小补偿变量的幅度。 即、对于上面给出的示例、
    (1)任何高于 ADREFLO 的低于4LSB 的输入电压将在应用偏移补偿后返回值4、和
    (2)任何原始转换为值4091或更高的输入电压(即 ADREFHI 或更高的输入电压)在补偿后将返回值4095。[/引用]

    正确的做法是、偏移会导致结果饱和到0x000或0xFFF。 考虑到 ADC 的性质和偏移的用途、这将是所施加电压的准确表示。 应用/系统设计还应 注意到这是一个有问题的结果、因为饱和结果是一个有问题的结果、因为您无法确定结果饱和的程度。 即、如果 ADREFHI = 5V、5.1V 上的转换将饱和、10V 上的转换也会饱和、但后者可能会永久损坏器件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对字体问题表示歉意。 从另一个文档粘贴公式后无法更正。 如果阅读有任何困难、请告诉我、我将重新发布。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Chuck、

    这很有帮助。  一个后续问题。  我在倒数第二个问题中出错了。  它应该读取 BRIDGE_EN =1、而不是 BRIDGE_EN=0

    "设置 BRIDGE_EN = 1且 Hilo = 0 (ADREFLO 已应用)、ADCALR 寄存器中返回的值需要为-2 (11位+符号)。 ADC 无法转换低于 ADREFLO 的电压、因此实际返回的结果将为0。"

    这种理解是否正确? 如果是这样、这个结果似乎将一个饱和测量误差注入到代码示例中给出的4个值计算中。  

    我猜的是、由于该误差最多为4LSB、因此4个不同测量值中误差的平均影响足够小、通常 会在校准计算中仅产生1LSB 的误差、因此其影响会得到折扣?

    例如、原始偏移= 4。

    饱和计算、假设 R1和 R2已完全修整:

    偏移= AVG (-2047、2044、-48、40)=-2.75、大约 3.

    不饱和计算:

    偏移= AVG (-2051、2044、-48、40)=-3.75、大约 4.

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

    因此、在您的示例中、基准电压将为 ADREFLO、如 TRM 中所述。 如果 ADREFLO 为负、这将导致电压超出 ADC 的指定限制、并且它将在低端返回一个0x000的饱和结果。也就是说、是的、ADC 计数的下限为0x000是正确的。

    此外、请注意、在示例计算中、您假设存在偏移并获取偏移的平均值。 在某种程度上、我认为这可能起作用、但必须了解、校准启用时存储在 ADCALR 字段中的值不是偏移。 存储的值将是电阻器网络上电压的原始 ADC 计数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我看到我在哪里做了一些更改。

    您提供的示例代码在 ADCALR=0应用于这些值的情况下进行四次测量(有效地进行原始的、未补偿的测量)。

    然后、将这些测量值相加并除以4、以获得一个如所示的数字

    1. 您需要补偿的实际 ADC 偏移为0、和
    2. 模数转换的线性度非常完美、

    最终结果将为 Avg (0、4095、2047、2047)。  从该数字中减去 Subract 2047、得到0的最终偏移

    我的示例提供了一个案例、其中补偿前的偏移 量为4、但我在求平均值之前补偿了每个单独的值、而不是从答案中减去补偿项、

    但是、我认为修改它不会改变答案:

    饱和时:偏移= AVG (0、4091、1999、2087)- 2047 =-2.75、大约 3.

    补偿 ADC 饱和:偏移= AVG (-4、4091、1999、2087)- 2047 =-3.75、大约4

    我想我现在理解这个方案。  您能否确认这种理解是否正确?

    感谢您的帮助。

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

    尊敬的 Jeff:

    是的、这种解释是正确的。