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.
我从28035移植了一个程序到28335,现在修改编译通过了,程序里有些地方是float浮点值和IQ值直接进行比较或者运算的,请问在28335里我可以直接这样用吗?
非常希望能得到回复,不胜感激!
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偏置的计算是通过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);
你弄明白这个问题了么,我最近也是在使用28335的板子在写IQ格式的程序,但是28335是浮点计算为主的,在使用过程中我遇到了很多问题,解决不了,可以加下好友么,讨论一下这个问题,我的QQ1224201162