专家,您好:
有个事情不懂,想请教您一下。
在TI公司提供的2812矢量控制例程pmsm3_1中,为什么CLARKE变换,需要_IQ15toIQ转换呢,多谢!
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.
专家,您好:
有个事情不懂,想请教您一下。
在TI公司提供的2812矢量控制例程pmsm3_1中,为什么CLARKE变换,需要_IQ15toIQ转换呢,多谢!
int16 DatQ15;
int32 Tmp;
// Wait until ADC conversion is completed
while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)
{};
DatQ15 = AdcRegs.ADCRESULT0^0x8000; // Convert raw result to Q15 (bipolar signal)
Tmp = (int32)p->ImeasAGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->ImeasA = (int16)(Tmp>>13); // Convert Q28 to Q15
p->ImeasA += p->ImeasAOffset; // Add offset
p->ImeasA *= -1; // Positive direction, current flows to motor
DatQ15 = AdcRegs.ADCRESULT1^0x8000; // Convert raw result to Q15 (bipolar signal)
Tmp = (int32)p->ImeasBGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->ImeasB = (int16)(Tmp>>13); // Convert Q28 to Q15
p->ImeasB += p->ImeasBOffset; // Add offset
p->ImeasB *= -1; // Positive direction, current flows to motor
DatQ15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF; // Convert raw result to Q15 (unipolar signal)
Tmp = (int32)p->VdcMeasGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
if (Tmp > 0x0FFFFFFF) // Limit Tmp to 1.0 in Q28
Tmp = 0x0FFFFFFF;
p->VdcMeas = (int16)(Tmp>>13); // Convert Q28 to Q15
p->VdcMeas += p->VdcMeasOffset; // Add offset
p->ImeasC = -(p->ImeasA + p->ImeasB); // Compute phase-c current
AdcRegs.ADCTRL2.all |= 0x4040; // Reset the sequence
这段是AD代码,进行数据转换的原因是什么,多谢您!
Hi Xiaoyuan,
可以看到,ADC的结果在中间计算过程中会有Q28格式的数据,但最后需要加上的offset偏移量是Q15格式的,需要把ADC结果多Q28变回来。
ADC结果归一化计算后,要求其范围为-1~1,C28最小的数据类型16位整型,用Q15格式正好可以表示-1~1的浮点数。
Global Q是可以根据用户的需要,可以自由选择的,不一定是Q15,也不一定是Q28,所以需要转换。
Regards,
Jay
Hi Xiaoyuan,
这句不是说Q28有什么优势,而仅仅是因为Q13和Q15相乘后的结果就是Q28的。
Q28格式的数需要32位整型来储存,所以Tmp是int32类型的。
Regards,
Jay