您的当前位置:首页正文

ARM CMSIS DSP arm_sin_cos_f32 bug

2023-03-10 来源:客趣旅游网
ARMCMSISDSP库函数arm_sin_cos_f32的BUG王强2016-05-10

本人从事电力电子产品的研发,使用的是STM32F4系列的CPU,带浮点运行,进行park变换或逆变换的时候,需要用到sin和cos,为了方便就采用了arm_sin_cos_f32这个函数。本文为原创,未经作者允许不得转载。1.BUG发现

输出的电流会突然出现一个很大负向电流,已经在PC上通过C语言仿真,不会出现算法上的错误,把问题定位到角度到了,因为角度是反馈算出来的,可能会出问题,通过打印却看到sin和cos的值不在-1到1范围,判定是arm_sin_cos_f32这个函数造成的,并不是角度异常造成的,而且角度值为-720度。2.源代码分析

遇到上面的问题后,在ARMCMSIS官网上下载了源代码,找到arm_sin_cos_f32这个函数的源代码如下:voidarm_sin_cos_f32(float32_ttheta,float32_t*pSinVal,float32_t*pCosVal){

float32_tfract,in;output*/

uint16_tindexS,indexC;float32_tf1,f2,d1,d2;int32_tn;

float32_tfindex,Dn,Df,temp;/*inputxisindegrees*/

/*Scaletheinput,divideinputby360,forcosineadd0.25(pi/2)toreadsinetable*/

in=theta*0.00277777777778f;/*Calculationoffloorvalueofinput*/n=(int32_t)in;

/*Indexvariable*/

/*Twonearestoutputvalues*//*Temporaryvariablesforinput,

/*Makenegativevaluestowards-infinity*/if(in<0.0f){n--;}

/*Mapinputvalueto[01]*/in=in-(float32_t)n;

/*Calculationofindexofthetable*/

findex=(float32_t)FAST_MATH_TABLE_SIZE*in;indexS=((uint16_t)findex)&0x1ff;

indexC=(indexS+(FAST_MATH_TABLE_SIZE/4))&0x1ff;/*fractionalvaluecalculation*/fract=findex-(float32_t)indexS;

/*Readtwonearestvaluesofinputvaluefromthecos&sintables*/f1=sinTable_f32[indexC+0];f2=sinTable_f32[indexC+1];d1=-sinTable_f32[indexS+0];d2=-sinTable_f32[indexS+1];

Dn=0.0122718463030f;//deltabetweenthetwopoints(fixed),inthiscase2*pi/FAST_MATH_TABLE_SIZE

Df=f2-f1;//deltabetweenthevaluesofthefunctionstemp=Dn*(d1+d2)-2*Df;

temp=fract*temp+(3*Df-(d2+2*d1)*Dn);temp=fract*temp+d1*Dn;/*Calculationofcosinevalue*/*pCosVal=fract*temp+f1;

/*Readtwonearestvaluesofinputvaluefromthecos&sintables*/f1=sinTable_f32[indexS+0];f2=sinTable_f32[indexS+1];d1=sinTable_f32[indexC+0];d2=sinTable_f32[indexC+1];

Df=f2-f1;//deltabetweenthevaluesofthefunctionstemp=Dn*(d1+d2)-2*Df;

temp=fract*temp+(3*Df-(d2+2*d1)*Dn);temp=fract*temp+d1*Dn;/*Calculationofsinevalue*/*pSinVal=fract*temp+f1;}

当theta=-720时,in=1,findex=512.0,indexS=0,fract=512。

上面的函数采用的方法是线性插值的方法,所以fract应该只在0到1,所以产生了上面的BUG。3.对应方法

Arm_sin_cos_f32这个函数的输入范围是-180到180,但官网上也写了,如果超出这个范围,函数将自动调整回来,所以我的代码中没有对输入范围有限制,比较在-720度时出现了这个问题,仔细分析代码,如果在-180到180之间是不会出问题的。那么解决方法就是将输入限制在-180到180之间就可以了。4.总结

权威也不一定权威。

因篇幅问题不能全部显示,请点此查看更多更全内容