之前一直没有用MSP430G2553计算过三角函数值,一直以为MSP430单片机计算三角函数的速度应该与linux嵌入式开发板的计算速度不会有太大差别,一直以为MSP430内部会有特殊硬件辅助计算。一直觉得,既然MSP430单片机支持C语言标准库math.h,就一定可以进行sqrt(),sin(),cos()等计算。
谁知,我需要紧急使用MSP430G2553计算一个比较复杂的公式的时候,才发现MSP430G2553这款神器居然计算不了cos(float)、sin(float)等。(博主使用CSS V5开发套件,也有可能MSP430G2553是可以计算的,但是博主搞错了,所以此片文章就先假设MSP430G2553计算不了三角函数吧。)
一、测试现象
编辑一下代码并进行编译:
float tmp; tmp=1.0f; tmp=cos(tmp);
编译器成功计算,但是将tmp换为比较复杂的公式的时候,CCS就会编译报错。
二、解决办法
既然MSP430G2553无法计算,那么就只能祭出大招来计算了。简单思维后就可以发现,cos()、sin()、可以通过简单计算相互转换、而且通过弧度值(0,PI/2)的cos()、sin()计算结果可以计算出其他弧度值得cos()、sin()值。
第一招:查表法
使用EXCLE计算出(0,PI/2)范围内sin()、cos()值,保存到二位数组内。
我从搞数学的同学那里乞讨来的cos()、sin()表。
此表将(0,PI/2)等分为238等分,使用程序计算cos()、sin(),并将计算激活存储于此const double数组中。
查询办法:cos(Angle)= Cos_Table[Angle/90*238][0],sin()异同
此表具体出处不明,如果朋友知道此表出处,我定加上转载链接或者删除。
const double Cos_Table[238][2]={
{0.999999999,0},
{0.999978128,0.006613831},
{0.999912514,0.013227373},
{0.999803161,0.019840336},
{0.999650073,0.026452431},
{0.999453257,0.033063369},
{0.999212722,0.039672861},
{0.998928478,0.046280618},
{0.998600538,0.05288635},
{0.998228915,0.059489768},
{0.997813627,0.066090584},
{0.997354691,0.07268851},
{0.996852128,0.079283255},
{0.996305959,0.085874533},
{0.995716209,0.092462054},
{0.995082903,0.09904553},
{0.994406068,0.105624674},
{0.993685735,0.112199198},
{0.992921935,0.118768813},
{0.992114701,0.125333234},
{0.991264069,0.131892171},
{0.990370076,0.13844534},
{0.989432761,0.144992452},
{0.988452165,0.151533222},
{0.987428331,0.158067363},
{0.986361303,0.16459459},
{0.985251129,0.171114617},
{0.984097857,0.177627159},
{0.982901537,0.184131931},
{0.981662222,0.190628649},
{0.980379966,0.197117027},
{0.979054825,0.203596784},
{0.977686856,0.210067634},
{0.976276121,0.216529295},
{0.97482268,0.222981485},
{0.973326597,0.22942392},
{0.971787938,0.23585632},
{0.97020677,0.242278403},
{0.968583161,0.248689887},
{0.966917184,0.255090493},
{0.96520891,0.261479941},
{0.963458415,0.267857951},
{0.961665776,0.274224243},
{0.95983107,0.280578541},
{0.957954378,0.286920564},
{0.956035782,0.293250037},
{0.954075365,0.299566683},
{0.952073215,0.305870224},
{0.950029417,0.312160385},
{0.947944063,0.318436892},
{0.945817242,0.324699469},
{0.943649048,0.330947843},
{0.941439575,0.33718174},
{0.939188922,0.343400888},
{0.936897185,0.349605014},
{0.934564465,0.355793847},
{0.932190864,0.361967117},
{0.929776486,0.368124553},
{0.927321437,0.374265886},
{0.924825823,0.380390847},
{0.922289755,0.386499169},
{0.919713343,0.392590585},
{0.917096699,0.398664827},
{0.914439939,0.40472163},
{0.911743178,0.410760729},
{0.909006535,0.41678186},
{0.906230129,0.42278476},
{0.903414081,0.428769166},
{0.900558515,0.434734817},
{0.897663556,0.44068145},
{0.89472933,0.446608807},
{0.891755965,0.452516627},
{0.888743593,0.458404653},
{0.885692344,0.464272627},
{0.882602351,0.470120292},
{0.879473751,0.475947393},
{0.87630668,0.481753674},
{0.873101276,0.487538882},
{0.86985768,0.493302763},
{0.866576034,0.499045065},
{0.863256481,0.504765538},
{0.859899166,0.51046393},
{0.856504237,0.516139993},
{0.853071841,0.521793479},
{0.849602129,0.527424139},
{0.846095252,0.533031729},
{0.842551365,0.538616002},
{0.838970622,0.544176713},
{0.835353179,0.549713621},
{0.831699196,0.555226483},
{0.828008831,0.560715057},
{0.824282247,0.566179104},
{0.820519605,0.571618384},
{0.816721072,0.57703266},
{0.812886812,0.582421695},
{0.809016994,0.587785252},
{0.805111788,0.593123098},
{0.801171362,0.598434999},
{0.797195892,0.603720722},
{0.793185549,0.608980037},
{0.789140509,0.614212713},
{0.785060951,0.619418521},
{0.780947051,0.624597234},
{0.776798989,0.629748625},
{0.772616948,0.634872468},
{0.768401111,0.639968541},
{0.764151661,0.645036618},
{0.759868784,0.65007648},
{0.755552669,0.655087906},
{0.751203503,0.660070676},
{0.746821477,0.665024572},
{0.742406783,0.669949378},
{0.737959613,0.674844878},
{0.733480163,0.679710858},
{0.728968627,0.684547106},
{0.724425205,0.689353409},
{0.719850093,0.694129558},
{0.715243494,0.698875343},
{0.710605607,0.703590557},
{0.705936635,0.708274994},
{0.701236784,0.712928448},
{0.696506259,0.717550717},
{0.691745266,0.722141598},
{0.686954014,0.72670089},
{0.682132712,0.731228393},
{0.677281572,0.735723911},
{0.672400805,0.740187245},
{0.667490625,0.744618201},
{0.662551247,0.749016586},
{0.657582887,0.753382205},
{0.652585762,0.75771487},
{0.64756009,0.762014389},
{0.642506093,0.766280576},
{0.63742399,0.770513243},
{0.632314004,0.774712205},
{0.627176358,0.778877279},
{0.622011278,0.783008282},
{0.616818989,0.787105034},
{0.611599719,0.791167355},
{0.606353695,0.795195068},
{0.601081147,0.799187997},
{0.595782306,0.803145967},
{0.590457404,0.807068804},
{0.585106673,0.810956338},
{0.579730347,0.814808397},
{0.574328663,0.818624815},
{0.568901855,0.822405423},
{0.563450162,0.826150056},
{0.557973821,0.829858551},
{0.552473073,0.833530745},
{0.546948158,0.837166478},
{0.541399318,0.840765591},
{0.535826795,0.844327926},
{0.530230833,0.847853327},
{0.524611678,0.85134164},
{0.518969574,0.854792713},
{0.513304768,0.858206394},
{0.50761751,0.861582535},
{0.501908046,0.864920987},
{0.496176627,0.868221605},
{0.490423504,0.871484244},
{0.484648928,0.874708761},
{0.478853152,0.877895016},
{0.473036429,0.881042869},
{0.467199015,0.884152182},
{0.461341163,0.887222819},
{0.455463131,0.890254647},
{0.449565175,0.893247532},
{0.443647554,0.896201343},
{0.437710527,0.899115952},
{0.431754352,0.90199123},
{0.425779292,0.904827052},
{0.419785606,0.907623295},
{0.413773557,0.910379835},
{0.407743409,0.913096552},
{0.401695425,0.915773327},
{0.395629869,0.918410043},
{0.389547007,0.921006585},
{0.383447105,0.923562839},
{0.37733043,0.926078694},
{0.371197249,0.928554038},
{0.365047831,0.930988765},
{0.358882444,0.933382768},
{0.352701359,0.935735941},
{0.346504845,0.938048182},
{0.340293174,0.94031939},
{0.334066618,0.942549465},
{0.327825449,0.94473831},
{0.321569939,0.94688583},
{0.315300363,0.948991929},
{0.309016994,0.951056516},
{0.302720109,0.953079501},
{0.296409981,0.955060796},
{0.290086887,0.957000312},
{0.283751104,0.958897967},
{0.277402909,0.960753676},
{0.271042579,0.962567359},
{0.264670393,0.964338936},
{0.258286629,0.966068329},
{0.251891568,0.967755464},
{0.245485487,0.969400266},
{0.239068668,0.971002663},
{0.232641392,0.972562586},
{0.226203939,0.974079965},
{0.219756591,0.975554735},
{0.213299631,0.976986831},
{0.20683334,0.97837619},
{0.200358001,0.979722752},
{0.193873898,0.981026458},
{0.187381315,0.982287251},
{0.180880534,0.983505075},
{0.174371842,0.984679877},
{0.167855522,0.985811607},
{0.161331859,0.986900213},
{0.154801139,0.98794565},
{0.148263648,0.988947871},
{0.141719671,0.989906831},
{0.135169495,0.990822491},
{0.128613406,0.991694808},
{0.122051691,0.992523745},
{0.115484637,0.993309266},
{0.108912531,0.994051337},
{0.102335662,0.994749925},
{0.095754316,0.995404999},
{0.089168781,0.99601653},
{0.082579345,0.996584493},
{0.075986298,0.997108862},
{0.069389926,0.997589614},
{0.06279052,0.998026728},
{0.056188366,0.998420186},
{0.049583755,0.998769969},
{0.042976974,0.999076063},
{0.036368314,0.999338454},
{0.029758063,0.999557131},
{0.02314651,0.999732084},
{0.016533945,0.999863305},
{0.009920656,0.999950789},
{0.003306934,0.999994532}
};
第二招:快速傅里叶级数分解法
学过高等数学的朋友应该会会有所了解,使用傅里叶级数知识变换后可以得到正弦级数和余弦级数,那么通过编程就可以借助简单数值计算三角函数。具体理论知识大家可以问一下度娘。
原创作者:百度ID:占有≠拥有
以cos()为例:
泰勒展式:cos(x) = x^0/0!-x^2/2!+x^4/4!-x^6/6!+…+(-1)^(n-1)*x^(2n)/(2n)!+…
double cos(double x)
{
double cos=0,item=1.0,temp;
int n=0,sign=1;
do
{
temp=item;
for(int i=1;i<=2*n;i++)temp/=i; cos +=sign*temp; item*=x*x;//item=x^(2n); sign *=-1;//sign=-sign; n++; } while (temp>E);
return cos;
}
