关于DSP的一些反正切查表算法的编写一直在拿TMS20F28335做电机控制,也从早前的简单寄存器IO口配置时代过渡到了真正的算法时代,很不适应,起初去查各种书籍,网上搜索各种网站,发现书本上讲的很多都是快速傅里叶啊啥的,找不到很原始的像啥低通滤波器,正弦,正切这些函数的编写。起初写程序发现,C2000的库里支持啥正弦函数,浮点预算,反正弦函数,开根运算等算法,好兴奋。用了才知道,太慢了,根本没法用在工程上。关于三角函数的编写,其实都是利用查表发,查表法大家应该都懂。这个就不再赘述,怎样去查一个正弦表呢?这里做一个基本的介绍。首先,你可以自己写一个查表数组,也可以在程序初始化生成一个。Eg:voidSinCOS_TAB(void){unsignedchari;floatTheta;for(i=0;iTAB_Max;i++)//#defineTAB_Max180{Theta=i*Step_Angle;//Step_Angle=1.74532925E-02Sin_tab[i]=sin(Theta);//生成正弦表数组,利用了库里现成的SIN函数Cos_tab[i]=cos(Theta);//生成余弦表数组}}为啥我的数组里面只有180个元素呢?一:我的精度要求不高,我是一度一个步进角的,如果你要更高的精度,你可以选择容量更大的数组。二:我不想因为庞大的浮点数组占据太大的存储空间,所以我利用了奇函数,偶函数的原理再次,就进入正题写查表程序,就我们初中数学所知,正弦函数是奇函数,余弦函数是偶函数,所以我只用了360角度中的一半。下面为正弦查表程序:/*RefertothetruththatDSPusesomeSinCosoperationwillusesixormorecommand*periods,SoIlookupthepre_generateSINCOS_TABtospeeduptheExecutionspeed*/floatSinF(floatsingle){inti=(int)(single*180/pi);floatvalue=0;if(i0)value=-Sin_tab[i];elsevalue=Sin_tab[i];returnvalue;}看起来应该很简单吧,余弦,正切,余切的编写和上面基本相似。下面来探讨一下反正弦,反正切函数的编写我在网上查了一下,运用函数库的反正弦,正切指令计算一个至少需要400以上各时钟周期,网上也有很多方法,看了有些能看懂,但大多看了头疼。自己呢,还是从正切函数的曲线出手,利用单调递增写了一个查表函数,已在MATLAB上实验过。一次函数线性逼近正弦函数这是我算法在MATLAB上面实验的程序:functionsingle=tanflook(a)%UNTITLEDSummaryofthisfunctiongoeshere%Detailedexplanationgoeshereglobaltheta;%globalsingle;globalActan_tab;globalx;globalres;theta=-90:90;theta=theta*3.141596/360;Actan_tab=1000*tan(theta);piz=input('theZscaleis:');y=input('theYscaleis:');a=(z+y=0);ab=(z-y=0);bif((a==b))single=z/y;elsesingle=y/z;endtab=fix(single*99-8)+90;tabcomp=fix(single*1000);fori=tab:181if(comp=Actan_tab(i))&&(compActan_tab(i+1))break;%else%i=i+1;endendic=(i90);csingle=(i-90)/360*pi;x=2*b+a;%x=2;switchxcase0single=-pi/2-single;%break;%case0:single=single;break;case1;%break;case2single=pi+single-2*pi*c;%break;case3single=pi/2-single;%break;endxdisp('thesinglevalueis');disp(180*single/3.141596);End讲讲原理吧,感觉还是有点东西,还是从那个一次函数线性逼近正弦函数的地方说起,为什么要这样了,因为我们从图上可见发觉,每一个正弦值其实都在某段线性函数包围之间,我们已知了正切值,利用正切函数的线性递增原理,可以大致推断出他所处的大概位置,然后再查建立好的表,这里就不要再用处理器去生成了,查表时应尽量避免浮点数运算来节约时间,我们就可以精确的算法所对应的角度。试验了一下,最差的情况下差不多要消耗40个时钟周期。关于上面几个CASE的推导,可以仿造SVPWM里面推导CASE的方法,感兴趣的可以推导一下,还是蛮有意思的,千万不要糊涂。东西感觉不是很多,主要自己会的比较少,希望对大家有帮助,如果那个地方讲的不对,还请大神能及时指出,与我进行交流,我很喜欢和别人探讨