TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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

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

Igor An:是不行的,两种数据格式不一样,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

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

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

user4884320:

回复 Igor An:

非常感谢您的回复,现在明白了,但是还有一点疑问想要问您一下。
之前书写的电机程序中出现了这样的情况,是能够正常运行且可以正常控制电机运转的,如下:
定义: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 {_iqAs;// Input: phase-a stator variable_iqBs;// Input: phase-b stator variable_iqCs;// Input: phase-c stator variable_iqAlpha;// Output: stationary d-axis stator variable _iqBeta;// Output: stationary q-axis stator variable} CLARKE;

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

希望能得到您的解答,不胜感激!

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

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

Igor An:

回复 user4884320:

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数据和实际物理意义的值对不上。

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

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

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

user4884320:

回复 Igor An:

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

祝好!

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

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

user4884320:

回复 Igor An:

而且这个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);

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

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

user4884320:

回复 Igor An:

您好 ,感谢您的回复,我懂得一些了,还是想问一下就是,像您上面提到了
“比如一个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格式来运算?

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

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

user4329368:

回复 Igor An:

我想问一下,如果不使用IQmath库,直接把变量类型定义为float or double,不能实现浮点数的加、减、乘除运算吗?例如floata=1.2222222;b=3.5555;double c=0;c=a*b;
使用IQmath 有什么好处?

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

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

user5178791:

回复 user4884320:

你弄明白这个问题了么,我最近也是在使用28335的板子在写IQ格式的程序,但是28335是浮点计算为主的,在使用过程中我遇到了很多问题,解决不了,可以加下好友么,讨论一下这个问题,我的QQ1224201162

赞(0)
未经允许不得转载:TI中文支持网 » 请问28335中float型数据能和IQ值直接进行比较或者加减运算吗?
分享到: 更多 (0)