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.

请问28335中float型数据能和IQ值直接进行比较或者加减运算吗?

    我从28035移植了一个程序到28335,现在修改编译通过了,程序里有些地方是float浮点值和IQ值直接进行比较或者运算的,请问在28335里我可以直接这样用吗?

    非常希望能得到回复,不胜感激!

  • 是不行的,两种数据格式不一样,IQ实际上是实际数据乘以2^Q次方的整型数据。
    比如_IQ(1.0), 实际在MCU中的数据是 1.0×2^24 (GLOBAL_Q = 24)这个值和float类型的 1.0还是差很多很多的。

    可以用IQtoF(iq)来将IQ值转换为float 值,或者直接 _IQ(float),把float 转换成IQ
  • 非常感谢您的回复,现在明白了,但是还有一点疑问想要问您一下。
    之前书写的电机程序中出现了这样的情况,是能够正常运行且可以正常控制电机运转的,如下:
    定义:
    float IA, IB, IC, IBus, UBus, ITest;
    采样中IA,IB,IC也都为浮点型的值:
    IA = -((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2;//((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;
    IB = -((AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2;
    IC = -IA - IB;
    但是在闭环时浮点型的电流值直接赋值给了iq格式的clarke模块中:
    clarke1.As=IA;
    clarke1.Bs=IB;
    clarke1.Cs=IC;
    clarke模块的定义如下:
    typedef struct { _iq As; // Input: phase-a stator variable
    _iq Bs; // Input: phase-b stator variable
    _iq Cs; // Input: phase-c stator variable
    _iq Alpha; // Output: stationary d-axis stator variable
    _iq Beta; // Output: stationary q-axis stator variable
    } CLARKE;

    这个电机控制的程序是可以正常运行的,已经是实验验证过的,能麻烦您再帮忙解答一下这个问题吗?这个地方与我说的iq值与float值的加减乘除或者比较的运算有什么不同之处?

    希望能得到您的解答,不胜感激!
  • ADCRESULT的结果是一个0~4096的值,因为ADC是12位的,所以ADCRESULT结果可以理解为一个0~1.0的值用Q12的Q制表示的数据。

    因此

    比如一个ADCRESULT = 4096的采样值,用你的式子处理后可以理解成

    IA = -((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2 = -(1.0*2^12)*0.00024414-offsetA)*2, 只要你的offsetA也是一个0~4096的数据,那么整个算式算出的结果是一个Q12的Q制数据。

    后面用在CLARK变换以及控制里面的值,一般默认GLOBAL_Q是24,因此后面的计算是将一个Q12的值,当作Q24来用了,所有数据都是差了一个比例系数,2^12,会产生一些绝对误差,但不会影响稳定性,只会影响带宽和动态特性。因此你的电机是可以转的,但PU数据和实际物理意义的值对不上。

    比如你想设置最大允许输出电流,那么限制速度环输出的最大值,那么这个值就会是错的。

  • 您好,感谢您的回答!
    现在的offset是定义的iq格式的,默认应该是iq24的格式,定义如下:
    _iq offsetA=_IQ(0.5); //-----
    _iq offsetB=_IQ(0.5);
    _iq offsetC=_IQ(0.5);
    是这样的话,是不是IA,IB,IC就是默认的iq24的格式了?这样就可以与模块的数据相对应了?
    然后我如果直接用IQ格式数据和float格式直接进行运算的话是不被允许的对吗?

    祝好!
  • 而且这个offset偏置的计算是通过28335例程里以下式子红色部分计算的:

       if (IsrTicker>=5000)

        {

        #ifdef DSP2833x_DEVICE_H

        offsetA= K1*offsetA + K2*(AdcMirror.ADCRESULT1)*0.00024414; //Phase A offset

        offsetB= K1*offsetB + K2*(AdcMirror.ADCRESULT2)*0.00024414; //Phase B offset

        offsetC= K1*offsetC + K2*(AdcMirror.ADCRESULT3)*0.00024414; ; //Phase C offset

        #endif

        #ifdef DSP2803x_DEVICE_H

        offsetA= _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)); //Phase A offset

        offsetB= _IQmpy(K1,offsetB)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT2)); //Phase B offset

        offsetC= _IQmpy(K1,offsetC)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT3)); //Phase C offset

        #endif

        }

    K1和K2也是iq格式的,定义如下:

    _iq K1=_IQ(0.998); //Offset filter coefficient K1: 0.05/(T+0.05);
    _iq K2=_IQ(0.001999); //Offset filter coefficient K2: T/(T+0.05);

  • 这类问题你可以自己推倒一下啊,K1 = _IQ(0.998) = 0.998*2^24,
    offsetA = _IQmpy(K1,offsetA)+_IQmpy(K2,_IQ12toIQ(AdcResult.ADCRESULT1)) =( 0.998*2^24*offsetAfloat*2^24)/2^24 + 0.001999*2^24*Resultfloat*2^24/2^24.

    要理解归一化的原理思想和定标的原理思想就容易理解了。
    所谓Q制就是将float数据乘以相应的2^N来变化为整型。
    两个Q24的数值相乘,A*2^24*B*2^24 = A*B*2^48,所以如果想结果仍然是Q24则需要再除以一个2^24。IQmath就是把这些定标的移位计算封装起来给大家使用而已,也可以不用IQmath而直接自己用移位的办法自己写。
  • 您好 ,感谢您的回复,我懂得一些了,还是想问一下就是,像您上面提到了
    “比如一个ADCRESULT = 4096的采样值,用你的式子处理后可以理解成

    IA = -((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2 = -(1.0*2^12)*0.00024414-offsetA)*2, 只要你的offsetA也是一个0~4096的数据,那么整个算式算出的结果是一个Q12的Q制数据。”

    现在程序里的offset的定义是默认IQ24值格式,不是0-4096的整型,定义如下面所示:
    _iq offsetA=_IQ(0.5); //-----
    _iq offsetB=_IQ(0.5);
    _iq offsetC=_IQ(0.5);
    我的IA,IB,IC定义时都是默认IQ24格式值时,在调试程序时显示依然是float型浮点数,这是不是代表着两种不同的类型进行运算结果是float浮点型呢?
    在这种情况下我是把IA的结果当做IQ12格式还是IQ24格式来运算?
  • 我想问一下,如果不使用IQmath库,直接把变量类型定义为float or double ,不能实现浮点数的加、减、乘除运算吗?例如float a=1.2222222;b=3.5555;double c=0; c=a*b;
    使用IQmath 有什么好处?
  • 你弄明白这个问题了么,我最近也是在使用28335的板子在写IQ格式的程序,但是28335是浮点计算为主的,在使用过程中我遇到了很多问题,解决不了,可以加下好友么,讨论一下这个问题,我的QQ1224201162

x 出现错误。请重试或与管理员联系。