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.

2812-pmsm程序咨询

专家,您好:

        有个事情不懂,想请教您一下。

        在TI公司提供的2812矢量控制例程pmsm3_1中,为什么CLARKE变换,需要_IQ15toIQ转换呢,多谢!

  • xiaoyuan,

    请把具体的代码或注释贴上来。另外,你也可以查看相应的文档,比如motor lib关于FOC算法中应用到的宏模块的说明。这么转换的话应该是前后模块数据格式的匹配。

    Eric

  • Hi xiaoyuan,

    ADC转换的结果是Q15格式的,CLARK变换的计算以及后面的一些计算是Global Q格式,所以需要把Q15转成Global Q才能参与运算。

    Regards,

    Jay

  • 多谢您!

    clarke1.As = _IQ15toIQ((int32)ilg2_vdc1.ImeasA);//将AD采集值,进行CLARKE变换

    clarke1.Bs = _IQ15toIQ((int32)ilg2_vdc1.ImeasB);

    clarke1.calc(&clarke1);

    就是这段代码。

  • 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

  • 很感谢专家您的回复!

    那下面这句是出于什么原因考虑的呢,Q28格式在这个例程中,具有什么优势吗,再次感谢!

    Tmp = (int32)p->ImeasAGain*(int32)DatQ15;

  • Hi Xiaoyuan,

    这句不是说Q28有什么优势,而仅仅是因为Q13和Q15相乘后的结果就是Q28的。

    Q28格式的数需要32位整型来储存,所以Tmp是int32类型的。

    Regards,

    Jay

  • 感谢您的回复!

    Q28格式为什么需要32位整型来储存?另_IQ28范围:-8 ~ 7.999 999 996与这个是什么关系呢,多谢!

  • Hi Xiaoyuan,

    Q28格式,至少要用29位的数来储存,但没有29位这样的数据类型,所以就用32位整型数来储存了。

    Regards,

    Jay

  • 感谢您的回复!但是,很抱歉我还是没懂,为什么Q28需要29位存储,这个是怎么推出来的,多谢!

  • Hi Xiaoyuan,

    建议你学习一下Q格式的基本知识。

    Regards,

    Jay

  • 你好Jay ADC结果送到下一模块,范围是(-1,1),如果我的电机额定电流是1.75A,我的增益该怎样选,是1.75A对应IQ(1)吗? Regards, daiyingguilai