【问题标题】:IQ math calculation智商数学计算
【发布时间】:2017-11-24 04:15:29
【问题描述】:

谁能解释下面的对话是如何工作的?

clarke1.As =_IQ15toIQ((AdcResult.ADCRESULT0<<3)-_IQ15(0.50))<<1;

Piccolo 设备具有 12 位 ADC 和 16 位 ADC 寄存器。 AdcResult.ADCRESULT 寄存器对于 Piccolo 设备是正确的;因此,测得的相电流值先左移三位转换成Q15格式(0到1.0),然后在减去偏移量后转换成交流量(±0.5)。最后,将其左移 1(乘以 2)以将测量的相电流归一化为 ± 1.0 pu。

我不明白。

【问题讨论】:

    标签: floating-point piccolo


    【解决方案1】:

    您发布的讨论假设了用户方面的几件事:

    1. 熟悉 ADC 测量电路。
    2. 熟悉 TI 的 IQMath 格式。

    我会尝试解释答案,但如果仍有不清楚的地方,请更详细地阅读上述两个。

    让我们假设您正在使用 piclo 控制器测量 +-10A 范围。 让我们考虑一下,您正在通过 ADC 上的信号调理电路测量 i = +5A。该信号调理电路将负责将 -10A 偏移到 0V 以及将 +10A 偏移到 3.3V。

    即+-10A 在 ADC 输入处缩放为 0-->3.3V,其中 0A 值在 ADC 处读取为 1.65V。

    也就是说,i = 5A 转换为 1.65V + (1.65/2)V = 2.475V

    等效的 12 位 ADC 计数为 = (4095*2.475V/3.3V) = 3071。 现在,正如您已经提到的,这个 12 位计数存储在一个 16 位寄存器中。 此外,正如已经提到的,这是正确的。 即数字存储如下 AdcResult.ADCRESULT0 = 0x0BFF;

    AdcResult.ADCRESULT0 : 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1

    现在,您需要将此数字转换为等效的 +-1 pu 值,以便进一步处理 FOC 或任何其他算法。这意味着,您需要将 ADC 结果乘以某个值,并且需要浮点结果。虽然这可以通过控制器直接实现,但仅乘法运算确实会消耗大量处理时间!为了加速此类运算,尤其是小数运算,德州仪器的 C28x 处理器在代码中使用 IQMath 格式。更多信息可在本文末尾的链接中找到。

    首先,将 16 位 ADC 结果“按原样”复制到 32 位累加器中。

    值:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1

    然后,将其转换为 IQ15 格式,其中最后 15 位表示小数部分,左对齐。因此,q 值为:

    Q值 = 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1

    这是错误的,因为前三位为零,我们的信息是从第四位开始存储的。因此,编码器将该值向左移动了 3 位以校正 Q 值。 因此,IQ15 值变为:

    ADCValue_Q15 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0

    Offset = 0.5 减去 2^(-1) 因此,Q 值为:

    偏移量_Q15:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    ADCResult_Q15 = ADCValue_Q15 - Offset_Q15

    ADCResult_Q15 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0

    这个值还是IQ15,换算成全局Q值,我猜应该是Q24。

    ADCResult_Q24 = 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0

    因为,这仅表示电流的一半幅度(由于符号位注意 +-),我们现在应该将其乘以 2。 这是由编码人员通过代码左移智能完成的!

    结果_Q24 = 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

    如果我只看 Q24 格式的上面第 9 位之后开始的 Q 值,我会在这里得到 pu 中 ADC 操作的结果:

    Q值 = 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

    转换成等值数,sign = 0, int_value = 0;

    ADC_Value_pu = 0*(2^(-1)) + 1*(2^(-2)) + 1*(2^(-3)) + 1*(2^(-4)) + 1*(2^(-5)) + 1*(2^(-6)) + 1*(2^(-7)) + 1*(2^(-8)) + 1*(2^( -9)) + 1*(2^(-10))

    ADC_Value_pu = 0.499;

    对于测量 +-10A 的 ADC,这是 5A 的等效 pu 表示。

    我希望能解释清楚。欲了解更多信息,请花一天时间通过以下链接了解 IQMath 格式: http://processors.wiki.ti.com/images/8/8c/IQMath_fixed_vs_floating.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2013-01-29
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多