Математический расчет IQ
Может кто-нибудь объяснить, как работает ниже разговор?
clarke1.As =_IQ15toIQ((AdcResult.ADCRESULT0<<3)-_IQ15(0.50))<<1;
Устройства Piccolo имеют 12-разрядный АЦП и 16-разрядный регистр АЦП. AdcResult.ADCRESULT
регистры являются правильными для устройств Piccolo; следовательно, измеренное значение тока фазы сначала сдвигается влево на три для преобразования в формат Q15 (от 0 до 1,0), а затем преобразуется в величину переменного тока (± 0,5) после вычитания смещения. Наконец, его смещают влево на единицу (умножают на два), чтобы нормализовать измеренный ток фазы до ± 1,0 п.н.
Я не понимаю этого.
1 ответ
Обсуждение, которое вы разместили, предполагало несколько вещей на стороне пользователя:
- Знакомство с схемами измерения АЦП.
- Знакомство с форматами IQMath от TI.
Я бы попытался объяснить ответ, но в случае, если что-то все еще неясно, пожалуйста, пройдите два выше более подробно.
Давайте предположим, что вы измеряете диапазон +-10A с помощью контроллера picollo. И давайте рассмотрим, что вы измеряете i = +5A через схему формирования сигнала на АЦП. Эта схема формирования сигнала позаботится о смещении от -10 А до 0 В и от +10 А до 3,3 В.
то есть +-10A масштабируется до 0 ->3,3 В на входе АЦП, где значение 0A читается как 1,65 В на АЦП.
Это означает, что i = 5A преобразуется в 1,65 В + (1,65/2)V = 2,475 В
Эквивалентный 12-разрядный счетчик АЦП будет = (4095*2,475 В /3,3 В) = 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 или любого другого алгоритма. Это означает, что вам нужно умножить результат АЦП на какое-то значение, и вам потребуется результат с плавающей запятой. В то время как это возможно непосредственно контроллером, одна операция умножения действительно занимает много времени обработки! Для ускорения таких операций, особенно для дробных чисел, процессоры Texas Instruments C28x используют формат IQMath внутри кода. Подробнее об этом можно прочитать по ссылке в конце этого поста.
Во-первых, результат 16-разрядного АЦП копируется в 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 будет:
Offset_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. Что делается кодером с помощью левого смещения в коде!
Result_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
Если я только посмотрю на значение Q, которое начинается после вышеприведенного бита 9 в формате Q24, я получу результат операции АЦП в pu здесь:
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;
Что является эквивалентным значением pu 5А для АЦП, измеряющего + -10А.
Я надеюсь, что это объяснило. Для получения дополнительной информации, пожалуйста, потратьте один день на понимание формата IQMath по следующей ссылке: http://processors.wiki.ti.com/images/8/8c/IQMath_fixed_vs_floating.pdf