您发布的讨论在用户方面假设了几件事:
- 熟悉ADC测量电路。
- 熟悉 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
减去偏移量 = 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 格式的 Q 值,它在上面的第 9 位之后开始,我会在这里得到 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