本人从事电力电子产品的研发,使用的是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.总结
权威也不一定权威。
因篇幅问题不能全部显示,请点此查看更多更全内容