您发布的讨论假设了用户方面的几件事:
- 熟悉 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
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